RocketMQ 主从同步

816 阅读1分钟

角色划分

角色描述
HAService$AcceptSocketService处理 slave 连接,为之创建 HAConnection
HAService$HAClientslave 客户端
HAService$GroupTransferService主从同步复制,用于阻塞当前写入 master 的线程,当该次写入已同步至 slave,或者同步时间超过 5s,则唤醒阻塞 master 的线程
HAConnection$WriteSocketServicemaster 每隔 1s 处理写事件,根据 slaveRequestOffset 拉取消息,同步至 slave
HAConnection$ReadSocketService主要是处理 slave 汇报的消息同步进度,并把值赋值给 slaveRequestOffset, 以方便 WriteSocketService 线程拉取消息

整体流程

  1. HAClient 启动时,会先连接 master

  2. HAService$AcceptSocketService 处理本次连接,并创建 HAConnection

  3. HAClient 连接完毕后,再向 master 发送心跳包,告知自己要从哪个位置拉消息。消息协议为:maxOffset(8 字节)

  4. HAConnection$ReadSocketService 处理本次心跳请求, 并将 maxOffset 赋值给 slaveRequestOffset ,以方便 HAConnection$WriteSocketService 复制消息给 HAClient。

  5. 唤醒 HAService$GroupTransferService 线程,并将 slave 已经同步的偏移量传递给该线程

    a.如果主从是同步的,GroupTransferService 线程判断当前同步超过 5s 或者 slave CommitLog 偏移量 大于等于当前写入的偏移量 则唤醒 消息写入线程

  6. HAConnection$WriteSocketService 每隔 1s 根据 slaveRequestOffset 拉取消息。并传递给 HAClient

  7. HAClient 接收消息,写入本地 CommitLog

  8. Slave 每隔 10s 向 master 拉取以下信息,并写入到本地

// topic 信息
this.syncTopicConfig();
// 消费偏移
this.syncConsumerOffset();
// 延迟偏移
this.syncDelayOffset();
// 消费者组订阅信息
this.syncSubscriptionGroupConfig();

image.png

可配置项

keyvalue描述
haListenPort10912master 主从复制暴露的端口
haHousekeepingInterval1000 * 20主从连接保活时间
brokerIdmaster 必须是 0, slave 大于 0 的值即可
brokerRoleASYNC_MASTER 、SYNC_MASTER 、 SLAVEASYNC_MASTER 表示异步复制、SYNC_MASTER 表示同步复制
brokerClusterNameDefaultCluster集群名称
brokerName主从的 brokerName 必须一致

主从复制过程中的消息协议

slave 汇报同步进度

phyoffset: 已同步的偏移量,8 字节。

master 同步消息给 slave

消息头: phyoffset(8 字节) + size(4 字节)

phyoffset:下一次应该从哪个位置拉取

size:消息大小

消息体: CommitLog

image.png