rocketmq 如何保证高可用_RocketMq容灾、高可用方案
一、實(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ù)也帶來一個比較嚴(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是一個基于Raft的 Commitlog 存儲 Library。DLedger 定位是一個工業(yè)級的 Java Library,可以友好地嵌入各類 Java 系統(tǒng)中,滿足其高可用、高可靠、強(qiáng)一致的需求。Dledger是基于日志實(shí)現(xiàn)的,只擁有日志的寫入和讀出接口,且對順序讀出和隨機(jī)讀出做了優(yōu)化。
DLedger 的實(shí)現(xiàn)大體可以分為以下兩個部分: 1.選舉 Leader 2.復(fù)制日志
image.png
2.1 Dledger在RocketMq的實(shí)現(xiàn)
image.png
實(shí)現(xiàn)方式:
DLedgerCommitlog 用來代替現(xiàn)有的 Commitlog 存儲實(shí)際消息內(nèi)容,它通過包裝一個 DLedgerServer 來實(shí)現(xiàn)復(fù)制;
依靠 DLedger 的直接存取日志的特點(diǎn),消費(fèi)消息時(shí),直接從 DLedger 讀取日志內(nèi)容作為消息返回給客戶端;
依靠 DLedger 的 Raft 選舉功能,通過 RoleChangeHandler 把角色變更透傳給 RocketMQ 的Broker,從而達(dá)到主備自動切換的目標(biāo)
三、 RocketMq-Dledger集群搭建
一下主要介紹如何部署自動容災(zāi)切換的 RocketMQ-on-DLedger Group。
RocketMQ-on-DLedger Group 是指一組相同名稱的 Broker,至少需要 3 個節(jié)點(diǎn),通過 Raft 自動選舉出一個 Leader,其余節(jié)點(diǎn) 作為 Follower,并在 Leader 和 Follower 之間復(fù)制數(shù)據(jù)以保證高可用。
RocketMQ-on-DLedger Group 能自動容災(zāi)切換,并保證數(shù)據(jù)一致。
RocketMQ-on-DLedger Group 是可以水平擴(kuò)展的,也即可以部署任意多個 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編寫配置
每個 RocketMQ-on-DLedger Group 至少準(zhǔn)備三臺機(jī)器(本文假設(shè)為 3)。
編寫 3 個配置文件,建議參考 conf/dledger 目錄下的配置文件樣例。
關(guān)鍵配置介紹:
name
含義
舉例
enableDLegerCommitLog
是否啟動 DLedger
true
dLegerGroup
DLedger Raft Group的名字,建議和 brokerName 保持一致
RaftNode00
dLegerPeers
DLedger Group 內(nèi)各節(jié)點(diǎn)的端口信息,同一個 Group 內(nèi)的各個節(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 中的一個;同 Group 內(nèi)各個節(jié)點(diǎn)要唯一
n0
sendMessageThreadPoolNums
發(fā)送線程個數(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
總結(jié)
以上是生活随笔為你收集整理的rocketmq 如何保证高可用_RocketMq容灾、高可用方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 坚持不懈,直到成功
- 下一篇: [编程思想] POP OOP AOP