角色划分
| 角色 | 描述 |
|---|---|
| HAService$AcceptSocketService | 处理 slave 连接,为之创建 HAConnection |
| HAService$HAClient | slave 客户端 |
| HAService$GroupTransferService | 主从同步复制,用于阻塞当前写入 master 的线程,当该次写入已同步至 slave,或者同步时间超过 5s,则唤醒阻塞 master 的线程 |
| HAConnection$WriteSocketService | master 每隔 1s 处理写事件,根据 slaveRequestOffset 拉取消息,同步至 slave |
| HAConnection$ReadSocketService | 主要是处理 slave 汇报的消息同步进度,并把值赋值给 slaveRequestOffset, 以方便 WriteSocketService 线程拉取消息 |
整体流程
-
HAClient 启动时,会先连接 master
-
HAService$AcceptSocketService 处理本次连接,并创建 HAConnection
-
HAClient 连接完毕后,再向 master 发送心跳包,告知自己要从哪个位置拉消息。消息协议为:maxOffset(8 字节)
-
HAConnection$ReadSocketService处理本次心跳请求, 并将 maxOffset 赋值给 slaveRequestOffset ,以方便HAConnection$WriteSocketService复制消息给 HAClient。 -
唤醒 HAService$GroupTransferService 线程,并将 slave 已经同步的偏移量传递给该线程
a.如果主从是同步的,GroupTransferService 线程判断当前同步超过 5s 或者 slave CommitLog 偏移量 大于等于当前写入的偏移量 则唤醒 消息写入线程
-
HAConnection$WriteSocketService 每隔 1s 根据 slaveRequestOffset 拉取消息。并传递给 HAClient
-
HAClient 接收消息,写入本地 CommitLog
-
Slave 每隔 10s 向 master 拉取以下信息,并写入到本地
// topic 信息
this.syncTopicConfig();
// 消费偏移
this.syncConsumerOffset();
// 延迟偏移
this.syncDelayOffset();
// 消费者组订阅信息
this.syncSubscriptionGroupConfig();
可配置项
| key | value | 描述 |
|---|---|---|
| haListenPort | 10912 | master 主从复制暴露的端口 |
| haHousekeepingInterval | 1000 * 20 | 主从连接保活时间 |
| brokerId | master 必须是 0, slave 大于 0 的值即可 | |
| brokerRole | ASYNC_MASTER 、SYNC_MASTER 、 SLAVE | ASYNC_MASTER 表示异步复制、SYNC_MASTER 表示同步复制 |
| brokerClusterName | DefaultCluster | 集群名称 |
| brokerName | 主从的 brokerName 必须一致 |
主从复制过程中的消息协议
slave 汇报同步进度
phyoffset: 已同步的偏移量,8 字节。
master 同步消息给 slave
消息头: phyoffset(8 字节) + size(4 字节)
phyoffset:下一次应该从哪个位置拉取
size:消息大小
消息体: CommitLog