1. 程式人生 > >RocketMQ4.2 最佳實踐之叢集搭建

RocketMQ4.2 最佳實踐之叢集搭建

學習了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(非同步刷盤):生產者傳送的每一條訊息並不是立即儲存到磁碟,而是暫時快取起來,然後就回撥告訴生產者成功。隨後再非同步的將快取資料儲存到磁碟
  如果我們選擇非同步刷盤,可選的有兩種刷盤機制:
  1. 定期將快取中更新的資料進行落盤
  2. 當快取中更新的資料條數達到某一設定值後進行落盤。這種方式會存在訊息丟失(在還未來得及同步到磁碟的時候宕機),但是效能很好。預設是這種模式。
 

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
一個master與多個slave通過指定相同的BrokerName被歸為一個 broker set(broker集)。通常生產環境中,我們至少需要2個broker set。   生產者傳送的訊息,總是先發到 Master Broker。對於訊息傳送成功的回撥,Broker Set 有兩種資料同步機制:
  • Sync Broker(同步雙寫):生產者傳送的每一條訊息都至少同步複製到一個slave後,才返回告訴生產者成功,即“同步雙寫”
  • Async Broker(非同步複製):生產者傳送的每一條訊息只要寫入master,就返回告訴生產者成功。然後再“非同步複製”到slave
  幾種Broker叢集搭建的最佳實踐: 2M + NoSlave:兩主(只有兩個master,沒有slave) 2M + 2S + Async:兩主兩從非同步複製(兩個master,兩個slave,master資料通過非同步複製到slave) 2M + 2S + Sync:兩主兩從同步雙寫(兩個master,兩個slave,資料同步雙寫到master和slave)   說明:
  1. 上述“2”只是說作為一個叢集的最低配置數量,可以根據實際情況擴充套件
  2. 所有的刷盤操作全部預設為:ASYNC_FLUSH(非同步刷盤)