首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

RocketMQ篇10:主从同步机制源码解析

同步属性信息

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实现

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200518A0Q22Z00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券