RocketMQ 主备同步

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

基于 RocketMQ 4.2.0 版本进行的源码分析。
介绍 RocketMQ 的主备同步机制

一、简介

RocketMQ 通过 Master-Slave 主备机制,来实现整个系统的高可用,具体表现在:

  • Master 磁盘坏掉,Slave 依然保存了一份
  • Master 宕机,不影响消费者继续消费

二、搭建环境

我们在一台机器上搭建一个 Master 一个 Slave 的环境:
image.png
为了能够将 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 的连接。
image.png

四、数据传输

当启动 HAService 之后,一旦 Master

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值