DEVOPS-在K8S生產集羣上構建RocketMQ集羣

一、背景

由於公司內部所有應用都在往K8S上遷移,爲了提供發佈訂閱是消息的最基本功能,決定在生產環境搭建一套RocketMQ集羣。

生產中目前所用版本爲:v4.3.2

1.1 集羣網絡架構

                       

 

如上圖所示, RocketMQ的部署結構有以下特點:

  • Name Server是一個幾乎無狀態節點,可集羣部署,節點之間無任何信息同步。
  • Broker部署相對複雜,Broker分爲Master與Slave,一個Master可以對應多個Slave,但是一個Slave只能對應一個Master,Master與Slave的對應關係通過指定相同的BrokerName,不同的BrokerId來定義,BrokerId爲0表示Master,非0表示Slave。Master也可以部署多個。每個Broker與Name Server集羣中的所有節點建立長連接,定時註冊Topic信息到所有Name Server。
  • Producer與Name Server集羣中的其中一個節點(隨機選擇)建立長連接,定期從Name Server取Topic路由信息,並向提供Topic服務的Master建立長連接,且定時向Master發送心跳。Producer完全無狀態,可集羣部署。
  • Consumer與Name Server集羣中的其中一個節點(隨機選擇)建立長連接,定期從Name Server取Topic路由信息,並向提供Topic服務的Master、Slave建立長連接,且定時向Master、Slave發送心跳。Consumer既可以從Master訂閱消息,也可以從Slave訂閱消息,訂閱規則由Broker配置決定。
  • Server。

二、集羣介紹

2.1 單個Master

  • 這種方式風險較大,一旦Broker重啓或者宕機時,會導致整個服務不可用,不建議線上環境使用。

2.2 多 Master 模式

  • 一個集羣無 Slave,全是 Master,例如 2 個 Master 或者 3 個 Master。

2.3 多 Master 多 Slave 模式,同步刷盤

  • 每個 Master 配置一個 Slave,有多對Master-Slave,HA採用同步雙寫方式,主備都寫成功,嚮應用返回成功。

2.4 多 Master 多 Slave 模式,異步刷盤

  • 每個 Master 配置一個 Slave,有多對Master-Slave,HA採用異步複製方式,主備有短暫消息延遲,毫秒級。

三、鏡像製作

3.1 name server鏡像製作

3.1.1 JAVA運行環境

JDK安裝配置,請參考CentOS7安裝JDK8

3.1.2 下載、解壓

  • 下載rocketmq-all-4.3.2
wget https://archive.apache.org/dist/rocketmq/4.3.2/rocketmq-all-4.3.2-bin-release.zip
  • 解壓 
tar -xf rocketmq-all-4.3.2-bin-release.zip

3.1.3 編寫Dockerfile

  • 拷貝rocketmq-4.3.2到容器內,啓動name server,暴露默認的9876端口

] # vim Dockerfile

FROM registry.moguyun.com/centos:7.6
MAINTAINER lijun registry.moguyun.com
ENV REFRESHED_AT 2019-12-20
ENV MQ_HOME=/opt/mq-namesrv

ADD rocketmq-all-4.3.2-bin-release $MQ_HOME

EXPOSE 9876
CMD ["sh","/opt/mq-namesrv/bin/mqnamesrv"]

3.1.4 構建,推送

  • 構建鏡像
docker build -t registry-vpc.cn-***.aliyuncs.com/moguyun-prod/common:mq-namesrv-4.3.2  .
  • 推送鏡像   
docker push registry-vpc.cn-shenzhen.aliyuncs.com/moguyun-prod/common:mq-namesrv-4.3.2

 3.2 broker鏡像製作

3.2.1 環境準備

  •   準備好JAVA環境和rocketmq-4.3.2文件夾,步驟同3.1.1~3.1.2

3.2.2 編寫Dockerfile

  • 創建指定用戶,通過指定用戶啓動服務
  • 默認name server有三例,也可以通過傳入不同的$MQ_NAMESRV來實現name server的動態配置,通過傳入不同的$MQ_BROKER_CONF來創建不同的broker。
