前言:此篇文章系本人學習過程中記錄下來的筆記,里面難免會有不少欠缺的地方,誠心期待大家多多給予指教。
- RocketMQ(一)
接上期內容:上期完成了RocketMQ單機部署知識。下面學習RocketMQ集群相關知識,話不多說,直接發車。
一、RocketMQ集群基礎概念
(一)、核心組件?
RocketMQ 集群主要由以下核心組件構成:?
- NameServer:RocketMQ 的名稱服務器,為整個集群提供元數據管理服務。它保存了 Topic 與 Broker 的映射關系,以及 Broker 的狀態信息等。NameServer 之間相互獨立,沒有通信和協作關系,采用無狀態設計,方便水平擴展。?
- Broker:負責消息的存儲、轉發和查詢等操作。Broker 與 NameServer 保持長連接,定時上報自身信息。根據功能不同,Broker 又可分為 Master 和 Slave 節點,Master 負責處理讀寫請求,Slave 主要用于數據備份和讀請求分擔。(主要集群的就是它)?
- Producer:消息生產者,負責將業務消息發送到 RocketMQ 集群。Producer 通過 NameServer 獲取 Topic 對應的 Broker 列表,然后根據負載均衡策略將消息發送到具體的 Broker 節點。?
- Consumer:消息消費者,從 Broker 拉取或接收消息并進行業務處理。Consumer 支持集群消費和廣播消費兩種模式,集群消費模式下,同一個 Consumer Group 中的多個 Consumer 實例共同消費 Topic 的消息,提高消費效率;廣播消費模式下,每個 Consumer 實例都會消費 Topic 的所有消息。
(二)、集群架構圖
(三)、集群模式
RocketMQ 支持多種集群模式,常見的有:?
- 單 Master 模式:整個集群只有一個 Master 節點,配置簡單,但存在單點故障問題,一旦 Master 宕機,整個集群將無法工作,適用于本地測試或對可靠性要求不高的場景。?
- 多 Master 模式:集群包含多個 Master 節點,每個 Master 節點之間相互獨立,無 Slave 節點。這種模式性能較高,但每個 Master 節點宕機時,該節點上的消息無法被消費,適合對可用性要求不是特別高,追求高性能的場景。?
- 多 Master 多 Slave 異步復制模式:每個 Master 節點都對應至少一個 Slave 節點,Master 與 Slave 之間采用異步復制方式同步數據。這種模式下,當 Master 宕機時,Slave 可以切換為 Master 繼續提供服務,提高了集群的可用性,但可能存在數據丟失的風險。?
- 多 Master 多 Slave 同步雙寫模式:與異步復制模式類似,但 Master 與 Slave 之間采用同步雙寫方式,即只有當 Master 和 Slave 都寫入成功后,才認為消息寫入成功。這種模式保證了數據的強一致性,即使 Master 宕機,也不會出現數據丟失,但性能會受到一定影響。
二、RocketMQ集群搭建
本次學習搭建一個雙主雙從異步復制的Broker集群。本應該是四臺機器,由于硬件文件,所這里使用了兩臺主機來完成集群的搭建。
(一)、前期準備
準備好兩天虛擬機,分別都裝好RocketMQ、JDK。
(二)、修改配置
1、RocketMQ1
①、進入這個目錄rocketmq-all-5.3.2-bin-release/conf/2m-2s-async
修改broker-a.properties文件
-a:代表Master,-s:代表salve。
# 指定整個broker集群的名稱,或者說是RocketMQ集群的名稱
brokerClusterName=DefaultCluster
# 指定master-slave集群的名稱。一個RocketMQ集群可以包含多個master-slave集群
brokerName=broker-a
# master的brokerId為0
brokerId=0
# 指定刪除消息存儲過期文件的時間為凌晨4點
deleteWhen=04
# 指定未發生更新的消息存儲文件的保留時長為48小時,48小時后過期,將會被刪除
fileReservedTime=48
# 指定當前broker為異步復制master
brokerRole=ASYNC_MASTER
# 指定刷盤策略為異步刷盤
flushDiskType=ASYNC_FLUSH
# 指定Name Server的地址
namesrvAddr=MQ1IP:9876;MQ2IP:9876
復制策略:
復制策略是Broker的Master與Slave間的數據同步方式。分為同步復制與異步復制:
同步復制:消息寫入master后,master會等待slave同步數據成功后才向producer返回成功ACK
異步復制:消息寫入master后,master立即向producer返回成功ACK,無需等待slave同步數據成功。
- 異步復制策略會降低系統的寫入延遲,RT變小,提高了系統的吞吐量。
刷盤策略:
刷盤策略指的是broker中消息的落盤(寫入磁盤)方式,即消息發送到broker內存后消息持久化到磁盤的方式。分為同步刷盤與異步刷盤:
同步刷盤:當消息持久化到broker的磁盤后才算是消息寫入成功。
異步刷盤:當消息寫入到broker的內存后即表示消息寫入成功,無需等待消息持久化到磁盤。
- 1)異步刷盤策略會降低系統的寫入延遲,RT變小,提高了系統的吞吐量
- 2)消息寫入到Broker的內存,一般是寫入到了PageCache
- 3)對于異步刷盤策略,消息會寫入到PageCache后立即返回成功ACK。但并不會立即做落盤操作,而是當PageCache到達一定量時會自動進行落盤。
②、修改broker-b-s.properties
# 指定整個broker集群的名稱,或者說是RocketMQ集群的名稱
brokerClusterName=DefaultCluster
# 指定這是另外一個master-slave集群
brokerName=broker-b
# slave的brokerId為非0
brokerId=1
deleteWhen=04
fileReservedTime=48
# 指定當前broker為slave
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
namesrvAddr=MQ1IP:9876;MQ2IP:9876
# 指定Broker對外提供服務的端口,即Broker與producer與consumer通信的端口。默認
# 10911。由于當前主機同時充當著master1與slave2,而前面的master1使用的是默認端口。這
# 里需要將這兩個端口加以區分,以區分出master1與slave2
listenPort=10912
# 指定消息存儲相關的路徑。默認路徑為~/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
2、RocketMQ2
修改內容跟RocketMQ1差距不大。
①、進入這個目錄rocketmq-all-5.3.2-bin-release/conf/2m-2s-async
修改broker-b.properties文件
②、修改broker-a-s.properties
(三)、啟動服務
1、先啟動NameServer集群,命令都一樣。
nohup sh bin/mqnamesrv &
2、在啟動RocketMQ1與RocketMQ2兩個主機中的broker master。注意,它們指定所要加載的配置文件是不同的。
# RocketMQ1
$ nohup sh bin/mqbroker -n xxx.xxx.xxx.xxx:9876 -c $ROCKETMQ_HOME/conf/2m-2s-async/broker-a.properties &
# RocketMQ2
$ nohup sh bin/mqbroker -n xxx.xxx.xxx:9876 -c $ROCKETMQ_HOME/conf/2m-2s-async/broker-a.properties &
?3、在啟動RocketMQ1與RocketMQ2兩個主機中的broker slave。注意,它們指定所要加載的配置文件是不同的。
# RocketMQ1
$ nohup sh bin/mqbroker -n xxx.xxx.xxx:9876 -c $ROCKETMQ_HOME/conf/2m-2s-async/broker-a-s.properties &
# RocketMQ2
$ nohup sh bin/mqbroker -n xxx.xxx.xxx:9876 -c $ROCKETMQ_HOME/conf/2m-2s-async/broker-a-s.properties &
4、RocketMQ控制臺驗證?
三、總結
本次學習了RocketMQ 集群的基礎概念、搭建過程。合理選擇集群模式、正確配置參數,可以構建一個高性能、高可靠的 RocketMQ 集群,為分布式系統提供穩定的消息通信服務。在實際應用中,還需要根據業務需求和場景不斷優化 RocketMQ 集群的配置和性能。
ps:努力到底,讓持續學習成為貫穿一生的堅守。學習筆記持續更新中。。。。