在上一篇《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模式
這種方式風險較大速址,一旦Broker重啟或者宕機時玩焰,會導(dǎo)致整個服務(wù)不可用。不建議線上環(huán)境使用芍锚,通澄粼埃可以用于本地測試。我們在《RocketMQ:快速入門》搭建的就是單Master模式并炮。
2.2 多Master模式
一個集群無Slave默刚,全是Master,例如2個Master或者3個Master逃魄,這種模式的優(yōu)缺點如下:
- 優(yōu)點:配置簡單荤西,單個Master宕機或重啟維護對應(yīng)用無影響,在磁盤配置為RAID10時嗅钻,即使機器宕機不可恢復(fù)情況下皂冰,由于RAID10磁盤非常可靠养篓,消息也不會丟(異步刷盤丟失少量消息秃流,同步刷盤一條不丟),性能最高柳弄。
- 缺點:單臺機器宕機期間舶胀,這臺機器上未被消費的消息在機器恢復(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連上來行您,相當于一個路由控制中心。
- Broker啟動剪廉,跟所有的NameServer保持長連接娃循,定時發(fā)送心跳包。心跳包中包含當前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中獲取當前發(fā)送的Topic存在哪些Broker上,輪詢從隊列列表中選擇一個隊列队贱,然后與隊列所在的Broker建立長連接從而向Broker發(fā)消息色冀。
- Consumer跟Producer類似潭袱,跟其中一臺NameServer建立長連接柱嫌,獲取當前訂閱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默認端口 (當前集群模式可不開啟)
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
進入控制臺界面了,如下圖: