RocketMQ集羣原理及雙主雙從集羣搭建

RocketMQ的三種自帶集羣模式爲:

(1)雙MASTER : 優點是配置簡單、快捷,但是一旦MASTER機器宕機或出現問題就無法提供服務;

(2)雙MASTER雙SLAVE同步雙寫: 比異步複製的性能差10%,但能保證數據不丟失;

(3)雙MASTER雙SLAVE 異步複製:性能最好,但是遇到突發情況會有少量數據丟失。

上圖爲雙主雙從集羣原理圖,其中Name Server是一個幾乎無狀態節點,可集羣部署,節點之間無任何信息同步。

Broker分爲Master與Slave,一個Master可以對應多個Slave,但是一個Slave只能對應一個Master,Master與Slave的對應關係通過指定相同的Broker Name,不同的Broker Id來定義,BrokerId爲0表示Master,非0表示Slave。雙主雙從集羣中有兩個Master,每個Master對應一個Slave。

每個Broker與Name Server集羣中的所有節點建立長連接,定時(每隔30s)註冊Topic信息到所有Name Server。Name Server定時(每隔10s)掃描所有存活Broker的連接,如果Name Server超過2分鐘沒有收到心跳,則Name Server斷開與Broker的鏈接。

Producer與Name Server集羣中的其中一個節點(隨機選擇)建立長連接,定期從Name Server取Topic路由信息,並向提供Topic服務的Master建立長連接,且定時向Master發送心跳。Producer完全無狀態,可集羣部署。

Producer每隔30s(由ClientConfig的pollNameServerInterval)從Name server獲取所有topic隊列的最新情況,這意味着如果Broker不可用,Producer最多30s能夠感知,在此期間內發往Broker的所有消息都會失敗。

Producer每隔30s(由ClientConfig中heartbeatBrokerInterval決定)向所有關聯的Broker發送心跳,Broker每隔10s中掃描所有存活的連接,如果Broker在2分鐘內沒有收到心跳數據,則關閉與Producer的連接。

Consumer與Name Server集羣中的其中一個節點(隨機選擇)建立長連接,定期從Name Server取Topic路由信息,並向提供Topic服務的Master、Slave建立長連接,且定時向Master、Slave發送心跳。Consumer既可以從Master訂閱消息,也可以從Slave訂閱消息,訂閱規則由Broker配置決定。Consumer每隔30s從Name server獲取topic的最新隊列情況,這意味着Broker不可用時,Consumer最多最需要30s才能感知。

Consumer每隔30s(由ClientConfig中heartbeatBrokerInterval決定)向所有關聯的Broker發送心跳,Broker每隔10s掃描所有存活的連接,若某個連接2分鐘內沒有發送心跳數據,則關閉連接,並向該Consumer Group的所有Consumer發出通知,Group內的Consumer重新分配隊列,然後繼續消費。

當Consumer得到Master宕機通知後,轉向Slave消費,Slave不能保證Master的消息100%都同步過來了,因此會有少量的消息丟失。但是一旦Master恢復,未同步過去的消息會被最終消費掉。

以其中一組Master/Slave爲例,配置信息如下所示:

/mnt/rocketmq/conf/2m-2s-sync/broker-a.properties

Master節點配置如下:

brokerClusterName=evcgCluster
brokerIP1=192.168.1.10
brokerIP2=192.168.1.11
brokerName=broker-a
brokerId=0
namesrvAddr=192.168.1.10:9876;192.168.1.20:9876
defaultTopicQueueNums=4
autoCreateTopicEnbale=true
autoCreateSubscriptionGroup=true
listenPort=10912
deleteWhen=04
fileReservedTime=120
mapedFileSizeCommitLog=1073741824
mapedFileSizeConsumeQueue=300000
storePathRootDir=/mnt/rocketmq/store
storePathCommitLog=/mnt/rocketmq/store/commitlog
storePathConsumeQueue=/mnt/rocketmq/store/consumequeue
storePathIndex=/mnt/rocketmq/store/index
storeCheckpoint=/mnt/rocketmq/store/checkpoint
abortFile=/mnt/rocketmq/store/abort
maxMessageSize=65536
brokerRote=SYNC_MASTER
flushDiskType=SYNC_FLUSH

Slave節點配置如下:

brokerClusterName=evcgCluster
brokerIP1=192.168.1.11
brokerName=broker-a
brokerId=1
namesrvAddr=192.168.1.10:9876;192.168.1.20:9876
defaultTopicQueueNums=4
autoCreateTopicEnbale=true
autoCreateSubscriptionGroup=true
listenPort=10912
deleteWhen=04
fileReservedTime=120
mapedFileSizeCommitLog=1073741824
mapedFileSizeConsumeQueue=300000
storePathRootDir=/mnt/rocketmq/store
storePathCommitLog=/mnt/rocketmq/store/commitlog
storePathConsumeQueue=/mnt/rocketmq/store/consumequeue
storePathIndex=/mnt/rocketmq/store/index
storeCheckpoint=/mnt/rocketmq/store/checkpoint
abortFile=/mnt/rocketmq/store/abort
maxMessageSize=65536
brokerRote=SLAVE
flushDiskType=SYNC_FLUSH

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章