簡單研究下其集群策略以及集群搭建方式。
參考: https://github.com/apache/rocketmq/blob/master/docs/cn/operation.md
1. 集群架構圖
2. 數據復制與刷盤策略
復制策略: 指的是broker的主從節點之間的數據同步方式,分為同步復制與異步復制
同步復制:消息寫入master后,master會等待slave同步數據成功之后才向producer返回成功ACK
異步復制:消息寫入master后,master會立即向producer返回成功ack,無需等待slave 同步完成。異步復制策略會降低系統的寫入延遲,RT 響應時間變小,增加了系統吞吐量
刷盤策略:指的是broker 中的數據落盤的方式,即消息發送到broker內存后消息持久化到磁盤的方式。分為同步刷盤與異步刷盤。
同步刷盤: 當消息持久化到磁盤才算消息寫入成功
異步刷盤: 消息到達內存即算成功。異步刷盤會降低系統的寫入延遲,RT變小,提高了吞吐量;消息寫入到broker 的內存,一般是寫入到了pageCache, 對於異步刷盤,pageCache 達到一定量時會自動落盤。
3. broker 集群模式
根據節點間關系不同,可以分為:
單master(單機版)
多master: broker集群由多個master 構成,不存在slave。 同一Topic 的各個Queue 會平均分配到多個master 節點上。
多master 多slave模式 - 異步復制:broker集群由多個master 構成,每個master 又配置了多個slave。master 與 slave 的關系是主備關系,master 負責讀寫請求、slave 負責消息的備份與master節點宕機后的角色切換。 由於是異步復制,所以會有可能有消息丟失的情況。
多master 多slave模式 - 同步雙寫: 與上面的區別是,master與slave 數據是同步復制的,即同步雙寫。
補充:關於RAID10 磁盤陣列
RAID: redundant Array of Independent Disks 獨立磁盤冗余陣列, 是一種硬件技術。 RAID主要利用鏡像、數據條帶、數據校驗三種技術來獲取高性能、可靠性、容錯能力和擴展性。
鏡像技術: 在磁盤陣列中有多個相同的數據副本,並且分布在多個不同的磁盤上。當一個數據副本失效時,可以訪問另一個副本,這樣達到數據備份的目的。壞處是寫性能會降低。
數據條帶技術: 自動將IO操作負載均衡到多個物理磁盤上。具體說就是將一塊連續的數據分成很多小部分並存儲到不同的磁盤上。這就能使多個進程並發訪問數據的對個不同部分,從而提高IO並行能力。
數據校驗:利用冗余數據進行數據錯誤檢測和修復,冗余數據通常采用海明碼、異或操作等算法來計算獲得。利用校驗功能,可以很大程度上提高磁盤陣列的可靠性、魯棒性和容錯能力。不過,數據校驗需要從多處讀取數據並進行計算和對比,會影響系統性能。
RAID 有等級,原始是0-6 等級,后來又推出7、10、01、53 等等級。目前使用最多的是0、1、3、5、6、10。 每個等級代表一種實現方法和技術,等級之間沒有高低,只是技術點不同。RAID10 就是RAID1和RAID0的合體,先做條帶,再做鏡像。也就是先將數據分散到不同的磁盤,然后再將磁盤中的數據做鏡像。
4. 集群環境搭建
本次搭建集群模式為兩個master, 兩個slave集群, 且復制模式為異步復制。
集群節點之間關系:
rocketmq1 192.168.13.101 Master1+Slave2
rocketmq2 192.168.13.102 Master2+Slave1
1. 環境信息修改
兩個主機分別對應如上信息,下面修改其中一個,另一個類似修改即可。
1. 修改兩個主機的hostname
查看可以用:hostname\ hostnamectl
修改: 直接編輯/etc/hostname 即可, 或者用如下命令,實際上也是修改的/etc/hostname 文件
hostnamectl set-hostname rocketmq1
2. 修改兩個主機的網絡信息,改為上述的IP,這里采用靜態ip 修改 /etc/sysconfig/network-scripts/ifcfg-ens33 , 內容如下
TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=static DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens33 UUID=4843987d-3495-4240-adec-17e877868f97 DEVICE=ens33 ONBOOT=yes IPADDR=192.168.13.101 GATEWAY=192.168.13.2 NETMASK=255.255.255.0
設置DNS 服務器 vim /etc/resolv.conf (如果設置了靜態ip, 必須設置這個,否則訪問不到一些域名網站)
cat >> /etc/resolv.conf << EOF nameserver 114.114.114.114 EOF
然后ping baidu.com 進行測試
2. 修改配置文件
rocketMQ 提供了幾個模板配置類,在%rocketmq%/conf 目錄下。如下:
[root@rocketmq1 conf]# pwd /opt/rocketmq/rocketmq-4.9.2/conf [root@rocketmq1 conf]# ll | grep '^d' drwxr-xr-x. 2 root root 118 Jan 4 05:56 2m-2s-async drwxr-xr-x. 2 root root 118 Oct 22 13:41 2m-2s-sync drwxr-xr-x. 2 root root 91 Oct 22 13:41 2m-noslave drwxr-xr-x. 2 root root 72 Oct 22 13:41 dledger
2m-2s-async 是2主2從,異步復制的模板; 2m-2s-sync 是2主2從同步復制的模板; 2m-noslave 是2主沒有從的配置。
下面修改 2m-2s-async 里面的配置,修改前將目錄復制備份下。
1. 查看 2m-2s-async 目錄下面的文件
broker-a.properties broker-a-s.properties broker-b.properties broker-b-s.properties
四個配置文件構成一個集群,四個配置的brokerClusterName 是一致的,代表一個相同的集群;brokerName 代表大集群中的小集群,也就是主從節點關系。
broker-a.properties、broker-a-s.properties 是成對出現的,一個主一個從, 兩者內部的brokerName 一致; 同理,broker-b.properties、broker-b-s.properties 也是如此。
下面修改四個配置文件, 然后后面啟動集群的時候選擇不同的配置文件啟動,然后構成不同的集群。
13.101 機器修改兩個配置:
(1) broker-a.properties 文件
# 集群名稱,整個集群名稱
brokerClusterName=DefaultCluster
# 指定master-slave 集群的名稱,一個RocketMQ 可以包含多個master-slave 集群
brokerName=broker-a
# brokerId,為0 代表master
brokerId=0
# 指定刪除消息存儲過期文件的時間為凌晨4點
deleteWhen=04
# 指定未發生更新的消息存儲文件的保留時長為48小時,48小時后過期,將會被刪除
fileReservedTime=48
# 指定當前broker為異步復制master
brokerRole=ASYNC_MASTER
# 指定刷盤策略為異步刷盤
flushDiskType=ASYNC_FLUSH
# 指定Name Server的地址
namesrvAddr=192.168.13.101:9876;192.168.13.102:9876
增加了個namesrvAddr 地址配置
(2) broker-b-s.properties 文件
brokerClusterName=DefaultCluster
brokerName=broker-b
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
namesrvAddr=192.168.13.101:9876;192.168.13.102:9876
# 指定Broker對外提供服務的端口,即Broker與producer與consumer通信的端口。默認 10911。由於當前主機同時充當着master1與slave2,而前面的master1使用的是默認 里需要將這兩個端口加以區分,以區分出master1與slave2
listenPort=11911
# 指定消息存儲相關的路徑。默認路徑為~/store目錄。由於當前主機同時充當着master1與 slave2,master1使用的是默認路徑,這里就需要再指定一個不同路徑
storePathRootDir=~/store-s
storePathCommitLog=~/store-s/commitlog
storePathConsumeQueue=~/store-s/consumequeue
storePathIndex=~/store-s/index
storeCheckpoint=~/store-s/checkpoint
abortFile=~/store-s/abort
13.102 機器修改兩個配置:
(1) broker-b.properties 文件
brokerClusterName=DefaultCluster
brokerName=broker-b
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
# 指定Name Server的地址
namesrvAddr=192.168.13.101:9876;192.168.13.102:9876
(2) broker-a-s.properties 文件
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
namesrvAddr=192.168.13.101:9876;192.168.13.102:9876
# 指定Broker對外提供服務的端口,即Broker與producer與consumer通信的端口。默認 10911。由於當前主機同時充當着master1與slave2,而前面的master1使用的是默認 里需要將這兩個端口加以區分,以區分出master1與slave2
listenPort=11911
# 指定消息存儲相關的路徑。默認路徑為~/store目錄。由於當前主機同時充當着master1與 slave2,master1使用的是默認路徑,這里就需要再指定一個不同路徑
storePathRootDir=~/store-s
storePathCommitLog=~/store-s/commitlog
storePathConsumeQueue=~/store-s/consumequeue
storePathIndex=~/store-s/index
storeCheckpoint=~/store-s/checkpoint
abortFile=~/store-s/abort
3. 啟動集群
啟動: 兩個機子啟動nameserver
nohup sh bin/mqnamesrv &
啟動Broker 集群
(1)rocketmq1 啟動 master 節點:
nohup sh bin/mqbroker -c conf/2m-2s-async/broker-a.properties &
(2)rocketmq2 啟動 master 節點:
nohup sh bin/mqbroker -c conf/2m-2s-async/broker-b.properties &
(3)rocket1 啟動 slave 節點:
nohup sh bin/mqbroker -c conf/2m-2s-async/broker-b-s.properties &
(4)rocket2 啟動 slave 節點:
nohup sh bin/mqbroker -c conf/2m-2s-async/broker-a-s.properties &
4. 兩個機子查看java 進程
rocketmq1:
[root@rocketmq1 rocketmq-4.9.2]# jps -l | grep -v 'jps'
29170 org.apache.rocketmq.broker.BrokerStartup
29097 org.apache.rocketmq.broker.BrokerStartup
15210 org.apache.rocketmq.namesrv.NamesrvStartup
rocketmq2:
[root@rocketmq2 rocketmq-4.9.2]# jps -l | grep -v 'jps'
15697 org.apache.rocketmq.namesrv.NamesrvStartup
25251 org.apache.rocketmq.broker.BrokerStartup
25335 org.apache.rocketmq.broker.BrokerStartup
5. 查看集群
(1) mqadmin管理工具可以查看,mqadmin 是自帶的一個管理工具。 關於mqadmin 具體用法可以參考上面連接。
[root@rocketmq1 rocketmq-4.9.2]# ./bin/mqadmin clusterList -n 192.168.13.101:9876 RocketMQLog:WARN No appenders could be found for logger (io.netty.util.internal.InternalThreadLocalMap). RocketMQLog:WARN Please initialize the logger system properly. #Cluster Name #Broker Name #BID #Addr #Version #InTPS(LOAD) #OutTPS(LOAD) #PCWait(ms) #Hour #SPACE DefaultCluster broker-a 0 192.168.13.101:10911 V4_9_2 0.00(0,0ms) 0.00(0,0ms) 0 455960.76 0.6200 DefaultCluster broker-a 1 192.168.13.102:11911 V4_9_2 0.00(0,0ms) 0.00(0,0ms) 0 455960.76 0.6100 DefaultCluster broker-b 0 192.168.13.102:10911 V4_9_2 0.00(0,0ms) 0.00(0,0ms) 0 455960.76 0.6100 DefaultCluster broker-b 1 192.168.13.101:11911 V4_9_2 0.00(0,0ms) 0.00(0,0ms) 0 455960.76 0.6200
(2) mqadmin 查看相關topic
[root@rocketmq1 rocketmq-4.9.2]# ./bin/mqadmin topicList -n 192.168.13.101:9876 RocketMQLog:WARN No appenders could be found for logger (io.netty.util.internal.InternalThreadLocalMap). RocketMQLog:WARN Please initialize the logger system properly. RMQ_SYS_TRANS_HALF_TOPIC %RETRY%please_rename_unique_group_name_4 BenchmarkTest OFFSET_MOVED_EVENT TBW102 SELF_TEST_TOPIC DefaultCluster SCHEDULE_TOPIC_XXXX DefaultCluster_REPLY_TOPIC broker-b TopicTest broker-a %RETRY%__MONITOR_CONSUMER %RETRY%TOOLS_CONSUMER localhost.localdomain
(3) 查看Topic的路由信息
[root@rocketmq2 rocketmq-4.9.2]# ./bin/mqadmin topicRoute -t TopicTest -n 192.168.13.101:9876 RocketMQLog:WARN No appenders could be found for logger (io.netty.util.internal.InternalThreadLocalMap). RocketMQLog:WARN Please initialize the logger system properly. { "brokerDatas":[ { "brokerAddrs":{0:"192.168.13.102:10911",1:"192.168.13.101:11911" }, "brokerName":"broker-b", "cluster":"DefaultCluster" }, { "brokerAddrs":{0:"192.168.13.101:10911",1:"192.168.13.102:11911" }, "brokerName":"broker-a", "cluster":"DefaultCluster" } ], "filterServerTable":{}, "queueDatas":[ { "brokerName":"broker-a", "perm":6, "readQueueNums":4, "topicSysFlag":0, "writeQueueNums":4 }, { "brokerName":"broker-b", "perm":6, "readQueueNums":4, "topicSysFlag":0, "writeQueueNums":4 } ] }
(4) 查看topic 狀態:
[root@rocketmq2 rocketmq-4.9.2]# ./bin/mqadmin topicStatus -n localhost:9876 -t syncTopic RocketMQLog:WARN No appenders could be found for logger (io.netty.util.internal.InternalThreadLocalMap). RocketMQLog:WARN Please initialize the logger system properly. #Broker Name #QID #Min Offset #Max Offset #Last Updated DEFAULT_BROKER 0 0 1 2022-03-28 23:12:15,866 DEFAULT_BROKER 1 0 1 2022-03-28 23:12:15,871 DEFAULT_BROKER 2 0 1 2022-03-28 23:12:15,889 DEFAULT_BROKER 3 0 2 2022-03-28 23:12:15,895
6. 可視化界面查看集群
也可以從之前的可視化界面查看集群信息