1、RocketMQ--DLedger 模式 (多副本基于 Raft 协议)
这是 RocketMQ 4.5 版本后引入的架构,也是目前社区和云厂商(如阿里云)主推的模式。
- 原理:在一组 Broker(通常 3 节点)中,通过 Raft 协议选举出 Leader。Leader 负责读写,Follower 负责同步。如果 Leader 宕机,剩余节点会自动选举出新的 Leader。
- 优点:
- 自动故障转移:无需人工介入,秒级完成主从切换,对业务几乎无感知。
- 数据一致性高:基于 Raft 多数派写入机制,只要半数以上节点写入成功即认为成功,避免了传统模式下的数据丢失风险。
- 运维简单:不需要部署额外的 NameServer 哈哈镜或复杂的脚本。
- 缺点:
- 性能损耗:因为是同步复制且涉及 Raft 协议投票,相比异步模式,吞吐量会稍有下降(但通常能满足绝大部分业务需求)。
- 资源要求:至少需要 3 个节点组成一个 Broker 组。
适用场景:
- 对数据可靠性要求极高(金融、支付、订单核心链路)。
- 不希望半夜起来处理主节点故障的运维团队。
- 绝大多数现代生产环境的首选。
2、环境准备
| IP | 配置 | 操作系统 | 主机名 | 角色 |
|---|---|---|---|---|
| 172.16.10.141(Leader) | 2C4G | rockylinux9 | component1 | DLedger,Broker,NameServer |
| 172.16.10.142(Follower1) | 2C4G | rockylinux9 | component2 | DLedger,Broker,NameServer |
| 172.16.10.143(Follower2) | 2C4G | rockylinux9 | component3 | DLedger,Broker,NameServer |
3、部署集群
3.1 jdk环境
dnf install -y java-1.8.0
java --version

3.2 maven环境
dnf install maven-openjdk8 -y
mvn -v

3.3 部署DLedger
git clone https://github.com/openmessaging/dledger.git
cd dledger
mvn clean install -DskipTests -Dgpg.skip=true

3.4 部署rocketmq
wget https://dist.apache.org/repos/dist/release/rocketmq/5.4.0/rocketmq-all-5.4.0-bin-release.zip
unzip /root/rocketmq-all-5.4.0-bin-release.zip -d /data/
3.4.1 修改配置
cd rocketmq-all-5.4.0-bin-release/conf/dledger
编辑leader的broker-n0.conf
#修改服务端地址
namesrvAddr=172.16.10.141:9876;172.16.10.142:9876;172.16.10.143:9876
#修改broker1,broker2,broker3 的 dLegerSelfId
dLegerPeers=n0-172.16.10.141:40911;n1-172.16.10.142:40912;n2-172.16.10.143:40913

编辑follower1的broker-n1.conf
#修改服务端地址
namesrvAddr=172.16.10.141:9876;172.16.10.142:9876;172.16.10.143:9876
#修改broker1,broker2,broker3 的 dLegerSelfId
dLegerPeers=n0-172.16.10.141:40911;n1-172.16.10.142:40912;n2-172.16.10.143:40913
编辑follower2的broker-n2.conf
#修改服务端地址
namesrvAddr=172.16.10.141:9876;172.16.10.142:9876;172.16.10.143:9876
#修改broker1,broker2,broker3 的 dLegerSelfId
dLegerPeers=n0-172.16.10.141:40911;n1-172.16.10.142:40912;n2-172.16.10.143:40913
3.4.2 启动集群
在内存有限的情况下,编辑jvm参数
vim bin/runbroker.sh
vim bin/runserver.sh
-server -Xms512m -Xmx512m -Xmn256m
启动leader
nohup sh bin/mqnamesrv > nohupNameserv.log 2>&1 &
nohup sh bin/mqbroker > nohupBroker.log -c conf/dledger/broker-n0.conf 2>&1 &

启动follower1
nohup sh bin/mqnamesrv > nohupNameserv.log 2>&1 &
nohup sh bin/mqbroker > nohupBroker.log -c conf/dledger/broker-n1.conf 2>&1 &
启动follower2
nohup sh bin/mqnamesrv > nohupNameserv.log 2>&1 &
nohup sh bin/mqbroker > nohupBroker.log -c conf/dledger/broker-n2.conf 2>&1 &
3.4.3 查看是否启动成功
jps

3.4.4 验证集群
sh bin/mqadmin clusterList -n 127.0.0.1:9876
true:表示该节点是Leader。
- 它是当前组内唯一负责读写操作的节点。
false:表示该节点是Follower。
- 它处于备用状态,只负责从 Leader 同步数据,并参与投票。

3.4.5 验证高可用
#杀掉master的进程
sh bin/mqshutdown broker
#重启原leader
nohup sh bin/mqnamesrv > nohupNameserv.log 2>&1 &
nohup sh bin/mqbroker > nohupBroker.log -c conf/dledger/broker-n0.conf 2>&1 &
#由此可见leader已经被切换到follower节点

4、部署可视化面板
git clone https://github.com/apache/rocketmq-dashboard.git
cd rocketmq-dashboard
mvn clean package -Dmaven.test.skip=true
java -jar target/rocketmq-dashboard-2.1.1-SNAPSHOT.jar
如本机环境为jdk8,实际编译版本需要jdk17,可以设置临时环境变量构建
export JAVA_HOME=/data/jdk-17.0.17+10
export PATH=$JAVA_HOME/bin:$PATH
mvn clean package -Dmaven.test.skip=true



5、设置守护进程服务
5.1 rocketmq-nameserver
cat > /usr/lib/systemd/system/rocketmq-nameserver.service << EOF
[Unit]
Description=rocketmq-nameserver
Documentation=http://mirror.bit.edu.cn/apache/rocketmq/
After=network.target
[Service]
Type=sample
User=root
ExecStart=/data/rocketmq-all-5.4.0-bin-release/bin/mqnamesrv
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
Restart=0
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
5.2 rocketmq-broker
cat > /usr/lib/systemd/system/rocketmq-broker.service << EOF
[Unit]
Description=rocketmq-broker
Documentation=http://mirror.bit.edu.cn/apache/rocketmq/
After=network.target
[Service]
Type=sample
User=root
ExecStart=/data/rocketmq-all-5.4.0-bin-release/bin/mqbroker -c /data/rocketmq-all-5.4.0-bin-release/conf/dledger/broker-n0.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
Restart=0
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
5.3 rocketmq-dashboard
cat > /usr/lib/systemd/system/rocketmq-dashboard.service << EOF
[Unit]
Description=RocketMQ Dashboard
After=network.target
[Service]
User=root
ExecStart=/data/jdk-17.0.17+10/bin/java -jar /data/rocketmq-dashboard/target/rocketmq-dashboard-2.1.1-SNAPSHOT.jar
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
EOF
评论区