rocketmq双主双从成功部署的关键在于角色严格对齐、配置路径隔离与启动顺序规范:broker-a与broker-a-s必须同名、brokerid分别为0和1、brokerrole设为sync_master/slave,配置文件须置于conf/2m-2s-sync目录下,namesrvaddr需完整分号分隔且hosts可解析,nameserver先启稳再依次启动各组master与slave,storepathrootdir必须独立隔离。

rocketmq 双主双从不是“配好四个节点就能跑”,关键在角色对齐、配置隔离和启动顺序。直接上手容易卡在 broker 启动失败、namesrvAddr 连不上、或主从状态不生效——绝大多数问题出在配置路径混淆、brokerId 冲突、或 brokerRole 与 brokerName 搭配错误。
broker-a.properties 和 broker-b-s.properties 必须严格按组配对
双主双从本质是两组独立的主从对:broker-a(Master)配 broker-a-s(Slave),broker-b(Master)配 broker-b-s(Slave)。不能混用,比如把 broker-a 的 brokerId=0 和 broker-b-s 的 brokerId=1 绑一起——brokerName 必须完全一致才被识别为同一组。
-
broker-a.properties中:brokerName=broker-a、brokerId=0、brokerRole=SYNC_MASTER -
broker-a-s.properties中:brokerName=broker-a、brokerId=1、brokerRole=SLAVE -
broker-b.properties中:brokerName=broker-b、brokerId=0、brokerRole=SYNC_MASTER -
broker-b-s.properties中:brokerName=broker-b、brokerId=1、brokerRole=SLAVE
所有配置文件必须放在 conf/2m-2s-sync/ 目录下(不是 conf/ 根目录),否则 mqbroker -c 会读错参数。
namesrvAddr 要写全且可解析,别只填一个
namesrvAddr 是 broker 启动时注册和发现的唯一入口,必须包含全部 NameServer 实例地址,用分号分隔,例如:namesrvAddr=rocketmq1:9876;rocketmq2:9876。如果只写一个,当该 NameServer 挂掉,broker 就无法注册,日志里反复报 No route info of this topic 或 CONNECTION TIMEOUT。
- 确保
/etc/hosts中每个rocketmqX都映射到对应机器的真实 IP,不能只配本机 - 防火墙要放行
9876(NameServer)和10911(broker默认listenPort)端口 - 启动前用
telnet rocketmq1 9876在每台 broker 机器上验证连通性
启动顺序和命令不能颠倒
NameServer 必须先全部启动并稳定(日志出现 The Name Server boot success),再启动 broker;且同一组主从不能同时启动——建议 Master 先起稳,再起 Slave。
- 启动
NameServer(每台都执行):nohup sh bin/mqnamesrv & - 启动 Master:
nohup sh bin/mqbroker -n "rocketmq1:9876;rocketmq2:9876" -c conf/2m-2s-sync/broker-a.properties & - 等 30 秒,确认
broker-a日志有Register Broker to name server OK,再启动 Slave:nohup sh bin/mqbroker -n "rocketmq1:9876;rocketmq2:9876" -c conf/2m-2s-sync/broker-a-s.properties & - 重复上述步骤启动
broker-b和broker-b-s
别图省事用同一个 -n 参数启动所有 broker——brokerId 和 brokerName 不匹配会导致注册覆盖或拒绝注册。
storePathRootDir 路径必须隔离,不能共用
每个 broker 实例(包括主从)的存储目录必须独立,否则 commitlog 冲突、消息丢失、甚至 JVM 崩溃。常见错误是四台机器都指向 /root/svr/rocketmq/data/store。
-
broker-a:storePathRootDir=/data/rocketmq/store-a -
broker-a-s:storePathRootDir=/data/rocketmq/store-a-s -
broker-b:storePathRootDir=/data/rocketmq/store-b -
broker-b-s:storePathRootDir=/data/rocketmq/store-b-s
路径不存在就提前 mkdir -p,权限设为 rocketmq 用户可读写;别指望 broker 自动建全路径——它只建一级子目录,深层缺失会静默失败。
brokerRole 是否生效。启动后进任意一台机器,执行 sh bin/mqadmin clusterList -n rocketmq1:9876,输出里每组 broker-a 后面必须带 SYNC_MASTER,broker-a-s 后面必须是 SLAVE。如果全是 ASYNC_MASTER,说明 brokerRole 没生效——八成是配置文件路径错了,或者用了 conf/broker.conf 而不是 conf/2m-2s-sync/xxx.properties。











