RocketMQ:搭建集羣

在上一篇《RocketMQ:快速入門》之後,今天說一說如何搭建RocketMQ集羣。首先看一下集羣架構圖:

在這裏插入圖片描述

1. 集羣特點

  • NameServer是一個幾乎無狀態節點,可集羣部署,節點之間無任何信息同步。
  • Broker部署相對複雜,Broker分爲Master與Slave,一個Master可以對應多個Slave,但是一個Slave只能對應一個Master,Master與Slave的對應關係通過指定相同的BrokerName。不同的BrokerId來定義,BrokerId爲0表示Master,非0表示Slave。Master也可以部署多個。每個Broker與NameServer集羣中的所有節點建立長連接,定時註冊Topic信息到所有NameServer。
  • Producer與NameServer集羣中的其中一個節點(隨機選擇)建立長連接,定期從NameServer取Topic路由信息,並向提供Topic服務的Master建立長連接,且定時向Master發送心跳。Producer完全無狀態,可集羣部署。
  • Consumer與NameServer集羣中的其中一個節點(隨機選擇)建立長連接,定期從NameServer取Topic路由信息,並向提供Topic服務的Master、Slave建立長連接,且定時向Master、Slave發送心跳。Consumer既可以從Master訂閱消息,也可以從Slave訂閱消息,訂閱規則由Broker配置決定。

2. 集羣模式

2.1 單Master模式

這種方式風險較大,一旦Broker重啓或者宕機時,會導致整個服務不可用。不建議線上環境使用,通常可以用於本地測試。我們在《RocketMQ:快速入門》搭建的就是單Master模式。

2.2 多Master模式

一個集羣無Slave,全是Master,例如2個Master或者3個Master,這種模式的優缺點如下:

  • 優點:配置簡單,單個Master宕機或重啓維護對應用無影響,在磁盤配置爲RAID10時,即使機器宕機不可恢復情況下,由於RAID10磁盤非常可靠,消息也不會丟(異步刷盤丟失少量消息,同步刷盤一條不丟),性能最高。
  • 缺點:單臺機器宕機期間,這臺機器上未被消費的消息在機器恢復之前不可訂閱,消息實時性會受到影響。

2.3 多Master多Slave模式(異步)

每個Master配置一個Slave,有多對Master-Slave,HA採用異步複製方式,主備有短暫消息延遲(毫秒級),這種模式的優缺點如下:

  • 優點:即使磁盤損壞,消息丟失的非常少,且消息實時性不會受影響,同時Master宕機後,消費者仍然可以從Slave消費,而且此過程對應用透明,不需要人工干預,性能同多Master模式幾乎一樣。
  • 缺點:Master宕機,磁盤損壞情況下會丟失少量消息。

2.4 多Master多Slave模式(同步)

每個Master配置一個Slave,有多對Master-Slave,HA採用同步雙寫方式,即只有主備都寫成功,才嚮應用返回成功,這種模式的優缺點如下:

  • 優點:數據與服務都無單點故障,Master宕機情況下,消息無延遲,服務可用性與數據可用性都非常高。
  • 缺點:性能比異步複製模式略低(大約低10%左右),發送單個消息的RT會略高,且目前版本在主節點宕機後,備機不能自動切換爲主機。

3. 雙主雙從同步雙寫集羣搭建

3.1 總體架構

在這裏插入圖片描述

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 服務器環境

主機名 主機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 #####################

配置完成後,重啓網卡:

systemctl restart network

3.5 防火牆配置

宿主機需要遠程訪問虛擬機的rocketmq服務和web服務,需要開放相關的端口號,簡單粗暴的方式是直接關閉防火牆。

# 關閉防火牆
systemctl stop firewalld.service 
# 查看防火牆的狀態
firewall-cmd --state 
# 禁止firewall開機啓動
systemctl disable firewalld.service

或者爲了安全,只開放特定的端口號,RocketMQ默認使用3個端口:9876 、10911 、11011 。如果防火牆沒有關閉的話,那麼防火牆就必須開放這些端口:

  • nameserver 默認使用 9876 端口
  • master 默認使用 10911 端口
  • slave 默認使用11011 端口

執行以下命令:

# 開放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 配置環境變量

使用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 創建消息存儲路徑

# 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的配置

服務器: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
#在發送消息時,自動創建服務器不存在的topic,默認創建的隊列數
defaultTopicQueueNums=4
#是否允許 Broker 自動創建Topic,建議線下開啓,線上關閉
autoCreateTopicEnable=true
#是否允許 Broker 自動創建訂閱組,建議線下開啓,線上關閉
autoCreateSubscriptionGroup=true
#Broker 對外服務的監聽端口
listenPort=10911
#刪除文件時間點,默認凌晨 4點
deleteWhen=04
#文件保留時間,默認 48 小時
fileReservedTime=120
#commitLog每個文件的大小默認1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每個文件默認存30W條,根據業務情況調整
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 異步複製Master
#- SYNC_MASTER 同步雙寫Master
#- SLAVE
brokerRole=SYNC_MASTER
#刷盤方式
#- ASYNC_FLUSH 異步刷盤
#- SYNC_FLUSH 同步刷盤
flushDiskType=SYNC_FLUSH
#checkTransactionMessageEnable=false
#發消息線程池數量
#sendMessageThreadPoolNums=128
#拉消息線程池數量
#pullMessageThreadPoolNums=128

