跳至主要内容
版本: 5.0

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

如果一切顺利,将出现以下内容

ClusterList

(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 Group。

RocketMQ-on-DLedger Group 是一个 **名称相同** 的 Broker 组,至少需要 3 个节点,通过 Raft 算法自动选举一个 Leader,其他节点作为 Follower,在 Leader 和 Follower 之间复制数据以实现系统高可用。RocketMQ-on-DLedger Group 可以自动故障转移,并保持一致性。RocketMQ-on-DLedger Group 可以水平扩展,即可以部署任意数量的 RocketMQ-on-DLedger Group 向外部提供服务。

1. 新集群部署

1.1 编写配置

每个 RocketMQ-on-DLedger Group 至少需要 3 台机器(本文档假设为 3 台),编写 3 个配置文件,建议参考 conf/dledger 目录下的示例配置文件。关键配置项

名称意义示例
enableDLegerCommitLog是否启用 DLedgertrue
dLegerGroupDLedger Raft Group 的名称,建议与 brokerName 保持一致RaftNode00
dLegerPeersDLedger Group 的节点端口信息,每个节点的配置在同一个组内保持一致。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 Group。
如果旧集群部署在 Master-Slave 模式下,则每个 Master-Slave 组需要转换为 RocketMQ-on-DLedger Group。

2.1 杀死旧 Broker

执行 kill 命令,或调用 bin/mqshutdown broker

2.2 检查旧 Commitlog

RocketMQ-on-DLedger Group 中的每个节点都与旧的 Commitlog 兼容,但 Raft 复制过程只对添加的消息起作用。因此,为了避免出现异常,旧的 Commitlog 必须保持一致。如果旧集群部署在 Master-Slave 模式下,则在关闭后可能不一致。建议使用 md5sum 检查至少 2 个最近的 Commitlog 文件,如果出现不一致,则通过复制来保持一致。

虽然 RocketMQ-on-DLedger Group 可以用 2 个节点部署,但它缺乏故障转移能力(至少 3 个节点才能容忍一个节点故障)。确保 Master 和 Slave 的 Commitlog 一致,然后准备 3 台机器,将旧的 Commitlog 从 Master 复制到这 3 台机器(顺便说一下,复制配置目录)。

然后,继续设置配置。

2.3 修改配置

参考新集群部署。

2.4 重新启动 Broker

参考新集群部署。