在上一篇《RocketMQ:快速入門》之后,今天說一說如何搭建RocketMQ集群。首先看一下集群架構(gòu)圖:

1. 集群特點
- NameServer是一個幾乎無狀態(tài)節(jié)點,可集群部署,節(jié)點之間無任何信息同步。
- Broker部署相對復(fù)雜,Broker分為Master與Slave,一個Master可以對應(yīng)多個Slave,但是一個Slave只能對應(yīng)一個Master,Master與Slave的對應(yīng)關(guān)系通過指定相同的BrokerName。不同的BrokerId來定義,BrokerId為0表示Master,非0表示Slave。Master也可以部署多個。每個Broker與NameServer集群中的所有節(jié)點建立長連接,定時注冊Topic信息到所有NameServer。
- Producer與NameServer集群中的其中一個節(jié)點(隨機選擇)建立長連接,定期從NameServer取Topic路由信息,并向提供Topic服務(wù)的Master建立長連接,且定時向Master發(fā)送心跳。Producer完全無狀態(tài),可集群部署。
- Consumer與NameServer集群中的其中一個節(jié)點(隨機選擇)建立長連接,定期從NameServer取Topic路由信息,并向提供Topic服務(wù)的Master、Slave建立長連接,且定時向Master、Slave發(fā)送心跳。Consumer既可以從Master訂閱消息,也可以從Slave訂閱消息,訂閱規(guī)則由Broker配置決定。
2. 集群模式
2.1 單Master模式
這種方式風(fēng)險較大,一旦Broker重啟或者宕機時,會導(dǎo)致整個服務(wù)不可用。不建議線上環(huán)境使用,通??梢杂糜诒镜販y試。我們在《RocketMQ:快速入門》搭建的就是單Master模式。
2.2 多Master模式
一個集群無Slave,全是Master,例如2個Master或者3個Master,這種模式的優(yōu)缺點如下:
- 優(yōu)點:配置簡單,單個Master宕機或重啟維護對應(yīng)用無影響,在磁盤配置為RAID10時,即使機器宕機不可恢復(fù)情況下,由于RAID10磁盤非??煽浚⒁膊粫G(異步刷盤丟失少量消息,同步刷盤一條不丟),性能最高。
- 缺點:單臺機器宕機期間,這臺機器上未被消費的消息在機器恢復(fù)之前不可訂閱,消息實時性會受到影響。
2.3 多Master多Slave模式(異步)
每個Master配置一個Slave,有多對Master-Slave,HA采用異步復(fù)制方式,主備有短暫消息延遲(毫秒級),這種模式的優(yōu)缺點如下:
- 優(yōu)點:即使磁盤損壞,消息丟失的非常少,且消息實時性不會受影響,同時Master宕機后,消費者仍然可以從Slave消費,而且此過程對應(yīng)用透明,不需要人工干預(yù),性能同多Master模式幾乎一樣。
- 缺點:Master宕機,磁盤損壞情況下會丟失少量消息。
2.4 多Master多Slave模式(同步)
每個Master配置一個Slave,有多對Master-Slave,HA采用同步雙寫方式,即只有主備都寫成功,才向應(yīng)用返回成功,這種模式的優(yōu)缺點如下:
- 優(yōu)點:數(shù)據(jù)與服務(wù)都無單點故障,Master宕機情況下,消息無延遲,服務(wù)可用性與數(shù)據(jù)可用性都非常高。
- 缺點:性能比異步復(fù)制模式略低(大約低10%左右),發(fā)送單個消息的RT會略高,且目前版本在主節(jié)點宕機后,備機不能自動切換為主機。
3. 雙主雙從同步雙寫集群搭建
3.1 總體架構(gòu)

