基于 RocketMQ 4.2.0 版本进行的源码分析。
介绍 RocketMQ 的主备同步机制
一、简介
RocketMQ 通过 Master-Slave 主备机制,来实现整个系统的高可用,具体表现在:
- Master 磁盘坏掉,Slave 依然保存了一份
- Master 宕机,不影响消费者继续消费
二、搭建环境
我们在一台机器上搭建一个 Master 一个 Slave 的环境:

为了能够将 Master 和 Slave 搭建在同一台计算机上,我们除了需要将 Broker 的角色设置为 SLAVE,还需要为其指定单独的 brokerId、 storePathRootDir、 storePathCommitLog。
// SLAVE 角色
messageStoreConfig.setBrokerRole(BrokerRole.SLAVE);
// 一个机器如果要启动多个 Broker,那么每个 Broker 的 store 根目录必须不同
messageStoreConfig.setStorePathRootDir(storePathRootDir);
// 一个机器如果要启动多个 Broker,那么每个 Broker 的 storePathCommitLog 根目录必须不同
messageStoreConfig.setStorePathCommitLog(storePathCommitLog);
// 设置 Slave 的 Master HA 地址
messageStoreConfig.setHaMasterAddress("localhost:10912");
// SLAVE 角色的 brokerId 必须大于 0
brokerConfig.setBrokerId(1);
注意 Slave 和 Master 的 brokerName 必须一致,即它们必须处于同一个 BrokerData 数据结构里面。实际上在做了如上的修改之后, Slave 和 Master 依旧不能同时运行在同一台机器上,因为 Slave 本身也可以称为 Master,接受来自其他 Slave 的请求,因此当运行 Slave 的时候,需要将 HAService 里面的启动 AcceptSocketService 运行的相关方法注释掉。
三、建立连接
当一个 Broker 在启动的时候,会调用 HAService 的 start() 方法:
public class HAService {
public void start() throws Exception {
this.acceptSocketService.beginAccept();
this.acceptSocketService.start();
this.groupTransferService.start();
this.haClient.start();
}
}
AcceptSocketService 服务的功能是 Master 等待接受来自其它客户端 Slave 的连接,当成功建立连接后,会将这条连接 HAConnection 放入到 connectionList 连接列表里面。而 HAClient 服务的功能是 Slave 主动发起同其它 Master 的连接。

四、数据传输
当启动 HAService 之后,一旦 Master

本文详细解析了RocketMQ4.2.0版本中基于主备同步机制的架构、环境搭建、数据传输流程以及异常处理策略,包括主备切换消费和配置建议。
最低0.47元/天 解锁文章
682

被折叠的 条评论
为什么被折叠?



