docker-compose 部署rocketmq cluster
docker-compose 部署rocketmq cluster
製作rocketmq映象
1、下載
直接克隆官方映象製作檔案
# git clone https://github.com/apache/rocketmq-docker.git
[root@localhost rocketmq-docker-master]# ls CONTRIBUTING.md image-build LICENSE NOTICE product README.md stages stage.sh templates [root@localhost rocketmq-docker-master]# cd image-build/ [root@localhost image-build]# ls build-image-dashboard.sh build-image.sh Dockerfile-alpine Dockerfile-centos Dockerfile-centos-dashboard scripts update.sh
2、建立RocketMQ映象
構建命令: sh build-image.sh RMQ-VERSION BASE-IMAGE
可選RMQ-VERSION
例如: sh build-image.sh 4.7.0 centos (or alpine)
構建時間比較長
//構建完成
Successfully built 128108c2e50d Successfully tagged apacherocketmq/rocketmq:4.7.1-alpine [root@localhost image-build]# docker images |grep mq apacherocketmq/rocketmq 4.7.0 28ce832d84bf 59 minutes ago 533MB
3、生成配置
[root@localhost rocketmq-docker-master]# sh stage.sh 4.7.0 Stage version = 4.7.0 mkdir /root/rocketmq-docker-master/stages/4.7.0 staged templates into folder /root/rocketmq-docker-master/stages/4.7.0 [root@localhost templates]# ls data docker-compose kubernetes play-consumer.sh play-docker-compose.sh play-docker-dledger.sh play-docker.sh play-docker-tls.sh play-kubernetes.sh play-producer.sh ssl
4、部署方式
1、單機
./play-docker.sh alpine
2、docker-composer
./play-docker-compose.sh
3、kubernetes叢集
./play-kubernetes.sh
4、Cluster of Dledger storage(RocketMQ需要4.4.0版本以上)
./play-docker-dledger.sh
5、TLS
./play-docker-tls.sh
./play-producer.sh
./play-consumer.sh
我這裡選擇的是單機部署,可以看到生成了兩個容器
[root@localhost templates]# docker ps |grep mq
9a0a6ab594b7 apacherocketmq/rocketmq:4.7.0 "sh mqbroker" 56 minutes ago Up 56 minutes 0.0.0.0:10909->10909/tcp, :::10909->10909/tcp, 9876/tcp, 0.0.0.0:10911-10912->10911-10912/tcp, :::1091110912->10911-10912/tcp rmqbroker
d8a4db8335de apacherocketmq/rocketmq:4.7.0 "sh mqnamesrv" 56 minutes ago Up 56 minutes 10909/tcp, 0.0.0.0:9876->9876/tcp, :::9876->9876/tcp, 10911-10912/tcp rmqnamesrv
驗證RocketMQ啟動成功
1、使用命令 docker ps|grep rmqbroker
找到RocketMQ broker的容器id
2、使用命令 docker exec -it 9a0a6ab594b7 ./mqadmin clusterList -n 172.17.0.8:9876
驗證RocketMQ broker工作正常
[root@localhost elasticsearch]# docker exec -it 9a0a6ab594b7 ./mqadmin clusterList -n 192.168.1.204:9876
RocketMQLog:WARN No appenders could be found for logger (io.netty.util.internal.PlatformDependent0).
RocketMQLog:WARN Please initialize the logger system properly.
如需升級執行以下命令
cd image-build
./update.sh
5、安裝RocketMQ控制檯
// 拉取映象
docker pull apacherocketmq/rocketmq-console:2.0.0
// 執行容器,這裡172.15.65.xx為宿主機ip
docker run -e "JAVA_OPTS=-Drocketmq.namesrv.addr=172.15.65.xx:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" -p 6881:8080 -t apacherocketmq/rocketmq-console:2.0.0
6、映象儲存
// 映象根據私有映象倉庫重新命名 並推送到私有倉庫
docker tag IMAGEID(映象id) REPOSITORY:TAG(倉庫:標籤)
#例子
docker tag ca1b6b825289 harbor.jiuqichina.com/public/rocketmq:4.9.3
docker push harbor.jiuqichina.com/public/rocketmq:4.9.3
【RocketMQ高可用】RocketMQ 雙主雙從叢集搭建
一、叢集架構
** 描述** | |
---|---|
NameServer 叢集 | NameServer 是一個無狀態的節點,可叢集部署,節點都是各自獨立的,無任何資訊同步 |
Broker 叢集 | ① Broker 分為 Master 與 Slave,一個 Master 可以對應多個 Slave,但一個 Slave 只能對應一 個Master ② Master 與 Slave 的對應關係通過制定相同的 BrokerName,不同的 BrokerID 來定義,id 為 0 表示 Master, 非 0 表示 Slave ③ 可以部署多個 Master 實現 Broker 叢集,即多組 Master - Slaves 的 Broker 節點 ④ Master 通常用於寫入資料,Slaves 用於讀取資料 ⑤ 每個 Broker 與 NameServer 叢集中的所有節點建立長連線,定時註冊 Topic 資訊到所有 NameServer |
Producer 叢集 | ① Producer 為訊息的生產者,都是各自獨立的無狀態的節點,可以認為只要向 mq 中推送訊息的節點都算作 Producer 節點。 ② Producer 節點與 NameServer 叢集中的隨機一個節點建立長連線,定期從 NameServer 取出 Topic 路由資訊,並向提供 Topic 服務的 Master 建立長連線。且定時向 Master 傳送心跳。 |
Customer 叢集 | ① Customer 為訊息的消費者,都是各自獨立的無狀態的節點,可以認為只要向 mq 中獲取訊息的節點都算作 Customer 節點。 ② Customer 節點與 NameServer 叢集中的隨機一個節點建立長連線,定期從 NameServer 取出 Topic 路由資訊,並向提供 Topic 服務的 Master、Slave 建立長連線。且定時向 Master、Slave 傳送心跳。 ③ Customer 節點既可以從 Master 訂閱訊息,也可以從 Slave 訂閱訊息,訂閱規則由 Broker 配置決定 |
二、四種叢集模式
2.1 單 Master 模式
部署簡單,但風險較大,一旦 Broker 重啟或者宕機時,會導致服務不可用,不建議在線上環境使用,可以在本地測試
2.2 多 Master 模式
Broker 叢集中無 Slave,全是 Master
優點:
配置簡單,且單個 Master 宕機或重啟維護對應用無影響,在磁碟配置為 RAID10 時,即使機器宕機不可恢復的情況下,由於 RAID10 磁碟非常可靠,訊息也不會丟(非同步刷盤丟失少量訊息,同步刷盤一條不丟),效能最高
缺點:
單臺機器宕機期間,這臺機器上未被消費的訊息在機器恢復之前不可訂閱和消費,消費實時性會受到影響
2.3 多 Master 多 Slave 模式(非同步)
每個 Master 配置一個 Slave,有多對 Master-Slave,HA 採取非同步複製方式,主備有短暫訊息延遲(毫秒級)。即提供者將訊息傳送到 Master 後,Master 即刻返回結果給提供者。同時非同步複製到 Slave 中
優點:
即使磁碟損壞,丟失的訊息非常少,且訊息的實時性不會受到影響。且 Master 宕機後,消費者仍然可以從 Slave 消費,而且此過程對應用透明,不需要人工干預,效能同多 Master 模式幾乎一樣
缺點:
Master 宕機,磁碟損壞的情況下會丟失少量訊息
2.4 多 Master 多 Slave 模式(同步)
每個Master配置一個Slave,有多對Master-Slave,HA採用同步雙寫方式,即只有主備都寫成功,才嚮應用返回成功。即提供者將訊息傳送到 Master後,Master 要將這條訊息同步到所有的 Slave 上,同步全部完成後,才會返回結果給提供者。
優點:
資料與服務都無單點故障,在 Master 宕機的情況下訊息無延遲,服務可用性與資料可用性都非常高
訊息安全高,高可用性
缺點:
效能比非同步複製模式略低(約低10%左右),傳送單個訊息的RT會略高,且在主節點宕機後,備機不能自動切換為主機,需要人為干涉
三、雙主雙從叢集搭建
3.1 總體架構圖
雙主雙從叢集(2m-2s)同步雙寫方式,即使用兩組 Master-Slave 形成叢集
3.2 工作流程
1)啟動NameServer,NameServer起來後監聽埠,等待Broker、Producer、Consumer連上來,相當於一個路由控制中心。
2)Broker啟動,跟所有的NameServer保持長連線,定時傳送心跳包。心跳包中包含當前Broker資訊(IP+埠等)以及儲存所有Topic資訊。註冊成功後,NameServer叢集中就有Topic跟Broker的對映關係。
3)收發訊息前,先建立Topic,建立Topic時需要指定該Topic要儲存在哪些Broker上,也可以在傳送訊息時自動建立Topic。
4)Producer傳送訊息,啟動時先跟NameServer叢集中的其中一臺建立長連線,並從NameServer中獲取當前傳送的Topic存在哪些Broker上,輪詢從佇列列表中選擇一個佇列,然後與佇列所在的Broker建立長連線從而向Broker發訊息。
5)Consumer跟Producer類似,跟其中一臺NameServer建立長連線,獲取當前訂閱Topic存在哪些Broker上,然後直接跟Broker建立連線通道,開始消費訊息。
3.3 雙主雙從叢集搭建流程
在實際工作中,應只對外暴露需要被外部訪問的埠。
-
nameserver: 預設使用 9876 埠
-
master: 預設使用 10911 埠
-
slave: 預設使用 11011 埠
本次部署採用兩臺伺服器搭建:
-
server01: 192.168.1.206
- nameserver-:9876
- broker-a:10911
- broker-b-s:11011
-
server01: 192.168.1.199
-
nameserver:9876
-
broker-a-s:10911
-
broker-b:11011
-
序號 | IP | 角色 | 架構模式 |
---|---|---|---|
server01 | 192.168.1.206 | nameserver、broker-a、broker-b-s | Master1、Slave2 |
server02 | 192.168.1.199 | nameserver、broker-b、broker-a-s | Master2、Slave1 |
建立配置儲存路徑:
注意:logs 目錄和store目錄的許可權 否則會啟動不成功
server01:
mkdir -p data/{broker-a/conf,broker-a/logs,broker-a/store,broker-b-s/conf,broker-b-s/logs,/broker-b-s/store}
server02:
mkdir -p data/{broker-b/conf,broker-b/logs,broker-b/store,broker-a-s/conf,broker-a-s/logs,/broker-a-s/store}
1)Master01配置(192.168.1.206)
-
在192.168.1.206機器上的Master Broker的配置檔案broker-a.conf
vim data/broker-a/conf/broker-a.conf
檔案內容:
# 叢集名稱 brokerClusterName=jiuqidev-cluster # broker 名稱,注意 master與slave名稱一致才能正確匹配 brokerName=broker-a # brokerid 0= master 0> 表示slave brokerId=0 # 刪除檔案時間點,預設凌晨 4點 deleteWhen=04 # 檔案保留時間,預設 48 小時 fileReservedTime=120 # Broker 的角色 # - ASYNC_MASTER 非同步複製Master # - SYNC_MASTER 同步雙寫Master # - SLAVE brokerRole=ASYNC_MASTER # 刷盤方式 # - ASYNC_FLUSH 非同步刷盤 # - SYNC_FLUSH 同步刷盤 flushDiskType=ASYNC_FLUSH # 監聽埠 listenPort=10911 # 設定broker 節點IP地址 brokerIP1=192.168.1.206 # 是否允許 Broker 自動建立Topic,生產建議關閉 預設開啟 autoCreateTopicEnable=true # 是否允許 Broker 自動建立訂閱組,生產建議關閉 預設開啟 autoCreateSubscriptionGroup=true
-
在192.168.1.206機器上的Slave Broker的配置檔案broker-b-s.conf
vim data/broker-b-s/conf/broker-b-s.conf
檔案內容:
# 叢集名稱 brokerClusterName=jiuqidev-cluster # broker 名稱,注意 master與slave名稱一致才能正確匹配 brokerName=broker-b # brokerid 0= master 0> 表示slave brokerId=1 # 刪除檔案時間點,預設凌晨 4點 deleteWhen=04 # 檔案保留時間,預設 48 小時 fileReservedTime=120 # Broker 的角色 # - ASYNC_MASTER 非同步複製Master # - SYNC_MASTER 同步雙寫Master # - SLAVE brokerRole=SLAVE # 刷盤方式 # - ASYNC_FLUSH 非同步刷盤 # - SYNC_FLUSH 同步刷盤 flushDiskType=ASYNC_FLUSH # 監聽埠 與master節點保持一致 listenPort=11011 # 設定broker 節點IP地址 brokerIP1=192.168.1.206 # 是否允許 Broker 自動建立Topic,生產建議關閉 預設開啟 autoCreateTopicEnable=true # 是否允許 Broker 自動建立訂閱組,生產建議關閉 預設開啟 autoCreateSubscriptionGroup=true
-
在192.168.1.206上啟動docker-compose檔案
vim docker-compose.yml
檔案內容(根據官方docker-compose部署檔案修改):
version: '2' services: #Service for nameserver namesrv: image: harbor.jiuqichina.com/public/rocketmq:4.9.3 container_name: rmqnamesrv ports: - 9876:9876 volumes: - ./data/namesrv/logs:/home/rocketmq/logs command: sh mqnamesrv #Service for broker broker-a: image: harbor.jiuqichina.com/public/rocketmq:4.9.3 container_name: rmqbroker-a # master不採用host模式會有slave同步失敗的問題。待解決 network_mode: "host" #ports: # - 10909:10909 # - 10911:10911 # - 10912:10912 environment: NAMESRV_ADDR: "192.168.1.206:9876;192.168.1.199:9876" # 設定broker啟動的jvm引數,預設8G或者系統記憶體的1/4 否則會報記憶體不足無法啟動 JAVA_OPT_EXT: "-server -Xms256m -Xmx256m -Xmn256m" volumes: - ./data/broker-a/logs:/home/rocketmq/logs - ./data/broker-a/store:/home/rocketmq/store - ./data/broker-a/conf/broker-a.conf:/opt/rocketmq-4.9.3/conf/broker-a.conf command: sh mqbroker -c /opt/rocketmq-4.9.3/conf/broker-a.conf broker-b-s: image: harbor.jiuqichina.com/public/rocketmq:4.9.3 container_name: rmqbroker-b-s network_mode: "host" #ports: # - 11009:11009 # - 11011:11011 # - 11012:11012 environment: NAMESRV_ADDR: "192.168.1.206:9876;192.168.1.199:9876" JAVA_OPT_EXT: "-server -Xms256m -Xmx256m -Xmn256m" volumes: - ./data/broker-b-s/logs:/home/rocketmq/logs - ./data/broker-b-s/store:/home/rocketmq/store - ./data/broker-b-s/conf/broker-b-s.conf:/opt/rocketmq-4.9.3/conf/broker-b-s.conf command: sh mqbroker -c /opt/rocketmq-4.9.3/conf/broker-b-s.conf # Service for console rocketmq-console: image: apacherocketmq/rocketmq-dashboard:1.0.0 #image: apacherocketmq/rocketmq-console:2.0.0 container_name: rocketmq-console ports: - 6881:8080 environment: JAVA_OPTS: "-Drocketmq.namesrv.addr=192.168.1.206:9876;192.168.1.199:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false"
2)Master02配置(192.168.1.199)
-
在192.168.1.199 機器上的Master Broker的配置檔案broker-b.conf
vim data/broker-b/conf/broker-b.conf
檔案內容:
# 叢集名稱 brokerClusterName=jiuqidev-cluster # broker 名稱,注意 master與slave名稱一致才能正確匹配 brokerName=broker-b # brokerid 0= master 0> 表示slave brokerId=0 # 刪除檔案時間點,預設凌晨 4點 deleteWhen=04 # 檔案保留時間,預設 48 小時 fileReservedTime=120 # Broker 的角色 # - ASYNC_MASTER 非同步複製Master # - SYNC_MASTER 同步雙寫Master # - SLAVE brokerRole=ASYNC_MASTER # 刷盤方式 # - ASYNC_FLUSH 非同步刷盤 # - SYNC_FLUSH 同步刷盤 flushDiskType=ASYNC_FLUSH # 監聽埠 listenPort=11011 # 設定broker 節點IP地址 brokerIP1=192.168.1.199 # 是否允許 Broker 自動建立Topic,生產建議關閉 預設開啟 autoCreateTopicEnable=true # 是否允許 Broker 自動建立訂閱組,生產建議關閉 預設開啟 autoCreateSubscriptionGroup=true
-
在192.168.1.199機器上的Slave Broker的配置檔案broker-a-s.conf
vim data/broker-a-s/conf/broker-a-s.conf
檔案內容:
# 叢集名稱 brokerClusterName=jiuqidev-cluster # broker 名稱,注意 master與slave名稱一致才能正確匹配 brokerName=broker-a # brokerid 0= master 0> 表示slave brokerId=1 # 刪除檔案時間點,預設凌晨 4點 deleteWhen=04 # 檔案保留時間,預設 48 小時 fileReservedTime=120 # Broker 的角色 # - ASYNC_MASTER 非同步複製Master # - SYNC_MASTER 同步雙寫Master # - SLAVE brokerRole=SLAVE # 刷盤方式 # - ASYNC_FLUSH 非同步刷盤 # - SYNC_FLUSH 同步刷盤 flushDiskType=ASYNC_FLUSH # 監聽埠 與master節點保持一致 listenPort=10911 # 設定broker 節點IP地址 brokerIP1=192.168.1.199 # 是否允許 Broker 自動建立Topic,生產建議關閉 預設開啟 autoCreateTopicEnable=true # 是否允許 Broker 自動建立訂閱組,生產建議關閉 預設開啟 autoCreateSubscriptionGroup=true
-
在192.168.1.199上啟動docker-compose檔案
vim docker-compose.yml
檔案內容(根據官方docker-compose部署檔案修改):
version: '2' services: #Service for nameserver namesrv: image: harbor.jiuqichina.com/public/rocketmq:4.9.3 container_name: rmqnamesrv ports: - 9876:9876 volumes: - ./data/namesrv/logs:/home/rocketmq/logs command: sh mqnamesrv #Service for broker broker-b: image: harbor.jiuqichina.com/public/rocketmq:4.9.3 container_name: rmqbroker-b network_mode: "host" #ports: # - 11009:11009 # - 11011:11011 # - 11012:11012 environment: - NAMESRV_ADDR=192.168.1.206:9876;192.168.1.199:9876 - JAVA_OPT_EXT=-server -Xms256m -Xmx256m -Xmn256m volumes: - ./data/broker-b/logs:/home/rocketmq/logs - ./data/broker-b/store:/home/rocketmq/store - ./data/broker-b/conf/broker-b.conf:/opt/rocketmq-4.9.3/conf/broker-b.conf command: sh mqbroker -c /opt/rocketmq-4.9.3/conf/broker-b.conf #command: "tail -f /dev/null" broker-a-s: image: harbor.jiuqichina.com/public/rocketmq:4.9.3 container_name: rmqbroker-a-s network_mode: "host" #ports: # - 10909:10909 # - 10911:10911 # - 10912:10912 environment: - NAMESRV_ADDR=192.168.1.206:9876;192.168.1.199:9876 - JAVA_OPT_EXT=-server -Xms256m -Xmx256m -Xmn256m volumes: - ./data/broker-a-s/logs:/home/rocketmq/logs - ./data/broker-a-s/store:/home/rocketmq/store - ./data/broker-a-s/conf/broker-a-s.conf:/opt/rocketmq-4.9.3/conf/broker-a-s.conf command: sh mqbroker -c /opt/rocketmq-4.9.3/conf/broker-a-s.conf
3.4 啟動叢集
-
server01 執行命令:
docker-compose up -d
-
server02 執行命令:
docker-compose up -d
開啟dashboard地址(http://192.168.1.206:6881/)檢視:
參考文件:
https://blog.csdn.net/qq_34416331/article/details/107336391