MST

星途 面试题库

面试题:消息队列RocketMQ中如何实现主从架构以保障高可用?

请阐述RocketMQ主从架构的工作原理,以及在这种架构下是如何保证消息的可靠传递和系统的高可用性的,包括主从节点之间的数据同步机制等。
19.2万 热度难度
后端开发消息队列

知识考点

AI 面试

面试题答案

一键面试

RocketMQ主从架构工作原理

  1. 整体架构概述:RocketMQ主从架构中,每个Broker集群包含一个Master节点和多个Slave节点。Master负责处理客户端的读写请求,Slave主要用于数据备份,当Master出现故障时,部分Slave可切换为Master继续提供服务。
  2. 消息读写流程
    • 写消息:生产者将消息发送到Master节点,Master接收到消息后,会将消息写入本地CommitLog文件,并向Slave节点同步数据。
    • 读消息:消费者默认从Master节点读取消息。在一些配置下,也可从Slave节点读取消息,这通常用于减轻Master的读压力,尤其是在消息消费场景对实时性要求不高的情况下。

保证消息可靠传递的机制

  1. 刷盘策略
    • 同步刷盘:Master接收到消息后,会先将消息写入磁盘的CommitLog文件,只有在消息成功持久化到磁盘后,才会向生产者返回成功响应。这种策略能最大程度保证消息不丢失,但会影响系统的写入性能。
    • 异步刷盘:Master接收到消息后,会先将消息写入内存的PageCache,然后异步将PageCache中的数据刷入磁盘。这种策略写入性能较高,但如果系统发生宕机,可能会丢失一部分还未刷入磁盘的消息。
  2. 消息确认机制
    • 生产者发送消息后,会等待Broker的确认响应。如果在规定时间内未收到确认,生产者会进行重试。这确保了生产者能感知到消息是否成功发送到Broker。
    • Broker在成功接收并处理消息后,才会向生产者返回确认。对于事务消息,RocketMQ通过二阶段提交机制保证消息的最终一致性和可靠性。

保证系统高可用性的机制

  1. 主从切换:当Master节点出现故障时,监控系统(如NameServer)会感知到,并通知集群中的其他节点。此时,部分Slave节点可被选举为新的Master节点,继续提供服务。选举过程通常基于一定的规则,如节点的健康状态、数据同步情况等。
  2. 多副本机制:通过Slave节点对Master节点的数据进行备份,即使某个节点出现故障,其他节点上仍然保存有完整的数据副本,从而保证了系统的数据可用性。

主从节点之间的数据同步机制

  1. 同步复制:Master在将消息写入本地CommitLog后,会等待所有配置为同步复制的Slave节点将消息写入各自的CommitLog后,才向生产者返回成功响应。这种方式保证了主从节点数据的强一致性,但会降低写入性能。
  2. 异步复制:Master在将消息写入本地CommitLog后,立即向生产者返回成功响应,同时异步将消息同步给Slave节点。这种方式写入性能较高,但可能会存在短暂的数据不一致情况,例如Master故障时,部分已确认给生产者但还未同步到Slave的消息可能丢失。