RocketMQ HA机制

简介: 前面我们已经简单地介绍了 RocketMQ 的整体设计思路,本文着重其中HA机制部分的实现细节。

引言

前面我们已经简单地介绍了 RocketMQ 的整体设计思路,本文着重其中HA机制部分的实现细节,更多关于 RocketMQ 的文章均收录于<RocketMQ系列文章>;

HA机制

为了提高消息消费的高可用性,避免 Broker 发生单点故障引起存储在 Broker 上的消息无法及时消费,RocketMQ 引入了 Broker 主备机制,即消息消费到达主服务器后需要将消息同步到消息从服务器,如果主服务器 Broker 宕机后,消息消费者可以从从服务器拉取消息。

工作机制

RocketMQ HA 的实现原理如下。

  1. 主服务器启动,并在特定端口上监听从服务器的连接
  2. 从服务器主动连接主服务器,主服务器接收客户端的连接,并建立相关 TCP 连接
  3. 从服务器主动向主服务器发送待拉取消息偏移量,主服务器解析请求并返回消息给从服务器
  4. 从服务器保存消息并继续发送新 的消息同步请求

如果是同步主从模式,消息发送者将消息刷写到磁盘后,需要继续等待新数据被传输到从服务器,而从服务器数据的复制是在另外一个线程中去拉取的,所以消息发送者在这里需要等待数据传输的结果,RocketMQ 有一个 GroupTransferService,它的职责是负责当主从同步复制结束后通知由于等待 HA 同步结果而阻塞的消息发送者线程。

判断主从同步是否完成的依据是 Slave 中已成功复制的最大偏移量是否大于等于消息生产者发送消息后消息服务端返回下一条消息的起始偏移量,如果是则表示主从同步复制已经完成,唤醒消息发送线程,否则等待 1s 再次判断,每一个任务在一批任务中循环判断 5 次。

RocketMQ HA 主要交互流程如下图所示。
ha

读写分离

RocketMQ 根据 MessageQueue查找 Broker地址的唯一依据是 brokerName,从 RocketMQ 的 Broker 组织结构中得知同一组 Broker (M-S)服务器,它们的 brokerName 相同但 brokerId 不同,主服务器的 brokerId 为 0,从服务器的 brokerId 大于 0。

在前面介绍消息拉取的时候,提过 Broker 在返回拉取内容的同时还会返回下一次是否要从 Slave 拉取数据,消费者收到该建议后,会找到合适的 Broker 节点进行拉取。那么 Broker 是通过哪种策略来建议的呢?

long diff = maxOffsetPy - maxPhyOffsetPulling;
long memory = (long) (StoreUtil.TOTAL_PHYSICAL_MEMORY_SIZE
    * (this.messageStoreConfig.getAccessMessageInMemoryMaxRatio() / 100.0));
getResult.setSuggestPullingFromSlave(diff > memory);

上述就是建议策略,下面进行解读:

  • maxOffsetPy: 代表当前主服务器消息存储文件最大偏移量。
  • maxPhyOffsetPulling: 此次拉取消息最大偏移量。
  • diff:对于PullMessageService线程来说,当前未被拉取到消息消费端的消息长度。
  • TOTAL_PHYSICAL_MEMORY_SIZE: RocketMQ 所在服务器总内存大小。
  • AccessMessageInMemoryMaxRatio: 表示 RocketMQ 所能使用的最大内存比例,超过该内存,消息将被置换出内存
  • memory: 表示 RocketMQ 消息常驻内存的大小,超过该大小, RocketMQ 会将旧的消息置换回磁盘
  • 如果 diff 大于 memory,表示当前需要拉取的消息已经超出了常驻内存的大小,表示主服务器繁忙,此时才建议从 Slave 服务器拉取

如果主服务器繁忙则建议下一次从从服务器拉取消息,下次默认从标号为 1 的从节点拉取消息。如果一个 Master 拥有多台 Slave 服务器,参与消息拉取负载的从服务器只会是其中一个。

文章说明

更多有价值的文章均收录于贝贝猫的文章目录

stun

版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

创作声明: 本文基于下列所有参考内容进行创作,其中可能涉及复制、修改或者转换,图片均来自网络,如有侵权请联系我,我会第一时间进行删除。

参考内容

[1]《RocketMQ技术内幕》
[2]《RocketMQ实战与原理解析》
[3] 老生常谈——利用消息队列处理分布式事务
[4] RocketMQ架构解析
[5] MappedByteBuffer VS FileChannel 孰强孰弱?
[7] 海量数据处理之Bloom Filter详解
[8] rocketmq GitHub Wiki

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
消息中间件 存储 分布式计算
|
5月前
|
消息中间件 存储 Java
【RocketMQ 系列三】RocketMQ集群搭建(2m-2s-sync)
【RocketMQ 系列三】RocketMQ集群搭建(2m-2s-sync)
420 1
|
5月前
|
消息中间件 Java RocketMQ
MetaQ/RocketMQ 原理问题之PullMessageService的主要职责是什么
MetaQ/RocketMQ 原理问题之PullMessageService的主要职责是什么
|
消息中间件 存储 分布式计算
消息队列kafka及zookeeper机制
消息队列kafka及zookeeper机制
183 1
|
消息中间件 存储 Apache
深入探索分布式消息队列:Apache RocketMQ 介绍与特性解析
在现代的分布式系统中,消息队列已经成为了实现异步通信、解耦和扩展性的重要工具。Apache RocketMQ,作为一款高性能、可靠的分布式消息队列系统,正受到越来越多企业和开发者的关注和采用。本文将为您详细介绍 Apache RocketMQ 的核心概念、特性以及它在分布式架构中的应用。
331 0
|
消息中间件 算法 Kafka
MQ 学习日志(四) kafka的选举机制
kafka的选举机制 概述
167 0
|
消息中间件 存储 监控
Kafka的高可用机制
Kafka是一个分布式流处理平台,提供高可用性和可靠性的消息传递机制。
226 0
|
消息中间件 存储 负载均衡
中间件优解——RabbitMQ和Kafka的高可用集群原理
大家对当前比较常用的RabbitMQ和Kafka是否有一些了解呢,了解的多一些也不是坏事,面试或者跟人聊技术的时候也会让你更有话语权嘛。 今天就跟大家聊一聊RabbitMQ和Kafka在处理高可用集群时的原理,看看它们与RocketMQ有什么不同。小伙伴们可以重新温习一下常见的消息中间件有哪些?你们是怎么进行技术选型的?这篇文章,了解一下他们之间的区别。
|
消息中间件 存储 缓存
再见 2020!Apache RocketMQ 发布 4.8.0,DLedger 模式全面提升!
“童年的雨天最是泥泞,却是记忆里最干净的曾经。凛冬散尽,星河长明,新的一年,万事顺遂,再见,2020!”
650 0
再见 2020!Apache RocketMQ 发布 4.8.0,DLedger 模式全面提升!
|
消息中间件 RocketMQ 开发者
RocketMQ各种集群模式介绍|学习笔记
快速学习RocketMQ各种集群模式介绍
170 0