RocketMQ學習(二):集羣

目錄

RocketMQ集羣介紹

RocketMQ集羣模式

1、單Master模式

2、多Master模式

3、多Master多Slave模式(異步)

4、多Master多Slave模式(同步)

雙主雙從集羣搭建

1、服務器環境

2、防火牆配置

3、創建消息存儲路徑

4、Broker配置

1)Master1

2)Slave2

3)Mater2

3)Slave1

5、集羣啓動

搭建監控平臺


RocketMQ集羣介紹

 

  • 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配置決定。

RocketMQ集羣模式

1、單Master模式

這種方式風險較大,一旦Broker重啓或者宕機時,會導致整個服務不可用。

2、多Master模式

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

  • 優點:配置簡單,單個Master宕機或重啓維護對應用無影響,在磁盤配置爲RAID10時,即使機器宕機不可恢復情況下,由於RAID10磁盤非常可靠,消息也不會丟(異步刷盤丟失少量消息,同步刷盤一條不丟),性能最高。

  • 缺點:單臺機器宕機期間,這臺機器上未被消費的消息在機器恢復之前不可訂閱,消息實時性會受到影響。

3、多Master多Slave模式(異步)

每個Master配置一個或多個Slave,有多對Master-Slave,HA採用異步複製方式,主Broker收到消息就返回成功,在異步的將消息同步至從Broker,主備有短暫消息延遲(毫秒級),這種模式的優缺點如下:

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

  • 缺點:Master宕機,磁盤損壞情況下會丟失少量消息。

4、多Master多Slave模式(同步)

每個Master配置一個或多個Slave,有多對Master-Slave,HA採用同步雙寫方式,即只有主備都寫成功(主Broker收到消息立刻同步至從Broker),才嚮應用返回成功,這種模式的優缺點如下:

  • 優點:數據與服務都無單點故障,Master宕機情況下,消息無延遲,服務可用性與數據可用性都非常高;

  • 缺點:性能比異步複製模式略低(大約低10%左右),發送單個消息的RT會略高,且目前版本在主節點宕機後,備機不能自動切換爲主機。

雙主雙從集羣搭建

搭建2m-2s同步雙寫集羣,本例採用兩個服務器來搭建,假設兩個服務器IP分別爲192.168.1.1與192.168.1.2,如下圖所示

1、服務器環境

序號 IP 需要啓動的角色 Broker分佈
1 192.168.1.1 NameServer、Broker Master1、Slave2
1 192.168.1.2 NameServer、Broker Master2、Slave1

2、防火牆配置

服務器之間需要通信的話,首先需要配置服務器防火牆規則,需要關閉防火牆,簡單,但若是線上則不安全。

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

或者開放RocketMQ需要使用到的端口

  • NameServer默認使用 9876 端口

  • Broker Master 默認使用 10911 端口

  • Broker 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、創建消息存儲路徑

消息存儲路徑是指Broker存儲消息的路徑。

需要注意的是,若主節點和從節點在一個服務器上,那麼他們的存儲路徑不能相同,否則啓動時會拋出異常

Lock failed,MQ already started

# 主節點
mkdir /opt/rocketmq/store-m
mkdir /opt/rocketmq/store-m/commitlog
mkdir /opt/rocketmq/store-m/consumequeue
mkdir /opt/rocketmq/store-m/index

# 從節點
mkdir /opt/rocketmq/store-s
mkdir /opt/rocketmq/store-s/commitlog
mkdir /opt/rocketmq/store-s/consumequeue
mkdir /opt/rocketmq/store-s/index

4、Broker配置

重要:如果搭建集羣是用的公網服務器,那配置文件中一定要配置brokerIP=公網地址,且涉及到地址填寫的配置都填寫公網地址,否則RocketMQ將以內網地址啓動,導致後續的監控頁面連不上RocketMQ服務

1)Master1

服務器:192.168.1.1,打開配置文件位置,註釋原有配置,添加新配置

vim /opt/rocketmq/conf/2m-2s-sync/broker-a.properties
#所屬集羣名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此處不同的配置文件填寫的不一樣
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer地址,分號分割
namesrvAddr=192.168.1.1:9876;192.168.1.2:9876
#broker啓動地址,rocketmq默認內網啓動
brokerIP1=192.168.1.1
#在發送消息時,自動創建服務器不存在的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=/opt/rocketmq/store-m
#commitLog 存儲路徑
storePathCommitLog=/opt/rocketmq/store-m/commitlog
#消費隊列存儲路徑存儲路徑
storePathConsumeQueue=/opt/rocketmq/store-m/consumequeue
#消息索引存儲路徑
storePathIndex=/opt/rocketmq/store-m/index
#checkpoint 文件存儲路徑
storeCheckpoint=/opt/rocketmq/store-m/checkpoint
#abort 文件存儲路徑
abortFile=/opt/rocketmq/store-m/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

