目錄
- 0. 引言
- 1. 前備知識
- 1.1 namesrv集群模式
- 1.2 broker集群模式
- 1.2 broker主從復制原理
- 2. 集群部署
- 2.1 環境準備
- 2.2 配置講解
- 2.3 一主多從模式部署
- 2.4 多主無從模式部署
- 2.5 多主多從模式部署
- 3. 總結
0. 引言
在學習完rocketmq的基礎知識后,我們進入rocketmq高可用保障的章節,即從服務部署架構角度,探索其支持的多節點部署模式。
1. 前備知識
1.1 namesrv集群模式
我們知道rocketmq主要由namesrv和broker組成,其集群的部署自然就是兩個服務的集群部署。而大部分我們談到其集群模式時,其實都是指的broker, 這是因為namesrv是無狀態的,什么是無狀態的呢? 簡單說就是namesrv之間不互相通信,其集群部署只要部署多個節點,broker中配置上多個namesrv的地址信息,只要其中一個namesrv可用,整體就依然可用。
那么這種無狀態機制是怎么實現的呢?
其實要聊到namesrv與broker的通信機制,之前我們也簡單說明過,具體如下:
1、nameserver 每隔 10s 會掃描一次 Broker,對于沒有超過120s都沒有回應的broker做剔除處理
2、broker 每隔 30 秒會向集群中所有的 NameServer 發送心跳包(這里發送的namesrv列表,就是寫在broker配置文件中的所有namesrv地址),namesrv收到心跳包后會更新狀態信息和路由表
所以可以看到broker會像所有的namesrv發送心跳,所以每個namesrv自然不用相互通信了。
1.2 broker集群模式
broker支持的集群模式包括三種:
- 單主模式
包含一個主節點,一個或多個從節點,主節點負責寫操作,從節點負責讀操作,主從節點之間通過主從復制機制同步數據,優點是部署維護簡單,缺點是當主節點宕機時整個集群將無法工作,所以也沒有完整的實現高可用
- 多主模式
包含多個主節點,沒有從節點,單個節點宕機時對整體集群可用性無影響,但在該節點上還未消費的消息在宕機期間就無法被消費了,短期內對有限的數據消費有影響。
- 多主多從模式
包含多個主節點,多個從節點,主節點負責寫,每個主節點有自己的一組從節點,從節點負責讀,彌補多主模式宕機期間消息無法消費的問題,無單點故障,但相對性能會有所下降
1.2 broker主從復制原理
主從復制可以基于以下兩種機制實現:同步復制和異步復制。
- 同步復制: 同步復制模式下,主節點會等待至少一個從節點返回確認接收的回執后,才會給生產者發送成功接收回執,該模式強調數據的強一致性,缺點是降低了性能。其執行流程如下:
- 生產者會先發送消息到主broker,主broker會將消息寫入到commit log中
- 主broker寫入數據時,會喚醒WriteSocketService線程,查詢commit log,將數據發送到從broker
- 從接收到消息后,將數據寫入到自身的commit log,復制完成后返回新的更新偏移量給主
- 主broker同步等待到偏移量返回后,更新偏移量,如果消息偏移量大于等于主從復制請求的偏移量,則說明復制完成,然后返回消息發送成功的回執給生產者
- 異步復制:主 Broker 發送消息后,不需要等待從 Broker 的確認,即可向生產者返回成功標識。異步復制可以提高性能,但是可能會有數據丟失的風險。
- 主broker啟動,監聽指定端口
- 從broker啟動,與主broker建立連接
- 從broker每5s向主broker拉取消息,從broker收到消息后將數據寫入到commit log中,同時返回偏移量給主broker,且更新自身存儲的當前最大偏移量
可以看到同步異步的差別,主要是同步由主節點發起復制,異步由從節點發起復制
2. 集群部署
2.1 環境準備
兩臺部署了rocketmq的服務器,rocketmq在linux中的安裝可參考我之前的文章:
linux安裝RocketMQ并配置開機自啟(一)
2.2 配置講解
我們通過broker自帶的conf目錄下的配置文件2m-*,實際就可以知道如何進行配置
其配置項主要有以下幾項:
- brokerClusterName=DefaultCluster # 集群名稱,同一集群保持一致
- brokerName=broker-a # broker組名稱,同一主從保持一致
- brokerId=1 # brokerid, 每個broker節點唯一,0 表示 Master,>0 表示 Slave
- deleteWhen=04 # 刪除策略,通常配合時間使用,如每天的“04”點
- fileReservedTime=48 # 文件保留時間,單位為小時
- brokerRole=SLAVE # 角色,SLAVE從節點,ASYNC_MASTER 異步主節點,SYNC_MASTER 同步主節點
當為同步主節點時,生產者發送消息給主節點成功,也要發送給從節點成功之后,集群才會返回成功給生產者;當為異步主節點,生產者發送給主節點,主節點寫入成功后就會返回成功回執給生產者。- flushDiskType=ASYNC_FLUSH # 主從復制模式,ASYNC_FLUSH異步刷盤,SYNC_FLUSH同步刷盤
2.3 一主多從模式部署
1、提前部署3個namesrv服務節點,3個broker服務節點,其中計劃1個為主節點,2個從節點
broker服務節點 | 角色 |
---|---|
192.168.244.27 | 主 |
192.168.244.28 | 從 |
192.168.244.29 | 從 |
2、修改主節點服務器的broker.conf配置
brokerClusterName = DefaultCluster # 集群名稱
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
# namesrv集群直接配置多個namesrv地址即可,分號隔開
namesrvAddr=192.168.244.27:9876;192.168.244.28:9876;192.168.244.29:9876
# 開啟topic自動創建
autoCreateTopicEnable = true
brokerIP1 = 192.168.244.27
3、修改兩個從節點的broker.conf配置
brokerClusterName = DefaultCluster # 集群名稱
brokerName = broker-a
brokerId = 1 # 注意這里三個broker節點的id都要不一致
deleteWhen = 04
fileReservedTime = 48
brokerRole = SLAVE
flushDiskType = ASYNC_FLUSH
# namesrv集群直接配置多個namesrv地址即可,分號隔開
namesrvAddr=192.168.244.27:9876;192.168.244.28:9876;192.168.244.29:9876
# 開啟topic自動創建
autoCreateTopicEnable = true
brokerIP1 = 192.168.244.28 # 節點ip
brokerClusterName = DefaultCluster # 集群名稱
brokerName = broker-a
brokerId = 2 # 注意這里三個broker節點的id都要不一致
deleteWhen = 04
fileReservedTime = 48
brokerRole = SLAVE
flushDiskType = ASYNC_FLUSH
# namesrv集群直接配置多個namesrv地址即可,分號隔開
namesrvAddr=192.168.244.27:9876;192.168.244.28:9876;192.168.244.29:9876
# 開啟topic自動創建
autoCreateTopicEnable = true
brokerIP1 = 192.168.244.29 # 節點ip
4、啟動3個namesrv
5、啟動3個broker
6、查詢集群狀態
# 進入rocektmq安裝目錄
cd /data/rocketmq-4.8.0
# 執行查詢
./bin/mqadmin clusterList -n "192.168.244.27:9876;192.168.244.28:9876;192.168.244.29:9876"
7、也可以通過管理后臺查看集群節點
8、使用之前的代碼測試消息發送
消息消費也正常
2.4 多主無從模式部署
1、提前部署2個namesrv服務節點,2個broker服務節點,其中計劃2個為主節點,無從節點
broker服務節點 | 角色 |
---|---|
192.168.244.27 | 主 |
192.168.244.28 | 主 |
2、修改其中一個節點服務器的broker.conf配置
brokerClusterName = DefaultCluster # 集群名稱
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
# namesrv集群直接配置多個namesrv地址即可,分號隔開
namesrvAddr=192.168.244.27:9876;192.168.244.28:9876
# 開啟topic自動創建
autoCreateTopicEnable = true
brokerIP1 = 192.168.244.27
3、修改另一個節點的broker.conf配置
brokerClusterName = DefaultCluster # 集群名稱
brokerName = broker-b
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
# namesrv集群直接配置多個namesrv地址即可,分號隔開
namesrvAddr=192.168.244.27:9876;192.168.244.28:9876
# 開啟topic自動創建
autoCreateTopicEnable = true
brokerIP1 = 192.168.244.27
4、啟動2個namesrv
5、啟動2個broker
6、查詢集群狀態
# 進入rocektmq安裝目錄
cd /data/rocketmq-4.8.0
# 執行查詢
./bin/mqadmin clusterList -n "192.168.244.27:9876;192.168.244.28:9876"
2.5 多主多從模式部署
1、提前部署3個namesrv服務節點,4個broker服務節點,其中計劃2個為主節點,2個從節點
broker服務節點 | 角色 |
---|---|
192.168.244.27 | 主1 |
192.168.244.28 | 主2 |
192.168.244.29 | 從1 |
192.168.244.30 | 從2 |
2、修改主1節點服務器的broker.conf配置
brokerClusterName = DefaultCluster # 集群名稱
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
# namesrv集群直接配置多個namesrv地址即可,分號隔開
namesrvAddr=192.168.244.27:9876;192.168.244.28:9876;192.168.244.29:9876
# 開啟topic自動創建
autoCreateTopicEnable = true
brokerIP1 = 192.168.244.27
3、修改主2節點的broker.conf配置
brokerClusterName = DefaultCluster # 集群名稱
brokerName = broker-b
brokerId = 0 # 注意這里三個broker節點的id都要不一致
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
# namesrv集群直接配置多個namesrv地址即可,分號隔開
namesrvAddr=192.168.244.27:9876;192.168.244.28:9876;192.168.244.29:9876
# 開啟topic自動創建
autoCreateTopicEnable = true
brokerIP1 = 192.168.244.28 # 節點ip, 另一個是192.168.244.29
4、修改兩個從節點的配置分別為
brokerClusterName = DefaultCluster # 集群名稱
brokerName = broker-a
brokerId = 1
deleteWhen = 04
fileReservedTime = 48
brokerRole = SLAVE
flushDiskType = ASYNC_FLUSH
# namesrv集群直接配置多個namesrv地址即可,分號隔開
namesrvAddr=192.168.244.27:9876;192.168.244.28:9876;192.168.244.29:9876
# 開啟topic自動創建
autoCreateTopicEnable = true
brokerIP1 = 192.168.244.29
brokerClusterName = DefaultCluster # 集群名稱
brokerName = broker-b
brokerId = 1
deleteWhen = 04
fileReservedTime = 48
brokerRole = SLAVE
flushDiskType = ASYNC_FLUSH
# namesrv集群直接配置多個namesrv地址即可,分號隔開
namesrvAddr=192.168.244.27:9876;192.168.244.28:9876;192.168.244.29:9876
# 開啟topic自動創建
autoCreateTopicEnable = true
brokerIP1 = 192.168.244.30
4、啟動3個namesrv
5、啟動4個broker
6、查詢集群狀態
# 進入rocektmq安裝目錄
cd /data/rocketmq-4.8.0
# 執行查詢
./bin/mqadmin clusterList -n "192.168.244.27:9876;192.168.244.28:9876;192.168.244.29:9876"
顯示有2個主節點,2個從節點
3. 總結
綜上,我們針對rocketmq的三種集群模式部署就講解完成了,如果需要調整刷盤模式,調整flushDiskType參數即可。