同步属性信息
Slave需要和Master同步的不只是消息本身,还有一些元数据:TopicConfig信息、ConsumerOffset信息、DelayOffset和SubscriptionGroupConfig信息。
Broker在启动的时候,判断自己是否为Slave,是的话就启动定时同步任务
Slave角色定时同步元数据信息
在syncAll函数里,调用了syncTopicConfig()、syncConsumerOffset()、syncDelayOffset()和syncSubscriptionGroupConfig()进行元数据同步。
syncTopicConfig具体实现
syncConsumerOffset具体实现
组装了一个RemotingCommand,底层通过Netty将消息发送到Master角色的Broker,获取Offset信息
syncDelayOffset具体实现
syncSubscriptionGroupConfig具体实现
同步消息体
同步消息体内容即同步Commintlog内容的方法。CommitLog和元数据信息不同:CommitLog的数据量非常大,而且对实时性和可靠性要求也很高。
元数据信息是定时同步的。
CommitLog在高可靠性场景下如果没有及时同步,如果Master机器出现故障的话,消息就会丢失。
HAService是实现commitLog同步的主体,它在Master机器和Slave机器上执行的逻辑不同,默认是在Master机器上执行。
根据Broker角色,确定是否设置HaMasterAddress
当Broker角色是Slave的时候,MasterAddr的值会被正确设置,这样HAService在启动的时候,在HAClient这个内部类中,connectMaster会被正确执行。
Slave角色连接Master
HAClient通过Java NIO函数去连接Master角色的Broker
监听Slave的HA连接
CommitLog的同步,不是经过netty command的方式,而是直接进行TCP连接,连接成功后,通过对比Master和Slave的Offset,不断进行同步。
sync_master和async_master
sync_master是同步方式,Master角色Broker中的消息要立刻同步过去。
async_master是异步方式,Master角色Broker中的消息通过异步处理的方式同步到Slave角色的机器上。
sync_master下的消息同步
总结
Master和Slave之间主要同步两部分信息:
元数据信息:采用基于Netty的command方式定时同步。
commitLog信息:基于Java NIO实现
领取专属 10元无门槛券
私享最新 技术干货