侧边栏壁纸
博主头像
ProSayJ 博主等级

Talk is cheap. Show me the code.

  • 累计撰写 43 篇文章
  • 累计创建 16 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

RocketMQ Master 节点挂了会以后发生什么?

YangJian
2025-06-23 / 0 评论 / 0 点赞 / 24 阅读 / 0 字

Rocketmq 的多主多从架构中的 从节点的作用是什么? 生产者发消息都是master的broker接受的对吧?那么消费者读 具体是读到 master的broker 还是selve 的broker 有什么规则呢?

当每个broker 增加了如下的配置

enableSlaveActingMaster=true RocketMQ 4.9.3 或以上版本(推荐 5.x)

某个 master 挂了 会有什么具体的体现? master恢复以后呢?

RocketMQ 多 Master-Slave 模式(异步/同步复制)高可用架构下, Master 节点挂了以后,该集群无法继续执行写操作, 即:

RocketMQ 的 Slave 在 Master 宕机期间,不能接收 Producer 发来的消息。(即不能发送消息到 Slave)

🚧 当 Master 挂掉时会发生什么?

  1. NameServer 中该 Topic 的路由信息仍然指向挂掉的 Master;

  2. Producer 会尝试连接 Master 写入消息,连接失败;

  3. Producer 会报错:No route info for this topic 或 Send failed;

🚫 RocketMQ 没有内建自动将 Producer 的写路由重定向到 Slave 的能力。

✅ 原因解析

RocketMQ 的 Master-Slave 模式是典型的 “主写从读” 架构:

功能角色

是否支持

说明

Producer 写消息到 Slave

不支持

Slave 只是 Master 的备份节点

Consumer 从 Slave 读消息

支持

配置 enableSlaveActingMaster=true 后有效

Slave 在 Master 挂掉时接收 Producer 消息

不支持

没有路由,Producer 无法将消息投递给 Slave

🔁 解决方案建议

要实现更高的可用性和写容忍性,可考虑以下方案:

✅ 方案一:部署多 Master 模式(多主多从)

  • 每个 Broker 是一个独立的 Master;

  • 容错性高,某个 Master 挂了不会影响其他;

  • 推荐生产使用,需搭配多个 NameServer。

✅ 方案二:RocketMQ 5.x + Proxy 网关模式(未来趋势)

  • 使用 Proxy 统一接收 Producer 消息,代理转发;

  • 能隐藏 Broker 状态,提高写入可用性;


✅ 一、从节点的作用是什么?

在 RocketMQ 中,多主多从(Master-Slave)结构的从节点主要起 备份和容灾 作用:

功能点

描述

备份主节点数据

Slave 会通过同步/异步复制的方式,实时(或延迟)备份 Master 上的消息数据(CommitLog)

Master 宕机时备用

默认情况下,从节点不接收写请求,仅作为只读节点使用(enableSlaveActingMaster=false)

提高读性能(可配置)

某些模式下 Consumer 可以从 Slave 读取消息(读写分离)

保障 HA(高可用)能力

保证主节点故障时不会完全丢失数据,并能尽快恢复服务


✅ 二、消息的发送与消费的路由规则?

1. 消息发送(Producer ➝ Broker)

默认行为是:

  • 只发往 Master 节点

  • 取决于 Topic 在哪些 Master 上创建,Producer 会向这些 Master 轮询或顺序发消息(或使用 MessageQueueSelector 取模)

🚫 Producer 不会主动发消息到 Slave 节点!


2. 消息消费(Consumer ➝ Broker)

RocketMQ 支持 Consumer 从 Master 和 Slave 中读取消息,但行为取决于以下配置:

配置项

说明

默认值

brokerSuspendMaxTimeMillis

Broker端允许挂起消费请求的最大时间

1000

brokerConsumeFromWhichBroker

控制消费者从哪个 Broker 拉取数据(例如:优先 Master、随机、轮询)

Master 优先

brokerRole

Broker 角色(SYNC_MASTER / ASYNC_MASTER / SLAVE)

-

具体规则总结如下:

情况

说明

默认(enableSlaveActingMaster=false)

Consumer 默认只从 Master 拉消息

主节点挂了

如果没有 actingMaster,从节点也不会自动接收 Consumer 拉请求,除非配置特殊策略

开启读写分离(配置 enablePushSlave)

可以配置消费者允许从 Slave 拉消息(默认 RocketMQ 不推荐这样做)


✅ 三、设置 enableSlaveActingMaster=true 后的行为变化?

RocketMQ 4.5+ 开始支持

➤ 作用:

当某个 Master Broker 宕机后,其绑定的 Slave 节点自动“代理”Master 角色

场景

行为变化

Producer 发送消息

会路由到 Acting Master(即原 Slave)

Consumer 拉取消息

也可以从 Acting Master 读取消息

NameServer 的路由元数据

会将 Slave 作为临时 Master 提供给 Producer 和 Consumer

Master 恢复上线

Acting Master 自动降级为普通 Slave,Master 恢复处理写请求


✅ 四、Master 恢复上线以后:

当重新启动挂掉的 Master 后,Acting Master 角色自动取消,主节点重新接收写/读请求,Slave 恢复为只读备份行为取决于 你使用的是哪种主从同步模式

✅ 异步复制(ASYNC_MASTER,默认)

  • Slave 在 Master 宕机期间接收到的消息(通过 Consumer 消费)不会同步回 Master

  • Master 启动后仍是 Master,不会自动补齐数据

  • 存在消息不一致、数据丢失风险

✅ 同步复制(SYNC_MASTER)

  • 每条消息都必须在 Master 和 Slave 都写入成功才算成功;

  • Master 恢复后仍保持与 Slave 同步;

  • 数据一致性强,不丢消息;

  • 但性能略低。

✅ 五、具体行为总结:

问题

回答

Producer 发送消息是发给 Master 吗?

是的,只会投递到 Master

Consumer 是从 Master 读取还是 Slave?

默认是 Master(可以配置支持 Slave 拉取)

enableSlaveActingMaster=true 后 Master 宕机有什么变化?

Slave 自动代理为 Acting Master,Producer/Consumer 自动连接它

Master 恢复后会怎样?

Acting Master 角色自动取消,主节点重新接收写/读请求,Slave 恢复为只读备份


✅ 可视化示意图(变化流程)

💥 Master 宕机前:
Producer --> Master-A
Consumer --> Master-A

Slave-A <- 实时复制 Master-A 数据

💡 Master 宕机 + enableSlaveActingMaster=true:
Producer --> Slave-A(Acting Master)
Consumer --> Slave-A(Acting Master)

🔁 Master 恢复后:
Producer --> Master-A(恢复)
Consumer --> Master-A(恢复)

Slave-A <-- 恢复为只读从节点

✅ 建议实践方式:

  • 如果追求 高可用、写服务不中断,在所有 Slave 的配置中 开启 enableSlaveActingMaster=true

  • 如果你使用异步复制(ASYNC_SLAVE),即使 Acting Master 期间可能丢少量数据,也能接受

  • 如果要求高一致性,请考虑 DLedger(同步复制 + Raft 协议)-5.X 版本


5.0速览-2-b3f035c1b5b2088396c2df5817ce487d.jpeg

https://rocketmq.apache.org/zh/assets/images/5.0%E9%80%9F%E8%A7%88-2-b3f035c1b5b2088396c2df5817ce487d.jpeg

0

评论区