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
提供实际的服务编排,将不同的服务编排起来实现整个功能。
我是蚂蚁背大象(GitHub:mxsm),文章对你有帮助点赞关注我,文章有不正确的地方请您斧正留言评论~谢谢!
转载自:https://juejin.cn/post/7156987666951569421