MST

星途 面试题库

面试题:消息队列之RocketMQ如何实现主从架构下的高可用性

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

知识考点

AI 面试

面试题答案

一键面试

RocketMQ主从架构工作原理

  1. 角色分工
    • Master节点:负责处理客户端的读写请求,接收生产者发送的消息,并向消费者提供消息。同时,将消息同步给Slave节点。
    • Slave节点:从Master节点同步数据,主要用于数据备份和分担读压力。当Master节点出现故障时,部分Slave节点可以切换为Master节点继续提供服务。
  2. 消息处理流程
    • 生产消息:生产者将消息发送到Master节点,Master节点接收消息并存储在本地的CommitLog文件中(RocketMQ采用的一种存储结构,所有主题的消息都顺序存储在这个文件中)。
    • 消费消息:消费者从Master节点拉取消息进行消费。在一些场景下,消费者也可以从Slave节点拉取消息,以减轻Master节点的读压力。

保证消息高可用性的机制

  1. 主从数据同步机制
    • 同步复制:Master节点在接收到消息后,会等待所有配置为同步复制的Slave节点将消息成功写入本地存储后,才向生产者返回成功响应。这种方式保证了消息在Master和Slave节点之间的强一致性,即使Master节点宕机,消息也不会丢失,因为至少有一个Slave节点保存了该消息。
    • 异步复制:Master节点在接收到消息并写入本地CommitLog后,就立即向生产者返回成功响应,同时异步地将消息同步给Slave节点。这种方式性能较高,但存在一定的数据丢失风险,因为如果Master节点在同步消息给Slave节点之前宕机,部分已提交给Master但未同步到Slave的消息可能会丢失。
  2. 故障转移机制
    • 自动故障检测:RocketMQ的Namesrv(名称服务,负责管理Broker的路由信息)会定期检查Master和Slave节点的存活状态。如果Master节点出现故障,Namesrv会感知到,并通知相关的生产者和消费者。
    • 手动故障转移:运维人员可以通过管理工具手动将某个Slave节点提升为Master节点。在进行手动故障转移时,需要确保提升的Slave节点数据相对完整,以减少数据丢失。同时,需要对系统的其他组件(如生产者、消费者)进行相应的配置调整,使其能够连接到新的Master节点。
  3. 读负载均衡
    • 读写分离:消费者既可以从Master节点拉取消息,也可以从Slave节点拉取消息。通过合理配置,可以将部分读请求分担到Slave节点,减轻Master节点的读压力,提高系统的整体可用性。例如,对于一些对实时性要求不是特别高的消费场景,可以配置消费者从Slave节点拉取消息。
    • 负载均衡算法:RocketMQ在消费者从多个Broker(包括Master和Slave)拉取消息时,采用一定的负载均衡算法,如轮询算法等,将消费请求均匀分配到各个节点上,避免某个节点负载过高。