目 录CONTENT

文章目录

RocketMQ--DLedger 模式

JamKing
2026-01-30 / 0 评论 / 0 点赞 / 4 阅读 / 0 字 / 正在检测是否收录...

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

image-Qdae.png

3.2 maven环境

dnf install maven-openjdk8 -y
mvn -v

image-OoOt.png

3.3 部署DLedger

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

image-MoUU.png

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

image-WEEG.png

编辑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 &

image-lOwB.png

启动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

image-iocP.png

3.4.4 验证集群

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

image-LEzG.png

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节点

image-YjYU.png

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

image-cNAf.png

image-LnDN.png

image-QmhV.png

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
0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区