rocketmq 如何保证高可用_RocketMq容灾、高可用方案
一、實現分布式集群多副本的三種方式
1.1 M/S模式
即Master/Slaver模式。該模式在過去使用的最多,RocketMq之前也是使用這樣的主從模式來實現的。主從模式分為同步模式和異步模式,區別是在同步模式下只有主從復制完畢才會返回給客戶端;而在異步模式中,主從的復制是異步的,不用等待即可返回。
同步模式
同步模式特點:高延遲、低吞吐、無數據丟失(發生故障時)、自動故障轉移、強一致性
異步模式
異步模式特點:低延遲、高吞吐、少量數據丟失(主掛掉時)、平均修復時間較長、最終一致性
1.2 基于zookeeper服務
image.png
和M/S模式相比zookeeper模式是自動選舉的主節點,不過rocketMq暫時不支持zookeeper,且基于ZooKeeper的服務也帶來一個比較嚴重的問題:依賴加重。因為運維ZooKeeper是一件很復雜的事情。
1.3 基于raft
Raft
相比zookeeper,raft自身就可以實現選舉,raft通過投票的方式實現自身選舉leader。去除額外依賴。目前RocketMq 4.5.0已經支持
二、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 定位是一個工業級的 Java Library,可以友好地嵌入各類 Java 系統中,滿足其高可用、高可靠、強一致的需求。Dledger是基于日志實現的,只擁有日志的寫入和讀出接口,且對順序讀出和隨機讀出做了優化。
DLedger 的實現大體可以分為以下兩個部分: 1.選舉 Leader 2.復制日志
image.png
2.1 Dledger在RocketMq的實現
image.png
實現方式:
DLedgerCommitlog 用來代替現有的 Commitlog 存儲實際消息內容,它通過包裝一個 DLedgerServer 來實現復制;
依靠 DLedger 的直接存取日志的特點,消費消息時,直接從 DLedger 讀取日志內容作為消息返回給客戶端;
依靠 DLedger 的 Raft 選舉功能,通過 RoleChangeHandler 把角色變更透傳給 RocketMQ 的Broker,從而達到主備自動切換的目標
三、 RocketMq-Dledger集群搭建
一下主要介紹如何部署自動容災切換的 RocketMQ-on-DLedger Group。
RocketMQ-on-DLedger Group 是指一組相同名稱的 Broker,至少需要 3 個節點,通過 Raft 自動選舉出一個 Leader,其余節點 作為 Follower,并在 Leader 和 Follower 之間復制數據以保證高可用。
RocketMQ-on-DLedger Group 能自動容災切換,并保證數據一致。
RocketMQ-on-DLedger Group 是可以水平擴展的,也即可以部署任意多個 RocketMQ-on-DLedger Group 同時對外提供服務。
3.1 源碼構建
3.1.1構建Dledger
git clone https://github.com/openmessaging/openmessaging-storage-dledger.git
cd openmessaging-storage-dledger
mvn clean install -DskipTests
3.1.2 構建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 至少準備三臺機器(本文假設為 3)。
編寫 3 個配置文件,建議參考 conf/dledger 目錄下的配置文件樣例。
關鍵配置介紹:
name
含義
舉例
enableDLegerCommitLog
是否啟動 DLedger
true
dLegerGroup
DLedger Raft Group的名字,建議和 brokerName 保持一致
RaftNode00
dLegerPeers
DLedger Group 內各節點的端口信息,同一個 Group 內的各個節點配置必須要保證一致
n0-127.0.0.1:40911;n1-127.0.0.1:40912;n2-127.0.0.1:40913
dLegerSelfId
節點 id, 必須屬于 dLegerPeers 中的一個;同 Group 內各個節點要唯一
n0
sendMessageThreadPoolNums
發送線程個數,建議配置成 Cpu 核數
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 &
四、容災、高可用方案推薦
目前RocketMq主要有兩種選擇
1.M/S
2.Dledger模式
兩種的優缺點:
Master/Slave
優點:實現簡單
缺點:不能自動控制節點切換,一旦出了問題,需要人為介入。
Dledger
優點:可以自己協調,并且去除依賴。
缺點: 只有RocketMq 4.5.0支持
經過上文的分析。推薦使用Dledger
總結
以上是生活随笔為你收集整理的rocketmq 如何保证高可用_RocketMq容灾、高可用方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 坚持不懈,直到成功
- 下一篇: [编程思想] POP OOP AOP