3.8.2 master1-slave1的配置

服務器: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
#在發送消息時,自動創建服務器不存在的topic,默認創建的隊列數
defaultTopicQueueNums=4
#是否允許 Broker 自動創建Topic,建議線下開啓,線上關閉
autoCreateTopicEnable=true
#是否允許 Broker 自動創建訂閱組,建議線下開啓,線上關閉
autoCreateSubscriptionGroup=true
#Broker 對外服務的監聽端口
listenPort=11011
#刪除文件時間點,默認凌晨 4點
deleteWhen=04
#文件保留時間,默認 48 小時
fileReservedTime=120
#commitLog每個文件的大小默認1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每個文件默認存30W條,根據業務情況調整
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 異步複製Master
#- SYNC_MASTER 同步雙寫Master
#- SLAVE
brokerRole=SLAVE
#刷盤方式
#- ASYNC_FLUSH 異步刷盤
#- SYNC_FLUSH 同步刷盤
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#發消息線程池數量
#sendMessageThreadPoolNums=128
#拉消息線程池數量
#pullMessageThreadPoolNums=128

3.8.3 master2的配置

服務器: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
#在發送消息時,自動創建服務器不存在的topic,默認創建的隊列數
defaultTopicQueueNums=4
#是否允許 Broker 自動創建Topic,建議線下開啓,線上關閉
autoCreateTopicEnable=true
#是否允許 Broker 自動創建訂閱組,建議線下開啓,線上關閉
autoCreateSubscriptionGroup=true
#Broker 對外服務的監聽端口
listenPort=10911
#刪除文件時間點,默認凌晨 4點
deleteWhen=04
#文件保留時間,默認 48 小時
fileReservedTime=120
#commitLog每個文件的大小默認1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每個文件默認存30W條,根據業務情況調整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#檢測物理文件磁盤空間
diskMaxUsedSpaceRatio=88
#存儲路徑(注意,如果在一臺機器上啓動多個broker,這個路徑要區分開)
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 異步複製Master
#- SYNC_MASTER 同步雙寫Master
#- SLAVE
brokerRole=SYNC_MASTER
#刷盤方式
#- ASYNC_FLUSH 異步刷盤
#- SYNC_FLUSH 同步刷盤
flushDiskType=SYNC_FLUSH
#checkTransactionMessageEnable=false
#發消息線程池數量
#sendMessageThreadPoolNums=128
#拉消息線程池數量
#pullMessageThreadPoolNums=128

3.8.4 master2-slave1的配置

服務器: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
#在發送消息時,自動創建服務器不存在的topic,默認創建的隊列數
defaultTopicQueueNums=4
#是否允許 Broker 自動創建Topic,建議線下開啓,線上關閉
autoCreateTopicEnable=true
#是否允許 Broker 自動創建訂閱組,建議線下開啓,線上關閉
autoCreateSubscriptionGroup=true
#Broker 對外服務的監聽端口
listenPort=10911
#刪除文件時間點,默認凌晨 4點
deleteWhen=04
#文件保留時間,默認 48 小時
fileReservedTime=120
#commitLog每個文件的大小默認1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每個文件默認存30W條,根據業務情況調整
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 異步複製Master
#- SYNC_MASTER 同步雙寫Master
#- SLAVE
brokerRole=SLAVE
#刷盤方式
#- ASYNC_FLUSH 異步刷盤
#- SYNC_FLUSH 同步刷盤
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#發消息線程池數量
#sendMessageThreadPoolNums=128
#拉消息線程池數量
#pullMessageThreadPoolNums=128

3.9 修改啓動腳本

根據實際情況,修改/bin/runbroker.sh/bin/runserver.sh腳本的JVM參數,參考配置如下:

JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"

3.10 啓動服務

3.10.1 啓動NameServer集羣

分別在三臺機器上啓動NameServer服務:

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 查看進程狀態

啓動後通過jps命令查看進程狀態,至此一個雙主雙從,同步雙寫的集羣搭建完成。

4. 集羣監控平臺搭建

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這臺服務器上啓動rocketmq-console

java -jar rocketmq-console-ng-1.0.1.jar

啓動成功後,我們就可以通過瀏覽器訪問http://192.168.1.21:8080進入控制檯界面了,如下圖:

在這裏插入圖片描述

——End——
更多精彩分享,可掃碼關注微信公衆號哦。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章