RocketMQ分布式集群是通過Broker節(jié)點的Master和Slave配合達(dá)到高可用性的桃犬。
Master和Slave的區(qū)別:在Broker的配置文件中,參數(shù) brokerId的值為0表明這個Broker是Master鲫凶,大于0表明這個Broker是 Slave,同時brokerRole參數(shù)也會說明這個Broker是Master還是Slave。
Master角色的Broker支持讀和寫,Slave角色的Broker僅支持讀陌选,也就是Producer只能和Master角色的Broker連接寫入消息;Consumer可以連接 Master角色的Broker,也可以連接Slave角色的Broker來讀取消息咨油。
PS:Master和Slave的職責(zé)沒什么好說的您炉,實際上所有的產(chǎn)品,Master一般都支持讀和寫役电,而Slave只支持讀赚爵。比如我們在《Redis:主從復(fù)制》和《Redis:集群》中提到的Redis主節(jié)點和Redis從節(jié)點其實也是這樣的職責(zé)劃分。
1. 消息消費高可用
在Consumer的配置文件中法瑟,并不需要設(shè)置是從Master讀還是從Slave 讀冀膝,當(dāng)Master不可用或者繁忙的時候,Consumer會被自動切換到從Slave 讀瓢谢。有了自動切換Consumer這種機制畸写,當(dāng)一個Master角色的機器出現(xiàn)故障后,Consumer仍然可以從Slave讀取消息氓扛,不影響Consumer程序枯芬。這就達(dá)到了消費端的高可用性。
2. 消息發(fā)送高可用
在創(chuàng)建Topic的時候采郎,把Topic的多個Message Queue創(chuàng)建在多個Broker組上(相同Broker名稱千所,不同 brokerId的機器組成一個Broker組),這樣當(dāng)一個Broker組的Master不可用后蒜埋,其他組的Master仍然可用淫痰,Producer仍然可以發(fā)送消息。 RocketMQ目前還不支持把Slave自動轉(zhuǎn)成Master整份,如果機器資源不足待错, 需要把Slave轉(zhuǎn)成Master,則要手動停止Slave角色的Broker烈评,更改配置文 件火俄,用新的配置文件啟動Broker。
3. 消息主從復(fù)制
如果一個Broker組有Master和Slave讲冠,消息需要從Master復(fù)制到Slave上瓜客,有同步和異步兩種復(fù)制方式。
3.1 同步復(fù)制
同步復(fù)制方式是等Master和Slave均寫成功后才反饋給客戶端寫成功狀態(tài)竿开。
在同步復(fù)制方式下谱仪,如果Master出故障, Slave上有全部的備份數(shù)據(jù)否彩,容易恢復(fù)疯攒,但是同步復(fù)制會增大數(shù)據(jù)寫入 延遲,降低系統(tǒng)吞吐量列荔。
3.2 異步復(fù)制
異步復(fù)制方式是只要Master寫成功即可反饋給客戶端寫成功狀態(tài)卸例。
在異步復(fù)制方式下称杨,系統(tǒng)擁有較低的延遲和較高的吞吐量,但是如果Master出了故障筷转,有些數(shù)據(jù)因為沒有被寫 入Slave姑原,有可能會丟失。
3.3 配置
同步復(fù)制和異步復(fù)制是通過Broker配置文件里的brokerRole參數(shù)進(jìn)行設(shè)置的呜舒,這個參數(shù)可以被設(shè)置成ASYNC_MASTER
锭汛、 SYNC_MASTER
、SLAVE
三個值中的一個袭蝗。
3.4 刷盤和復(fù)制
實際應(yīng)用中要結(jié)合業(yè)務(wù)場景唤殴,合理設(shè)置刷盤方式和主從復(fù)制方式, 尤其是SYNC_FLUSH
方式到腥,由于頻繁地觸發(fā)磁盤寫動作朵逝,會明顯降低性能。通常情況下乡范,應(yīng)該把Master和Slave配置成ASYNC_FLUSH
的刷盤方式配名,主從之間配置成SYNC_MASTER
的復(fù)制方式,這樣即使有一臺機器出故障晋辆,仍然能保證數(shù)據(jù)不丟渠脉。
PS:還記得Redis的主從復(fù)制嗎?如果不記得可以參考《Redis:主從復(fù)制》哦瓶佳。