RocketMQ5.0源码分析-Broker主备自主切换组件AutoSwitchHAService图文详解

RocketMQ5.0实现了主备自主切换其中AutoSwitchHAService作为其中一个重要的组件实现了当中的很多功能:

下面就来分析这些功能的实现。

Tips: RocketMQ源码版本:5.0.0

1. AutoSwitchHAService工作流程

首先来看一下AutoSwitchHAService的工作流程,图如下:

主要分为几块:

  • AutoSwitchHAService初始化
  • AutoSwitchHAService启动,包括:AutoSwitchAcceptSocketService、GroupTransferService、HAConnectionStateNotificationService服务。
  • Broker启动等待注册到DLedger Controller的返回结果,根据结果来判断Broker change role。
  • Broker角色为Master的时候主要是将Master的CommitLog数据传输到Slave, Slave主要的功能就是通过HAClient处理Master传输的数据。

Broker Master和Slave的分工合作从而实现了Broker的CommitLog数据传输到Slave的功能。从而达到高可用和主备切换的目的。

2. AutoSwitchHAService初始化和启动

AutoSwitchHAService 实现了 DefaultHAService ,也就是在RocketMQ4.x的高可用基础上实现了主备切换的功能。初始化在**AutoSwitchHAService#init** 方法中:

启动的过程主要在 DefaultHAService#start 方法中,干了一下几件事情:

  • AutoSwitchAcceptSocketService服务的启动

    这个服务的作用是用来监听Slave Client的链接,当Slave的Client连接到Master后,会将连接包装成AutoSwitchHAConnection存入列表中。这个服务主要是Broker Master会用到

  • GroupTransferService服务启动

    判断CommitLog是否已经同步到Slave,这个也只有Master会用到

  • HAConnectionStateNotificationService服务启动

3. AutoSwitchHAService change role

Broker的角色是Master还是Slave是由选主组件 DLedger Controller(controller模块)) 决定。接收到选主通知的Broker会根据master address和自身的address进行判断来决定是调用 AutoSwitchHAService #changeToMaster 还是 AutoSwitchHAService#changeToSlave

Tips: Broker的选主可以参照《RocketMQ5.0主备自动切换模式Broker选主详解》

3.1 Change to Master

ReplicasManager#changeToMaster 是接收DLedger Controller选主后返回的一个入口:

下面看一下 AutoSwitchHAService#changeToMaster 的处理流程:

从Broker Change to Master的流程图可以看出来整个过程分为一下几个步骤:

  • DLedger Controller负责选主,然后通知对应的Broker,Borker将角色设置为Master
  • 设置为Master的时候首先要删除原先Broker持有的Slave client(Slave 是没有持有AutoSwitchHAConnection),与此同时如果AutoSwitchHAClient不为空的情况shutdown。
  • Broker本地脏数据清理:CommitLog的脏数据、consume queue 的脏数据,也就是本地数据对齐
  • 根据Master Epoch对齐本地的Epoch数据,同时将新增的Epoch数据写入Checkpoint文件中
  • 等待Consume queue dispatch完成, 恢复Consume Queue到内存

通过以上的几个步骤就完成了Broker的Role设置。

Tips: 设置Broker的角色一定是 SYNC_MASTER 主要是因为需要实现高可用减少消息丢失

3.2 Change to Slave

Broker设置为Slave的流程和设置为Master的流程大体上都差不多:

功能的实现都是通过 AutoSwitchHAService

对于 AutoSwitchHAClient 是如何与 Master进行建立连接和工作的大家可以参照 《RocketMQ5.0源码分析-高可用组件AutoSwitchHAClient图文详解》

4 Transfer CommitLog Data

将Master Broker的数据传输到Slave Broker这个重要也是最主要的目的。与此同时来实现Broker的高可用。从上面可以知道当Slave和Master完成HANDSHAKE后。Master就进入了TRANSFER状态也就是数据传输的状态,此时Master会将数据通过 AutoSwitchHAConnection 传输给 Slave。传输格式:

Note: 每一次数据的传输不能跨Epoch进行传输,每一次传输的数据epoch都是相同的。

5. 总结

RocketMQ5.0主备自主切换是在RocketMQ4.x的基础上增加了epoch等一些设计,同时依赖DLedger实现选主。 ReplicasManager 主要负责接口对外,AutoSwitchHAService 提供实际的服务编排,将不同的服务编排起来实现整个功能。

作者:蚂蚁背大象
链接:https://juejin.cn/post/7156987666951569421
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

### 新特性 RocketMQ 5.0 版本带来了多项重要的新特性和改进。其中,最显著的变化之一是其对云原生的支持得到了极大的增强。通过引入 Kubernetes 实战指南,用户可以在几分钟内快速部署一个 RocketMQ 集群,这得益于 Helm 图表的使用以及对 Docker/K8s 的支持。此外,RocketMQ 5.0 还实现了 Proxy 自动扩缩容功能,使得系统能够更加灵活地应对流量波动,同时保持 Broker 层的稳定[^4]。 另一个重要特性是关于服务端的消息处理机制。对于定时/事务消息,只有当定时时间到达或事务提交后,这些消息才会对消费者可见。这一机制有效保证了消息传递的准确性和可靠性[^2]。 ### 使用指南 在生产环境中部署 RocketMQ 5.0 时,建议采取不同的部署模式以满足特定业务需求。例如,交易类业务推荐采用同步双写的方式,而日志类业务则更适合使用异步复制。此外,为了确保系统的高可用性和稳定性,容量规划时应预留至少30%的磁盘空间和带宽资源。同时,实施全面的监控措施,确保能够及时发现并解决潜在问题。灾方面,定期进行节点故障模拟测试,验证恢复流程的有效性。版本管理上,推荐利用 Docker 或 Kubernetes 实现滚动升级,从而最小化停机时间和风险[^3]。 ### 下载 虽然具体的下载链接未在提供的资料中直接给出,但通常 Apache RocketMQ 的官方 GitHub 仓库或是官方网站会提供最新版本的下载选项。对于 RocketMQ 5.0,可以通过访问项目的页查找下载页面,或者查看项目文档中的“Getting Started”部分获取详细的安装指导。如果希望通过 Helm 安装 RocketMQ 5.0,可以参考如下命令添加 RocketMQ Helm 仓库,并安装包含 Proxy 的 RocketMQ 集群: ```shell # 添加RocketMQ Helm仓库 helm repo add rocketmq https://apache.github.io/rocketmq-helm # 安装RocketMQ集群(含Proxy) helm install rocketmq rocketmq/rocketmq \ --set proxy.replicaCount=3 \ --set broker.persistence.storageClass=alicloud-disk-essd ``` 以上步骤将帮助用户快速搭建起 RocketMQ 5.0 的运行环境,为后续的应用开发和测试打下坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值