FROM registry.moguyun.com/centos:7.6
MAINTAINER lijun registry.moguyun.com
ENV REFRESHED_AT 2019-09-30

ENV MQ_HOME /opt/mq-broker
ENV MQ_USER messageQueue
ENV MQ_NAMESRV "mq1-mg-addr:9876;mq2-mg-addr:9876;mq3-mg-addr:9876"
ENV MQ_BROKER_CONF "conf/2m-2s-async/broker-a.properties"

ADD mq-broker $MQ_HOME
WORKDIR $MQ_HOME
RUN groupadd $MQ_USER && useradd $MQ_USER -g $MQ_USER -s /sbin/nologin && \
    echo "cat /bin/sysinit.sh" >> /bin/sysinit.sh && \
    echo "chown -R $MQ_USER:$MQ_USER $MQ_HOME /home/$MQ_USER" >> /bin/sysinit.sh && \
    echo 'echo "MQ_NAMESRV=${1}" && echo "MQ_BROKER_CONF=${2}"' >> /bin/sysinit.sh && \
    echo 'su '$MQ_USER' -s /bin/bash -c "cd '$MQ_HOME'/bin ; sh mqbroker -n \"${1}\" 
    -c \"'$MQ_HOME'/${2}\" "' >> /bin/sysinit.sh && \
    chmod +x /bin/sysinit.sh

EXPOSE 10911
CMD ["sh","-c","/bin/sysinit.sh \"$MQ_NAMESRV\"  \"$MQ_BROKER_CONF\""]

3.2.3 構建,推送

  • 構建鏡像
docker build -t registry-vpc.cn-***.aliyuncs.com/moguyun-prod/common:mq-broker-4.3.2  .
  • 推送鏡像
docker push registry-vpc.cn-shenzhen.aliyuncs.com/moguyun-prod/common:mq-broker-4.3.2

四、集羣搭建

由於生產環境選取的是多Master多Slave,異步刷盤 的方案,所以我們準備創建3個name server,兩組broker,每個master配置一個slave

4.1 name server集羣搭建

4.1.1 創建無狀態【deployment】應用

  • 填入應用名稱,副本數量,應用類型

4.1.2 查看參數

  • 由於製作好的鏡像已經push到指定鏡像倉庫了
  • 在選擇mq-namesrv-4.3.2鏡像後,K8S平臺會讀取Dockerfile裏面定義好的ENV,由於name server不需要更改任何參數,直接構建應用即可

4.1.3 驗證name server是否啓動成功

1.由輸出日誌可以看出,第一個name server節點正常啓動

4.1.4 創建service

  • 創建service name爲mq1-mg-addr的service,指向的後端應用爲 mq-namesvr1
  • K8S集羣是通過service name訪問後端pod的,訪問mq1-mg-addr:9876就可以訪問後端mq-namesvr1

4.1.5 創建name server和service

  • 分別創建兩個名稱爲 mq-namesrv2,mq-namesrv3的無狀態應用
  • 分別創建兩個名稱爲 mq2-mg-addr,mq2-mg-addr的服務

4.2 broker集羣搭建

4.2.1 創建無狀態【deployment】應用

  • 填入應用名稱,副本數量,無狀態應用類型

4.2.2 傳入參數【MQ_BROKER_CONF】

  • 傳入broker-a.properties,說明創建的pod爲broker的master

  • 傳入broker-a-s.properties,說明創建的pod爲broker的slave

4.2.3 驗證broker是否啓動成功

  • 由日誌看出broker-a已經啓動成功了,不同的pod分別加載了 broker-a.properties,broker-a-s.properties配置
  • name server是mq1-mg-addr:9876;mq2-mg-addr:9876;mq3-mg-addr:9876

 

4.2.4 創建broker

  • 分別創建兩個名稱爲 mq-broker-b,mq-broker-b-s的無狀態應用
  • 分別傳入broker-a.properties,broker-b-s.properties創建

至此:RocketMQ 多Master多Slave 模式,異步刷盤集羣已經運行在阿里雲K8S環境了。

發佈了172 篇原創文章 · 獲贊 40 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章