2)Slave2

服務器:192.168.1.1,注意配置文件名稱

vim /opt/rocketmq/conf/2m-2s-sync/broker-b-s.properties

僅列出與Master1有區別的部分

#broker名字,修改爲broker-b,因爲Slave2屬於第二個主從
brokerName=broker-b
#0 表示 Master,>0 表示 Slave
brokerId=1
#Broker 對外服務的監聽端口
listenPort=11011
#存儲路徑
storePathRootDir=/opt/rocketmq/store-s
#commitLog 存儲路徑
storePathCommitLog=/opt/rocketmq/store-s/commitlog
#消費隊列存儲路徑存儲路徑
storePathConsumeQueue=/opt/rocketmq/store-s/consumequeue
#消息索引存儲路徑
storePathIndex=/opt/rocketmq/store-s/index
#checkpoint 文件存儲路徑
storeCheckpoint=/opt/rocketmq/store-s/checkpoint
#abort 文件存儲路徑
abortFile=/opt/rocketmq/store-s/abort
#Broker 的角色
#- ASYNC_MASTER 異步複製Master
#- SYNC_MASTER 同步雙寫Master
#- SLAVE
brokerRole=SLAVE
#刷盤方式
#- ASYNC_FLUSH 異步刷盤
#- SYNC_FLUSH 同步刷盤
flushDiskType=ASYNC_FLUSH

3)Mater2

服務器:192.168.1.2

vim /opt/rocketmq/conf/2m-2s-sync/broker-b.properties

僅列出與Master1有區別的部分

#broker啓動地址,rocketmq默認內網啓動
brokerIP1=192.168.1.2
#broker名字,修改爲broker-b,因爲Master2屬於第二個主從
brokerName=broker-b
#0 表示 Master,>0 表示 Slave
brokerId=0
#Broker 對外服務的監聽端口
listenPort=10911

3)Slave1

服務器:192.168.1.2,注意配置文件名稱

vim /opt/rocketmq/conf/2m-2s-sync/broker-a-s.properties

僅列出與Master1有區別的部分

#broker啓動地址,rocketmq默認內網啓動
brokerIP1=192.168.1.2
#0 表示 Master,>0 表示 Slave
brokerId=1
#Broker 對外服務的監聽端口
listenPort=11011
#存儲路徑
storePathRootDir=/opt/rocketmq/store-s
#commitLog 存儲路徑
storePathCommitLog=/opt/rocketmq/store-s/commitlog
#消費隊列存儲路徑存儲路徑
storePathConsumeQueue=/opt/rocketmq/store-s/consumequeue
#消息索引存儲路徑
storePathIndex=/opt/rocketmq/store-s/index
#checkpoint 文件存儲路徑
storeCheckpoint=/opt/rocketmq/store-s/checkpoint
#abort 文件存儲路徑
abortFile=/opt/rocketmq/store-s/abort
#Broker 的角色
#- ASYNC_MASTER 異步複製Master
#- SYNC_MASTER 同步雙寫Master
#- SLAVE
brokerRole=SLAVE
#刷盤方式
#- ASYNC_FLUSH 異步刷盤
#- SYNC_FLUSH 同步刷盤
flushDiskType=ASYNC_FLUSH

5、集羣啓動

NameServer的啓動非常簡單,分別在兩個服務器執行啓動NameServer的命令即可。Broker則需要使用 -c 命令來指定啓動時的配置文件,因爲我是在bin目錄執行命令,因此配置文件需要../回到上級目錄

# 192.168.1.1
nohup sh mqnamesrv &
nohup sh mqbroker -c ../conf/2m-2s-sync/broker-a.properties &
nohup sh mqbroker -c ../conf/2m-2s-sync/broker-b-s.properties &

# 192.168.1.2
nohup sh mqnamesrv &
nohup sh mqbroker -c ../conf/2m-2s-sync/broker-b.properties &
nohup sh mqbroker -c ../conf/2m-2s-sync/broker-a-s.properties &

用JPS命令查看是否啓動成功

最後,兩邊都啓動完成後在任意服務器執行mqadmin命令查看集羣是否搭建成功

sh mqadmin clusterlist -n localhost:9876

搭建監控平臺

雖然使用mqadmin能夠查看很多信息,但比較麻煩也不直觀。RocketMQ有一個擴展項目rocketmq-externals,其中一個項目叫做rocketmq-console,這個項目便是控制檯項目。

我們需要將其下載下來,進入rocketmq-console\src\main\resources\application.properties,修改namesrvAddr配置

rocketmq.config.namesrvAddr=192.168.1.1:9876;192.168.1.2:9876

然後再回到rocketmq-console目錄下進行打包

mvn clean package -Dmaven.test.skip=true

打包完成後,會在target目錄下生成項目的jar包,我們啓動它

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

啓動成功後就能通過http://localhost:8080進入控制檯頁面了

 

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