跳到主要内容
版本: 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 表示主节点,其他为从节点)

启动成功后,生产者可以生成消息,然后测试故障转移场景。

执行以下命令快速停止集群

$ 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. 升级旧集群

如果旧集群以主模式部署,则每个主节点需要转换为一个 RocketMQ-on-DLedger Group。
如果旧集群以主从模式部署,则每个主从组需要转换为一个 RocketMQ-on-DLedger Group。

2.1 杀死旧 Broker

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

2.2 检查旧 Commitlog

RocketMQ-on-DLedger group 中的每个节点都与旧 Commitlog 兼容,但 Raft 复制过程仅适用于新增消息。因此,为避免出现异常,旧 Commitlog 必须保持一致。如果旧集群以主从模式部署,在关闭后可能存在不一致。建议使用 md5sum 检查最近的至少 2 个 Commitlog 文件,如果出现不一致,通过复制保持一致。

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

然后,继续设置配置。

2.3 修改配置

参考新集群部署。

2.4 重启 Broker

参考新集群部署。