3. RocketMQ集群搭建
3.1 各角色介紹
- Producer:消息的發(fā)送者囚似;舉例:發(fā)信者
- Consumer:消息接收者拜鹤;舉例:收信者
- Broker:暫存和傳輸消息灾测;舉例:郵局
- NameServer:管理Broker;舉例:各個郵局的管理機(jī)構(gòu)
- Topic:區(qū)分消息的種類禁熏;一個發(fā)送者可以發(fā)送消息給一個或者多個Topic壤巷;一個消息的接收者可以訂閱一個或者多個Topic消息
-
Message Queue:相當(dāng)于是Topic的分區(qū);用于并行發(fā)送和接收消息
image.png
3.2 集群搭建方式
3.2.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é)點(隨機(jī)選擇)建立長連接渗鬼,定期從NameServer取Topic路由信息,并向提供Topic服務(wù)的Master建立長連接荧琼,且定時向Master發(fā)送心跳譬胎。Producer完全無狀態(tài),可集群部署命锄。
Consumer與NameServer集群中的其中一個節(jié)點(隨機(jī)選擇)建立長連接堰乔,定期從NameServer取Topic路由信息,并向提供Topic服務(wù)的Master脐恩、Slave建立長連接镐侯,且定時向Master、Slave發(fā)送心跳驶冒。Consumer既可以從Master訂閱消息苟翻,也可以從Slave訂閱消息,訂閱規(guī)則由Broker配置決定骗污。
3.2.3 集群模式
1)單Master模式
這種方式風(fēng)險較大崇猫,一旦Broker重啟或者宕機(jī)時,會導(dǎo)致整個服務(wù)不可用需忿。不建議線上環(huán)境使用,可以用于本地測試诅炉。
2)多Master模式
一個集群無Slave,全是Master贴谎,例如2個Master或者3個Master汞扎,這種模式的優(yōu)缺點如下:
- 優(yōu)點:配置簡單季稳,單個Master宕機(jī)或重啟維護(hù)對應(yīng)用無影響擅这,在磁盤配置為RAID10時,即使機(jī)器宕機(jī)不可恢復(fù)情況下景鼠,由于RAID10磁盤非持亵幔可靠,消息也不會丟(異步刷盤丟失少量消息铛漓,同步刷盤一條不丟)溯香,性能最高;
- 缺點:單臺機(jī)器宕機(jī)期間浓恶,這臺機(jī)器上未被消費的消息在機(jī)器恢復(fù)之前不可訂閱玫坛,消息實時性會受到影響。
3)多Master多Slave模式(異步)
每個Master配置一個Slave包晰,有多對Master-Slave湿镀,HA采用異步復(fù)制方式炕吸,主備有短暫消息延遲(毫秒級),這種模式的優(yōu)缺點如下:
- 優(yōu)點:即使磁盤損壞勉痴,消息丟失的非常少赫模,且消息實時性不會受影響,同時Master宕機(jī)后蒸矛,消費者仍然可以從Slave消費瀑罗,而且此過程對應(yīng)用透明,不需要人工干預(yù)雏掠,性能同多Master模式幾乎一樣斩祭;
- 缺點:Master宕機(jī),磁盤損壞情況下會丟失少量消息磁玉。
4)多Master多Slave模式(同步)
每個Master配置一個Slave停忿,有多對Master-Slave,HA采用同步雙寫方式蚊伞,即只有主備都寫成功席赂,才向應(yīng)用返回成功,這種模式的優(yōu)缺點如下:
- 優(yōu)點:數(shù)據(jù)與服務(wù)都無單點故障时迫,Master宕機(jī)情況下颅停,消息無延遲,服務(wù)可用性與數(shù)據(jù)可用性都非常高掠拳;
- 缺點:性能比異步復(fù)制模式略低(大約低10%左右)癞揉,發(fā)送單個消息的RT會略高,且目前版本在主節(jié)點宕機(jī)后溺欧,備機(jī)不能自動切換為主機(jī)喊熟。
3.3 雙主雙從集群搭建
3.3.1 總體架構(gòu)
消息高可用采用2m-2s(同步雙寫)方式
3.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.3 服務(wù)器環(huán)境
序號 | IP | 角色 | 架構(gòu)模式 |
---|---|---|---|
1 | 192.168.1.114 | nameserver磁携、brokerserver | Master1褒侧、Slave2 |
2 | 192.168.1.111 | nameserver、brokerserver | Master2谊迄、Slave1 |
3.3.4 Host添加信息
vim /etc/hosts
配置如下:
# nameserver
192.168.1.114 rocketmq-nameserver1
192.168.1.111 rocketmq-nameserver2
# broker
192.168.1.114 rocketmq-master1
192.168.1.114 rocketmq-slave2
192.168.1.111 rocketmq-master2
192.168.1.111 rocketmq-slave1
配置完成后, 重啟網(wǎng)卡
systemctl restart network
3.3.5 防火墻配置
宿主機(jī)需要遠(yuǎn)程訪問虛擬機(jī)的rocketmq服務(wù)和web服務(wù)闷供,需要開放相關(guān)的端口號,簡單粗暴的方式是直接關(guān)閉防火墻
# 關(guān)閉防火墻
systemctl stop firewalld.service
# 查看防火墻的狀態(tài)
firewall-cmd --state
# 禁止firewall開機(jī)啟動
systemctl disable firewalld.service
或者為了安全统诺,只開放特定的端口號歪脏,RocketMQ默認(rèn)使用3個端口:9876 、10911 粮呢、11011 婿失。如果防火墻沒有關(guān)閉的話,那么防火墻就必須開放這些端口:
-
nameserver
默認(rèn)使用 9876 端口 -
master
默認(rèn)使用 10911 端口 -
slave
默認(rèn)使用11011 端口
執(zhí)行以下命令:
# 開放name server默認(rèn)端口
firewall-cmd --remove-port=9876/tcp --permanent
# 開放master默認(rèn)端口
firewall-cmd --remove-port=10911/tcp --permanent
# 開放slave默認(rèn)端口 (當(dāng)前集群模式可不開啟)
firewall-cmd --remove-port=11011/tcp --permanent
# 重啟防火墻
firewall-cmd --reload
3.3.6 環(huán)境變量配置
vim /etc/profile
在profile文件的末尾加入如下命令
#set rocketmq
ROCKETMQ_HOME=/usr/local/rocketmq/rocketmq-all-4.4.0-bin-release
PATH=$PATH:$ROCKETMQ_HOME/bin
export ROCKETMQ_HOME PATH
輸入:wq! 保存并退出啄寡, 并使得配置立刻生效:
source /etc/profile
3.3.7 創(chuàng)建消息存儲路徑
mkdir /usr/local/rocketmq/store
mkdir /usr/local/rocketmq/store/commitlog
mkdir /usr/local/rocketmq/store/consumequeue
mkdir /usr/local/rocketmq/store/index
3.3.8 broker配置文件
1)master1
服務(wù)器:192.168.1.114
vi /usr/local/rocketmq/conf/2m-2s-sync/broker-a.properties
修改配置如下:
#所屬集群名字
brokerClusterName=rocketmq-cluster
#broker名字豪硅,注意此處不同的配置文件填寫的不一樣
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer地址挺物,分號分割
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
#在發(fā)送消息時懒浮,自動創(chuàng)建服務(wù)器不存在的topic,默認(rèn)創(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
#刪除文件時間點,默認(rèn)凌晨 4點
deleteWhen=04
#文件保留時間学少,默認(rèn) 48 小時
fileReservedTime=120
#commitLog每個文件的大小默認(rèn)1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每個文件默認(rèn)存30W條剪个,根據(jù)業(yè)務(wù)情況調(diào)整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#檢測物理文件磁盤空間
diskMaxUsedSpaceRatio=88
#存儲路徑
storePathRootDir=/usr/local/rocketmq/store
#commitLog 存儲路徑
storePathCommitLog=/usr/local/rocketmq/store/commitlog
#消費隊列存儲路徑存儲路徑
storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
#消息索引存儲路徑
storePathIndex=/usr/local/rocketmq/store/index
#checkpoint 文件存儲路徑
storeCheckpoint=/usr/local/rocketmq/store/checkpoint
#abort 文件存儲路徑
abortFile=/usr/local/rocketmq/store/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
2)slave2
服務(wù)器:192.168.1.114
vi /usr/local/rocketmq/conf/2m-2s-sync/broker-b-s.properties
修改配置如下:
#所屬集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此處不同的配置文件填寫的不一樣
brokerName=broker-b
#0 表示 Master版确,>0 表示 Slave
brokerId=1
#nameServer地址扣囊,分號分割
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
#在發(fā)送消息時乎折,自動創(chuàng)建服務(wù)器不存在的topic,默認(rèn)創(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
#刪除文件時間點坟冲,默認(rèn)凌晨 4點
deleteWhen=04
#文件保留時間,默認(rèn) 48 小時
fileReservedTime=120
#commitLog每個文件的大小默認(rèn)1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每個文件默認(rèn)存30W條溃蔫,根據(jù)業(yè)務(wù)情況調(diào)整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#檢測物理文件磁盤空間
diskMaxUsedSpaceRatio=88
#存儲路徑
storePathRootDir=/usr/local/rocketmq/stores2
#commitLog 存儲路徑
storePathCommitLog=/usr/local/rocketmq/stores2/commitlog
#消費隊列存儲路徑存儲路徑
storePathConsumeQueue=/usr/local/rocketmq/stores2/consumequeue
#消息索引存儲路徑
storePathIndex=/usr/local/rocketmq/stores2/index
#checkpoint 文件存儲路徑
storeCheckpoint=/usr/local/rocketmq/stores2/checkpoint
#abort 文件存儲路徑
abortFile=/usr/local/rocketmq/stores2/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)master2
服務(wù)器:192.168.1.111
vi /usr/local/rocketmq/conf/2m-2s-sync/broker-b.properties
修改配置如下:
#所屬集群名字
brokerClusterName=rocketmq-cluster
#broker名字健提,注意此處不同的配置文件填寫的不一樣
brokerName=broker-b
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer地址伟叛,分號分割
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
#在發(fā)送消息時私痹,自動創(chuàng)建服務(wù)器不存在的topic,默認(rèn)創(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
#刪除文件時間點癞蚕,默認(rèn)凌晨 4點
deleteWhen=04
#文件保留時間,默認(rèn) 48 小時
fileReservedTime=120
#commitLog每個文件的大小默認(rèn)1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每個文件默認(rèn)存30W條辉哥,根據(jù)業(yè)務(wù)情況調(diào)整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#檢測物理文件磁盤空間
diskMaxUsedSpaceRatio=88
#存儲路徑
storePathRootDir=/usr/local/rocketmq/store
#commitLog 存儲路徑
storePathCommitLog=/usr/local/rocketmq/store/commitlog
#消費隊列存儲路徑存儲路徑
storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
#消息索引存儲路徑
storePathIndex=/usr/local/rocketmq/store/index
#checkpoint 文件存儲路徑
storeCheckpoint=/usr/local/rocketmq/store/checkpoint
#abort 文件存儲路徑
abortFile=/usr/local/rocketmq/store/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
4)slave1
服務(wù)器:192.168.1.111
vi /usr/local/rocketmq/conf/2m-2s-sync/broker-a-s.properties
修改配置如下:
#所屬集群名字
brokerClusterName=rocketmq-cluster
#broker名字桦山,注意此處不同的配置文件填寫的不一樣
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=1
#nameServer地址醋旦,分號分割
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
#在發(fā)送消息時恒水,自動創(chuàng)建服務(wù)器不存在的topic,默認(rèn)創(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
#刪除文件時間點御雕,默認(rèn)凌晨 4點
deleteWhen=04
#文件保留時間,默認(rèn) 48 小時
fileReservedTime=120
#commitLog每個文件的大小默認(rèn)1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每個文件默認(rèn)存30W條滥搭,根據(jù)業(yè)務(wù)情況調(diào)整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#檢測物理文件磁盤空間
diskMaxUsedSpaceRatio=88
#存儲路徑
storePathRootDir=/usr/local/rocketmq/stores1
#commitLog 存儲路徑
storePathCommitLog=/usr/local/rocketmq/stores1/commitlog
#消費隊列存儲路徑存儲路徑
storePathConsumeQueue=/usr/local/rocketmq/stores1/consumequeue
#消息索引存儲路徑
storePathIndex=/usr/local/rocketmq/stores1/index
#checkpoint 文件存儲路徑
storeCheckpoint=/usr/local/rocketmq/stores1/checkpoint
#abort 文件存儲路徑
abortFile=/usr/local/rocketmq/stores1/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.3.9 修改啟動腳本文件
1)runbroker.sh
vi /usr/local/rocketmq/bin/runbroker.sh
需要根據(jù)內(nèi)存大小進(jìn)行適當(dāng)?shù)膶VM參數(shù)進(jìn)行調(diào)整:
#===================================================
# 開發(fā)環(huán)境配置 JVM Configuration
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m"
2)runserver.sh
vim /usr/local/rocketmq/bin/runserver.sh
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
3.3.10 服務(wù)啟動
1)啟動NameServe集群
分別在192.168.1.114和192.168.1.111啟動NameServer
cd /usr/local/rocketmq/bin
nohup sh mqnamesrv &
2)啟動Broker集群
- 在192.168.25.114上啟動master1和slave2
master1:
cd /usr/local/rocketmq/bin
nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-sync/broker-a.properties &
slave2:
cd /usr/local/rocketmq/bin
nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-sync/broker-b-s.properties &
- 在192.168.25.111上啟動master2和slave2
master2
cd /usr/local/rocketmq/bin
nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-sync/broker-b.properties &
slave1
cd /usr/local/rocketmq/bin
nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-sync/broker-a-s.properties &
3.3.11 查看進(jìn)程狀態(tài)
啟動后通過JPS查看啟動進(jìn)程
image.png
3.3.12 查看日志
# 查看nameServer日志
tail -500f ~/logs/rocketmqlogs/namesrv.log
# 查看broker日志
tail -500f ~/logs/rocketmqlogs/broker.log
3.4 mqadmin管理工具
3.4.1 使用方式
進(jìn)入RocketMQ安裝位置酸纲,在bin目錄下執(zhí)行./mqadmin {command} {args}