RocketMQ4.2 最佳實踐之叢集搭建
阿新 • • 發佈:2019-11-06
學習了RocketMQ的基本概念後,我們來看看RocketMQ最簡單的使用場景。RocketMQ的伺服器最簡單的結構,必須包含一個NameServer和一個Broker。Producer把某個主題的訊息傳送給Broker,Consumer會去Broker中監聽指定主題的訊息,一旦發現,就會拉取並消費。在這個過程中,Producer和Consumer是通過NameServer才知道Broker部署在哪裡,如果是 Broker Cluster 的情況,還要知道Master節點是哪些。換句話說,NameServer中儲存著 Broker 的路由資訊。
以上這些理解是對 RocketMQ 最淺顯直觀的理解。然後我們來試想一下,如果 NameServer 和 Broker 都是單節點的,那麼一旦出現問題,首先是服務不可用了,其次,Producer和Consumer必然不知道Broker在哪裡,訊息就會發不出去也監聽不到。Broker中尚未被消費的訊息必然在故障期間不可訂閱,影響訊息實時性。為了避免這種情況的發生,我們需要搭建NameServer叢集和 Broker 叢集。
本文主要講解【MQ叢集】和【Broker Set】的搭建方法,其中也涉及到了名詞解釋和各元件作用的簡單介紹。【MQ叢集】和【Broker Set】的搭建,主要是為了最大程度上保證訊息不丟失,從而做到 RocketMQ 的高可用。
1. 叢集物理部署結構
以多Master多Slave模式為例,看一下RocketMQ叢集物理部署結構,然後我們解釋一下基本概念: === NameServer Cluster === NameServer是一個幾乎無狀態節點,可叢集部署,節點之間無任何資訊同步,只要保證一個例項存活就可以正常提供Broker的路由資訊。如上圖所示。 === Broker Cluster === Broker分為Master和Slave,一個Master可以對應多個Slave,但是一個Slave只能對應一個Master。Master與Slave的對應關係通過指定相同的BrokerName,不同的BrokerId來定義,BrokerId為0表示Master,非0表示Slave。因為這些 Master 和 Slave 具有相同的 BrokerName,因此它們組成了一個 Broker Set。 Master Broker 也可以部署多個。每個Broker或者 Broker Set 與NameServer叢集中的所有節點建立長連線,定時註冊 Topic 資訊到所有 NameServer。 === Producer Cluster === Producer與NameServer叢集中的其中一個節點(隨機選擇)建立長連線,定期從NameServer取Topic路由資訊,並和提供Topic服務的Master建立長連線,且定時向Master傳送心跳。Producer完全無狀態,可叢集部署。 === Consumer Cluster === Consumer與NameServer叢集中的其中一個節點(隨機選擇)建立長連線,定期從NameServer取Topic路由資訊,並和提供Topic服務的Master、Slave建立長連線,且定時向Master、Slave傳送心跳。Consumer既可以從Master訂閱訊息,也可以從Slave訂閱訊息,訂閱規則由Broker配置決定。2. 訊息落盤和Broker資料同步
搭建 RocketMQ 叢集的目的,是為了在最大程度上保證訊息不丟失。下面我們來看看叢集中有哪些特性,可以保障訊息不丟失。2.1 訊息落盤
RocketMQ可以將記憶體中的資料儲存在磁碟中,這種操作叫做磁碟重新整理(Disk Flush)。 RocketMQ提供了以下兩種模式:- SYNC_FLUSH(同步刷盤):生產者傳送的每一條訊息,都在儲存到磁碟成功後才回調告訴生產者成功。這種方式不會存在訊息丟失的問題,但是有很大的磁碟IO開銷,效能有一定影響
- ASYNC_FLUSH(非同步刷盤):生產者傳送的每一條訊息並不是立即儲存到磁碟,而是暫時快取起來,然後就回撥告訴生產者成功。隨後再非同步的將快取資料儲存到磁碟
- 定期將快取中更新的資料進行落盤
- 當快取中更新的資料條數達到某一設定值後進行落盤。這種方式會存在訊息丟失(在還未來得及同步到磁碟的時候宕機),但是效能很好。預設是這種模式。
2.2 Broker資料同步機制
Broker Replication(Broker 間資料同步/複製): Broker Replication 指的就是在一個Broker Set 中,Slave Broker 獲取/複製 Master Broker 資料的過程。這裡再提一下 Broker Set 的概念。 Broker Set 中的Broker,有兩種角色:- 一種是master,即可以寫也可以讀,其brokerId=0,只能有一個
- 一種是slave,只允許讀,其brokerId為非0
- Sync Broker(同步雙寫):生產者傳送的每一條訊息都至少同步複製到一個slave後,才返回告訴生產者成功,即“同步雙寫”
- Async Broker(非同步複製):生產者傳送的每一條訊息只要寫入master,就返回告訴生產者成功。然後再“非同步複製”到slave
- 上述“2”只是說作為一個叢集的最低配置數量,可以根據實際情況擴充套件
- 所有的刷盤操作全部預設為:ASYNC_FLUSH(非同步刷盤)