3.2 集群工作流程
- 啟動NameServer,NameServer起來后監(jiān)聽端口,等待Broker、Producer、Consumer連上來,相當(dāng)于一個路由控制中心。
- Broker啟動,跟所有的NameServer保持長連接,定時發(fā)送心跳包。心跳包中包含當(dāng)前Broker信息(IP+端口等)以及存儲所有Topic信息。注冊成功后,NameServer集群中就有Topic跟Broker的映射關(guān)系。
- 收發(fā)消息前,先創(chuàng)建Topic,創(chuàng)建Topic時需要指定該Topic要存儲在哪些Broker上,也可以在發(fā)送消息時自動創(chuàng)建Topic。
- Producer發(fā)送消息,啟動時先跟NameServer集群中的其中一臺建立長連接,并從NameServer中獲取當(dāng)前發(fā)送的Topic存在哪些Broker上,輪詢從隊列列表中選擇一個隊列,然后與隊列所在的Broker建立長連接從而向Broker發(fā)消息。
- Consumer跟Producer類似,跟其中一臺NameServer建立長連接,獲取當(dāng)前訂閱Topic存在哪些Broker上,然后直接跟Broker建立連接通道,開始消費消息。
3.3 服務(wù)器環(huán)境
| 主機名 | 主機ip | 角色(端口) |
|---|---|---|
| node1 | 192.168.1.19 | rocketmq-ns1(9876) rocketmq-bs-m1(10911) |
| node2 | 192.168.1.20 | rocketmq-ns2(9876) rocketmq-bs-m2(10911) rocketmq-bs-s1(11011) |
| node3 | 192.168.1.21 | rocketmq-ns3(9876) rocketmq-bs-s2(10911) rockermq-console(8080) |
3.4 修改host配置
使用vim命令編輯/etc/hosts文件,添加以下配置:
##################### begin rocketmq #####################
# nameserver
192.168.1.19 rocketmq-ns1
192.168.1.20 rocketmq-ns2
192.168.1.21 rocketmq-ns3
# broker
192.168.1.19 rocketmq-bs-m1
192.168.1.20 rocketmq-bs-m2 rocketmq-bs-s1
192.168.1.21 rocketmq-bs-s2
##################### end rocketmq #####################
配置完成后,重啟網(wǎng)卡:
systemctl restart network
3.5 防火墻配置
宿主機需要遠程訪問虛擬機的rocketmq服務(wù)和web服務(wù),需要開放相關(guān)的端口號,簡單粗暴的方式是直接關(guān)閉防火墻。
# 關(guān)閉防火墻
systemctl stop firewalld.service
# 查看防火墻的狀態(tài)
firewall-cmd --state
# 禁止firewall開機啟動
systemctl disable firewalld.service
或者為了安全,只開放特定的端口號,RocketMQ默認使用3個端口:9876 、10911 、11011 。如果防火墻沒有關(guān)閉的話,那么防火墻就必須開放這些端口:
-
nameserver默認使用 9876 端口 -
master默認使用 10911 端口 -
slave默認使用11011 端口
執(zhí)行以下命令:
# 開放name server默認端口
firewall-cmd --remove-port=9876/tcp --permanent
# 開放master默認端口
firewall-cmd --remove-port=10911/tcp --permanent
# 開放slave默認端口 (當(dāng)前集群模式可不開啟)
firewall-cmd --remove-port=11011/tcp --permanent
# 重啟防火墻
firewall-cmd --reload
3.6 配置環(huán)境變量
使用vim命令編輯/etc/profile文件,添加以下配置:
# rocketmq env
export ROCKETMQ_HOME=/usr/local/rocketmq/rocketmq-all-4.4.0-bin-release
export PATH=$PATH:$ROCKETMQ_HOME/bin
配置完成后,生效配置:
source /etc/profile
3.7 創(chuàng)建消息存儲路徑
# node1
mkdir /usr/local/rocketmq/store/master1
mkdir /usr/local/rocketmq/store/master1/commitlog
mkdir /usr/local/rocketmq/store/master1/consumequeue
mkdir /usr/local/rocketmq/store/master1/index
# node2
mkdir /usr/local/rocketmq/store/master2
mkdir /usr/local/rocketmq/store/master2/commitlog
mkdir /usr/local/rocketmq/store/master2/consumequeue
mkdir /usr/local/rocketmq/store/master2/index
mkdir /usr/local/rocketmq/store/master1-slave1
mkdir /usr/local/rocketmq/store/master1-slave1/commitlog
mkdir /usr/local/rocketmq/store/master1-slave1/consumequeue
mkdir /usr/local/rocketmq/store/master1-slave1/index
# node3
mkdir /usr/local/rocketmq/store/master2-slave1
mkdir /usr/local/rocketmq/store/master2-slave1/commitlog
mkdir /usr/local/rocketmq/store/master2-slave1/consumequeue
mkdir /usr/local/rocketmq/store/master2-slave1/index
3.8 Broker配置文件
3.8.1 master1的配置
服務(wù)器:node1(192.168.1.19)
vim /usr/local/rocketmq/conf/2m-2s-sync/master1.properties
配置如下:
#所屬集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此處不同的配置文件填寫的不一樣
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer地址,多個之間用分號分割
namesrvAddr=rocketmq-ns1:9876;rocketmq-ns2:9876;rocketmq-ns3:9876
#在發(fā)送消息時,自動創(chuàng)建服務(wù)器不存在的topic,默認創(chuàng)建的隊列數(shù)
defaultTopicQueueNums=4
#是否允許 Broker 自動創(chuàng)建Topic,建議線下開啟,線上關(guān)閉
autoCreateTopicEnable=true
#是否允許 Broker 自動創(chuàng)建訂閱組,建議線下開啟,線上關(guān)閉
autoCreateSubscriptionGroup=true
#Broker 對外服務(wù)的監(jiān)聽端口
listenPort=10911
#刪除文件時間點,默認凌晨 4點
deleteWhen=04
#文件保留時間,默認 48 小時
fileReservedTime=120
#commitLog每個文件的大小默認1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每個文件默認存30W條,根據(jù)業(yè)務(wù)情況調(diào)整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#檢測物理文件磁盤空間
diskMaxUsedSpaceRatio=88
#存儲路徑
storePathRootDir=/usr/local/rocketmq/store/master1
#commitLog 存儲路徑
storePathCommitLog=/usr/local/rocketmq/store/master1/commitlog
#消費隊列存儲路徑存儲路徑
storePathConsumeQueue=/usr/local/rocketmq/store/master1/consumequeue
#消息索引存儲路徑
storePathIndex=/usr/local/rocketmq/store/master1/index
#checkpoint 文件存儲路徑
storeCheckpoint=/usr/local/rocketmq/store/master1/checkpoint
#abort 文件存儲路徑
abortFile=/usr/local/rocketmq/store/master1/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 異步復(fù)制Master
#- SYNC_MASTER 同步雙寫Master
#- SLAVE
brokerRole=SYNC_MASTER
#刷盤方式
#- ASYNC_FLUSH 異步刷盤
#- SYNC_FLUSH 同步刷盤
flushDiskType=SYNC_FLUSH
#checkTransactionMessageEnable=false
#發(fā)消息線程池數(shù)量
#sendMessageThreadPoolNums=128
#拉消息線程池數(shù)量
#pullMessageThreadPoolNums=128
3.8.2 master1-slave1的配置
服務(wù)器:node2(192.168.1.20)
vim /usr/local/rocketmq/conf/2m-2s-sync/master1-slave1.properties
配置如下:
#所屬集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此處不同的配置文件填寫的不一樣
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=1
#nameServer地址,分號分割
namesrvAddr=rocketmq-ns1:9876;rocketmq-ns2:9876;rocketmq-ns3:9876
#在發(fā)送消息時,自動創(chuàng)建服務(wù)器不存在的topic,默認創(chuàng)建的隊列數(shù)
defaultTopicQueueNums=4
#是否允許 Broker 自動創(chuàng)建Topic,建議線下開啟,線上關(guān)閉
autoCreateTopicEnable=true
#是否允許 Broker 自動創(chuàng)建訂閱組,建議線下開啟,線上關(guān)閉
autoCreateSubscriptionGroup=true
#Broker 對外服務(wù)的監(jiān)聽端口
listenPort=11011
#刪除文件時間點,默認凌晨 4點
deleteWhen=04
#文件保留時間,默認 48 小時
fileReservedTime=120
#commitLog每個文件的大小默認1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每個文件默認存30W條,根據(jù)業(yè)務(wù)情況調(diào)整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#檢測物理文件磁盤空間
diskMaxUsedSpaceRatio=88
#存儲路徑
storePathRootDir=/usr/local/rocketmq/store/master1-slave1
#commitLog 存儲路徑
storePathCommitLog=/usr/local/rocketmq/store/master1-slave1/commitlog
#消費隊列存儲路徑存儲路徑
storePathConsumeQueue=/usr/local/rocketmq/store/master1-slave1/consumequeue
#消息索引存儲路徑
storePathIndex=/usr/local/rocketmq/store/master1-slave1/index
#checkpoint 文件存儲路徑
storeCheckpoint=/usr/local/rocketmq/store/master1-slave1/checkpoint
#abort 文件存儲路徑
abortFile=/usr/local/rocketmq/store/master1-slave1/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 異步復(fù)制Master
#- SYNC_MASTER 同步雙寫Master
#- SLAVE
brokerRole=SLAVE
#刷盤方式
#- ASYNC_FLUSH 異步刷盤
#- SYNC_FLUSH 同步刷盤
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#發(fā)消息線程池數(shù)量
#sendMessageThreadPoolNums=128
#拉消息線程池數(shù)量
#pullMessageThreadPoolNums=128
3.8.3 master2的配置
服務(wù)器:node2(192.168.1.20)
vim /usr/local/rocketmq/conf/2m-2s-sync/master2.properties
配置如下:
#所屬集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此處不同的配置文件填寫的不一樣
brokerName=broker-b
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer地址,分號分割
namesrvAddr=rocketmq-ns1:9876;rocketmq-ns2:9876;rocketmq-ns3:9876
#在發(fā)送消息時,自動創(chuàng)建服務(wù)器不存在的topic,默認創(chuàng)建的隊列數(shù)
defaultTopicQueueNums=4
#是否允許 Broker 自動創(chuàng)建Topic,建議線下開啟,線上關(guān)閉
autoCreateTopicEnable=true
#是否允許 Broker 自動創(chuàng)建訂閱組,建議線下開啟,線上關(guān)閉
autoCreateSubscriptionGroup=true
#Broker 對外服務(wù)的監(jiān)聽端口
listenPort=10911
#刪除文件時間點,默認凌晨 4點
deleteWhen=04
#文件保留時間,默認 48 小時
fileReservedTime=120
#commitLog每個文件的大小默認1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每個文件默認存30W條,根據(jù)業(yè)務(wù)情況調(diào)整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#檢測物理文件磁盤空間
diskMaxUsedSpaceRatio=88
#存儲路徑(注意,如果在一臺機器上啟動多個broker,這個路徑要區(qū)分開)
storePathRootDir=/usr/local/rocketmq/store/master2
#commitLog 存儲路徑
storePathCommitLog=/usr/local/rocketmq/store/master2/commitlog
#消費隊列存儲路徑存儲路徑
storePathConsumeQueue=/usr/local/rocketmq/store/master2/consumequeue
#消息索引存儲路徑
storePathIndex=/usr/local/rocketmq/store/master2/index
#checkpoint 文件存儲路徑
storeCheckpoint=/usr/local/rocketmq/store/master2/checkpoint
#abort 文件存儲路徑
abortFile=/usr/local/rocketmq/store/master2/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 異步復(fù)制Master
#- SYNC_MASTER 同步雙寫Master
#- SLAVE
brokerRole=SYNC_MASTER
#刷盤方式
#- ASYNC_FLUSH 異步刷盤
#- SYNC_FLUSH 同步刷盤
flushDiskType=SYNC_FLUSH
#checkTransactionMessageEnable=false
#發(fā)消息線程池數(shù)量
#sendMessageThreadPoolNums=128
#拉消息線程池數(shù)量
#pullMessageThreadPoolNums=128
3.8.4 master2-slave1的配置
服務(wù)器:node3(192.168.1.21)
vim /usr/local/rocketmq/conf/2m-2s-sync/master2-slave1.properties
配置如下:
#所屬集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此處不同的配置文件填寫的不一樣
brokerName=broker-b
#0 表示 Master,>0 表示 Slave
brokerId=1
#nameServer地址,分號分割
namesrvAddr=rocketmq-ns1:9876;rocketmq-ns2:9876;rocketmq-ns3:9876
#在發(fā)送消息時,自動創(chuàng)建服務(wù)器不存在的topic,默認創(chuàng)建的隊列數(shù)
defaultTopicQueueNums=4
#是否允許 Broker 自動創(chuàng)建Topic,建議線下開啟,線上關(guān)閉
autoCreateTopicEnable=true
#是否允許 Broker 自動創(chuàng)建訂閱組,建議線下開啟,線上關(guān)閉
autoCreateSubscriptionGroup=true
#Broker 對外服務(wù)的監(jiān)聽端口
listenPort=10911
#刪除文件時間點,默認凌晨 4點
deleteWhen=04
#文件保留時間,默認 48 小時
fileReservedTime=120
#commitLog每個文件的大小默認1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每個文件默認存30W條,根據(jù)業(yè)務(wù)情況調(diào)整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#檢測物理文件磁盤空間
diskMaxUsedSpaceRatio=88
#存儲路徑
storePathRootDir=/usr/local/rocketmq/store/master2-slave1
#commitLog 存儲路徑
storePathCommitLog=/usr/local/rocketmq/store/master2-slave1/commitlog
#消費隊列存儲路徑存儲路徑
storePathConsumeQueue=/usr/local/rocketmq/store/master2-slave1/consumequeue
#消息索引存儲路徑
storePathIndex=/usr/local/rocketmq/store/master2-slave1/index
#checkpoint 文件存儲路徑
storeCheckpoint=/usr/local/rocketmq/store/master2-slave1/checkpoint
#abort 文件存儲路徑
abortFile=/usr/local/rocketmq/store/master2-slave1/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 異步復(fù)制Master
#- SYNC_MASTER 同步雙寫Master
#- SLAVE
brokerRole=SLAVE
#刷盤方式
#- ASYNC_FLUSH 異步刷盤
#- SYNC_FLUSH 同步刷盤
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#發(fā)消息線程池數(shù)量
#sendMessageThreadPoolNums=128
#拉消息線程池數(shù)量
#pullMessageThreadPoolNums=128
3.9 修改啟動腳本
根據(jù)實際情況,修改/bin/runbroker.sh和/bin/runserver.sh腳本的JVM參數(shù),參考配置如下:
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
3.10 啟動服務(wù)
3.10.1 啟動NameServer集群
分別在三臺機器上啟動NameServer服務(wù):
nohup sh bin/mqnamesrv &
3.10.2 啟動Broker集群
- 在
node1上啟動master1:
nohup sh bin/mqbroker -c /usr/local/rocketmq/conf/2m-2s-sync/master1.properties &
- 在
node2上啟動master1-slave1和master2
nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-sync/master1-slave1.properties &
nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-sync/master2.properties &
- 在
node3上啟動master2-slave1
nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-sync/master2-slave1.properties &
3.11 查看進程狀態(tài)
啟動后通過jps命令查看進程狀態(tài),至此一個雙主雙從,同步雙寫的集群搭建完成。
4. 集群監(jiān)控平臺搭建
4.1 概述
RocketMQ有一個對其擴展的開源項目rocketmq-externals,這個項目中有一個子模塊叫rocketmq-console,這個便是管理控制臺項目了,先將rocketmq-externals拉到本地,因為我們需要自己對rocketmq-console進行編譯打包運行。
4.2 下載并編譯打包
下載地址:https://github.com/apache/rocketmq-externals
注意:打包前在rocketmq-console中配置namesrv集群地址:
rocketmq.config.namesrvAddr=rocketmq-ns1:9876;rocketmq-ns2:9876;rocketmq-ns3:9876
編譯打包:
git clone https://github.com/apache/rocketmq-externals
cd rocketmq-console
mvn clean package -Dmaven.test.skip=true
在node3這臺服務(wù)器上啟動rocketmq-console:
java -jar rocketmq-console-ng-1.0.1.jar
啟動成功后,我們就可以通過瀏覽器訪問http://192.168.1.21:8080進入控制臺界面了,如下圖:

