RocketMq容災(zāi)、高可用方案

一、實(shí)現(xiàn)分布式集群多副本的三種方式

1.1 M/S模式

即Master/Slaver模式。該模式在過去使用的最多,RocketMq之前也是使用這樣的主從模式來實(shí)現(xiàn)的。主從模式分為同步模式和異步模式,區(qū)別是在同步模式下只有主從復(fù)制完畢才會返回給客戶端;而在異步模式中,主從的復(fù)制是異步的,不用等待即可返回。

同步模式

同步模式特點(diǎn):高延遲、低吞吐、無數(shù)據(jù)丟失(發(fā)生故障時(shí))、自動故障轉(zhuǎn)移、強(qiáng)一致性
異步模式

異步模式特點(diǎn):低延遲、高吞吐、少量數(shù)據(jù)丟失(主掛掉時(shí))、平均修復(fù)時(shí)間較長、最終一致性

1.2 基于zookeeper服務(wù)

image.png

和M/S模式相比zookeeper模式是自動選舉的主節(jié)點(diǎn),不過rocketMq暫時(shí)不支持zookeeper,且基于ZooKeeper的服務(wù)也帶來一個(gè)比較嚴(yán)重的問題:依賴加重。因?yàn)檫\(yùn)維ZooKeeper是一件很復(fù)雜的事情。

1.3 基于raft

Raft

相比zookeeper,raft自身就可以實(shí)現(xiàn)選舉,raft通過投票的方式實(shí)現(xiàn)自身選舉leader。去除額外依賴。目前RocketMq 4.5.0已經(jīng)支持

二、Dledger介紹(摘自github)

GitHub地址:https://github.com/openmessaging/openmessaging-storage-dledger/blob/master/docs/cn/introduction_dledger.md#dledger-%E7%9A%84%E5%AE%9E%E7%8E%B0
Dledger是一個(gè)基于Raft的 Commitlog 存儲 Library。DLedger 定位是一個(gè)工業(yè)級的 Java Library,可以友好地嵌入各類 Java 系統(tǒng)中,滿足其高可用、高可靠、強(qiáng)一致的需求。Dledger是基于日志實(shí)現(xiàn)的,只擁有日志的寫入和讀出接口,且對順序讀出和隨機(jī)讀出做了優(yōu)化。
DLedger 的實(shí)現(xiàn)大體可以分為以下兩個(gè)部分: 1.選舉 Leader 2.復(fù)制日志

image.png

2.1 Dledger在RocketMq的實(shí)現(xiàn)

image.png

實(shí)現(xiàn)方式:

  1. DLedgerCommitlog 用來代替現(xiàn)有的 Commitlog 存儲實(shí)際消息內(nèi)容,它通過包裝一個(gè) DLedgerServer 來實(shí)現(xiàn)復(fù)制;
  2. 依靠 DLedger 的直接存取日志的特點(diǎn),消費(fèi)消息時(shí),直接從 DLedger 讀取日志內(nèi)容作為消息返回給客戶端;
  3. 依靠 DLedger 的 Raft 選舉功能,通過 RoleChangeHandler 把角色變更透傳給 RocketMQ 的Broker,從而達(dá)到主備自動切換的目標(biāo)

三、 RocketMq-Dledger集群搭建

一下主要介紹如何部署自動容災(zāi)切換的 RocketMQ-on-DLedger Group。

  • RocketMQ-on-DLedger Group 是指一組相同名稱的 Broker,至少需要 3 個(gè)節(jié)點(diǎn),通過 Raft 自動選舉出一個(gè) Leader,其余節(jié)點(diǎn) 作為 Follower,并在 Leader 和 Follower 之間復(fù)制數(shù)據(jù)以保證高可用。
  • RocketMQ-on-DLedger Group 能自動容災(zāi)切換,并保證數(shù)據(jù)一致。
  • RocketMQ-on-DLedger Group 是可以水平擴(kuò)展的,也即可以部署任意多個(gè) RocketMQ-on-DLedger Group 同時(shí)對外提供服務(wù)。

3.1 源碼構(gòu)建

3.1.1構(gòu)建Dledger

git clone https://github.com/openmessaging/openmessaging-storage-dledger.git

cd openmessaging-storage-dledger

mvn clean install -DskipTests

3.1.2 構(gòu)建RocketMq

git clone https://github.com/apache/rocketmq.git

cd rocketmq

git checkout -b store_with_dledger origin/store_with_dledger

mvn -Prelease-all -DskipTests clean install -U

3.2編寫配置

每個(gè) RocketMQ-on-DLedger Group 至少準(zhǔn)備三臺機(jī)器(本文假設(shè)為 3)。
編寫 3 個(gè)配置文件,建議參考 conf/dledger 目錄下的配置文件樣例。
關(guān)鍵配置介紹:

name 含義 舉例
enableDLegerCommitLog 是否啟動 DLedger true
dLegerGroup DLedger Raft Group的名字,建議和 brokerName 保持一致 RaftNode00
dLegerPeers DLedger Group 內(nèi)各節(jié)點(diǎn)的端口信息,同一個(gè) Group 內(nèi)的各個(gè)節(jié)點(diǎn)配置必須要保證一致 n0-127.0.0.1:40911;n1-127.0.0.1:40912;n2-127.0.0.1:40913
dLegerSelfId 節(jié)點(diǎn) id, 必須屬于 dLegerPeers 中的一個(gè);同 Group 內(nèi)各個(gè)節(jié)點(diǎn)要唯一 n0
sendMessageThreadPoolNums 發(fā)送線程個(gè)數(shù),建議配置成 Cpu 核數(shù) 16

這里貼出 conf/dledger/broker-n0.conf 的配置舉例。

brokerClusterName = RaftCluster
brokerName=RaftNode00
listenPort=30911
namesrvAddr=127.0.0.1:9876
storePathRootDir=/tmp/rmqstore/node00
storePathCommitLog=/tmp/rmqstore/node00/commitlog
enableDLegerCommitLog=true
dLegerGroup=RaftNode00
dLegerPeers=n0-127.0.0.1:40911;n1-127.0.0.1:40912;n2-127.0.0.1:40913
## must be unique
dLegerSelfId=n0
sendMessageThreadPoolNums=16

3.3 啟動Broker

nohup sh bin/mqbroker -c conf/dledger/xxx-n0.conf & 
nohup sh bin/mqbroker -c conf/dledger/xxx-n1.conf & 
nohup sh bin/mqbroker -c conf/dledger/xxx-n2.conf &

四、容災(zāi)、高可用方案推薦

目前RocketMq主要有兩種選擇
1.M/S
2.Dledger模式
兩種的優(yōu)缺點(diǎn):

  • Master/Slave
    優(yōu)點(diǎn):實(shí)現(xiàn)簡單
    缺點(diǎn):不能自動控制節(jié)點(diǎn)切換,一旦出了問題,需要人為介入。

  • Dledger
    優(yōu)點(diǎn):可以自己協(xié)調(diào),并且去除依賴。
    缺點(diǎn): 只有RocketMq 4.5.0支持

經(jīng)過上文的分析。推薦使用Dledger

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容