一、背景
由於公司內部所有應用都在往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運行環境
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環境了。