DLedger
DLedger 快速部署
前言
DLedger 是一組基於 Raft 協定的分散式記錄儲存元件。部署 RocketMQ 時,您可以選擇使用 DLedger 來取代原生複本儲存機制。本文檔主要介紹如何建置和部署基於 DLedger 的自動故障轉移 RocketMQ 集群。
1. 從原始碼建置
建置階段分為兩部分,應先建置 DLedger,然後再建置 RocketMQ。
1.1 建置 DLedger
$ git clone https://github.com/openmessaging/dledger.git
$ cd dledger
$ mvn clean install -DskipTests
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
2. 快速部署
建置成功後
#{rocketmq-version} replace with rocketmq actual version. example: 5.1.0
$ cd distribution/target/rocketmq-{rocketmq-version}/rocketmq-{rocketmq-version}
$ sh bin/dledger/fast-try.sh start
如果上述命令執行成功,則使用 mqadmin 操作命令檢查叢集狀態。
$ sh bin/mqadmin clusterList -n 127.0.0.1:9876
如果一切順利,將會出現以下內容
(BID 為 0 表示 Master,其餘為 Follower)
啟動成功後,生產者可以生產訊息,然後測試故障轉移場景。
執行以下命令可以快速停止叢集
$ sh bin/dledger/fast-try.sh stop
快速部署,預設組態在目錄 conf/dledger 中,預設儲存路徑為 /tmp/rmqstore。
3. 故障轉移
部署成功後,終止 Leader 程序(以上述範例來說,終止綁定埠 30931 的程序),然後等待 10 秒,使用 clusterList 命令檢查叢集狀態,你會發現 Leader 已切換到另一個節點。
Dledger 叢集部署
本文檔介紹如何部署自動故障轉移 RocketMQ-on-DLedger 群組。
RocketMQ-on-DLedger 群組是一個具有相同名稱的代理群組,需要至少 3 個節點,自動透過 Raft 演算法選出一個 Leader,其餘作為 Follower,在 Leader 和 Follower 之間複製資料以實現系統高可用性。RocketMQ-on-DLedger 群組可以自動故障轉移,並保持一致性。RocketMQ-on-DLedger 群組可以橫向擴充,也就是說,可以部署任何 RocketMQ-on-DLedger 群組對外提供服務。
1. 新叢集部署
1.1 編寫組態
每個 RocketMQ-on-DLedger 群組至少需要 3 台機器。(本文檔假設為 3 台)編寫 3 個組態檔,建議參考 conf/dledger 目錄中的範例組態檔。主要組態項目
名稱 | 意義 | 範例 |
---|---|---|
enableDLegerCommitLog | 是否啟用 DLedger | true |
dLegerGroup | DLedger Raft 群組名稱,建議與 brokerName 保持一致 | RaftNode00 |
dLegerPeers | DLedger 群組的節點埠資訊,同一個群組中每個節點的組態保持一致。 | n0-127.0.0.1:40911;n1-127.0.0.1:40912;n2-127.0.0.1:40913 |
dLegerSelfId | 節點 ID,必須屬於 dLegerPeers;同一個群組中每個節點唯一。 | 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
1.2 啟動 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 &
2. 升級舊叢集
若舊叢集以 Master 模式部署,則每個 Master 都需要轉換成一個 RocketMQ-on-DLedger 集群。
若舊叢集以 Master-Slave 模式部署,則每個 Master-Slave 集群都需要轉換成一個 RocketMQ-on-DLedger 集群。
2.1 終止舊 Broker
執行 kill 指令,或呼叫 bin/mqshutdown broker
。
2.2 檢查舊 Commitlog
RocketMQ-on-DLedger 集群中的每個節點都與舊 Commitlog 相容,但 Raft 複製程序僅對新增訊息運作。因此,為避免發生例外狀況,舊 Commitlog 必須一致。若舊叢集以 Master-Slave 模式部署,則關閉後可能會不一致。建議使用 md5sum 檢查至少 2 個最近的 Commitlog 檔案,若發生不一致,請透過複製來維護一致性。
儘管 RocketMQ-on-DLedger 集群可以使用 2 個節點部署,但它缺乏故障轉移能力(至少 3 個節點才能容忍一個節點故障)。請確保 Master 和 Slave 的 Commitlog 一致,然後準備 3 台機器,將舊 Commitlog 從 Master 複製到這 3 台機器(順便說一下,複製設定目錄)。
然後,繼續設定設定檔。
2.3 修改設定檔
請參閱新的叢集部署。
2.4 重新啟動 Broker
請參閱新的叢集部署。