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 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 | 是否启用 DLedger | true |
dLegerGroup | DLedger Raft Group 的名称,建议与 brokerName 保持一致 | RaftNode00 |
dLegerPeers | DLedger 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
参考新集群部署。