RocketMQ5.0主备自动切换模式Broker选主详解

RocketMQ5.0增加了主备自动切换模式,这个模式是基于新开发的模块DLedger Controller(基于Raft组件DLedger)。下面结合源码来分析一下RocketMQ主备自动切换模式下的选主的流程。

Tips: RocketMQ源码版本:5.0.0

1. 何时选主Broker


Broker的选主发起主要有三种情况:

  • 通过admin命令人为主动发起重新选主

    命令发起具体参照 electMaster 命令(运维命令由笔者开发完成),详细使用参照命令的说明

  • RocketMQ集群刚搭建Broker启动注册Broker到DLedger Controller,DLedger Controller还没有选主,然后触发选主操作。

  • RocketMQ Broker Master下线或者因为其他情况不能正常提供服务与DLedger Controller服务不能正常连接或者心跳失效,会触发DLedger Controller选主Broker

2. 如何选主Broker

文章上面有提到触发选主的三种情况,下面我们就把这三种情况一一进行分析

2.1 Broker启动注册触发选主


主备自主切换模式下Broker启动时候到底是Master还是Slave需要通过DLedger Controller服务通过选主的方式来确定。

Broker启动注册到DLedger Controller

Broker启动后,将Broker的元数据:

  • clusterName
  • brokerName
  • address
  • epoch
  • maxOffset

注册到DLedger Controller,由 BrokerOuterAPI#registerBrokerToController 提供注册的服务:


DLedger Controller触发选主

DLedger Controller 模块的主要逻辑在ReplicasInfoManager中。当DLedger Controller接收到Broker发送的 CONTROLLER_REGISTER_BROKER 消息后就处理选主,由ReplicasInfoManager#registerBroker处理逻辑:


Broker Change Role

Broker注册后收到DLedger Controller返回的数据,根据返回数据的Master Address和Broker的IP进行对比来判断当前Broker是设置为Master还是Slave。



到这里就实现了Broker的选主。

2.2 Broker Master Inactive触发选主

Broker Master下线或者Broker Master和DLedger Controller心跳失效触发选主,DLedger Controller有一个定时任务执行 DefaultBrokerHeartbeatManager#scanNotActiveBroker :


通知最终会触发 ControllerManager#onBrokerInactive 方法:


ReplicasInfoManager#electMaster 负责选主:


Tips: 笔者领了一个开发一个Preferred Master 的功能任务,可以优先选择某个 Broker 作为 master。还在代码研究和设计阶段。后续会提交PR

参与选主的Broker是从SyncStateSet选取的。

然后选举的结果通知Broker, AdminBrokerProcessor#notifyBrokerRoleChanged 处理改变:




2.3 Admin命令触发选主

首先看一下命令的说明:

usage: mqadmin electMaster -a <arg> -b <arg> -c <arg> [-h] -n <arg> -a,--controllerAddress <arg> The address of controller
 -b,--brokerAddress <arg> The address of the broker which requires to become master
 -c,--clusterName <arg> the clusterName of broker
 -h,--help                      Print help
 -n,--brokerName <arg> The broker name of the replicas that require to be manipulated

指定一个Broker作为Master。后端DLedger Controller的实现也是通过 ReplicasInfoManager#electMaster 实现。

对于代码的详细细节大家可以去研究一下RocketMQ5.0的代码细节,以及DLedger相关的代码。

3. 总结

Master ID由DLedger Controller设置,Slave的ID也是。选举发起方可能是由Broker发起或者由DLedger Controller发起,也有可能手动通过 Admin electMaster 命令发起。Broker主备自主切换的主要依赖DLedger Controller。

#Java##程序员#
全部评论

相关推荐

(黑话警告⚠️:hc=岗位数量,&nbsp;mt=导师,&nbsp;ld=直属领导,&nbsp;cr=代码审查)25年1月,我加入了字节某前端团队,并期望能在这里待到秋招并尝试转正。然而,就在上周,ld&nbsp;找我1v1,告诉我,我的能力和团队预期不太匹配,并和我劝退。晴天霹雳吗?肯定是有的。那一刻,脑子里嗡嗡作响,各种情绪翻涌。但冷静下来想想,这几个月,自己在能掌控的范围内,确实有不少地方做得不尽如人意。所以,我想把这段不算成功的经历复盘一下,希望能给同样在努力转正的你提个醒,避开我踩过的坑。一、ld&nbsp;的要求要注意刚进组时,ld就和我聊过转正的事。我当时发问:“咱们这儿有hc&nbsp;吗?”&nbsp;ld没直接回答,只是说:“看能力,能力到了...
牛客上的彭于晏:过来人告诉你,入职后要做的第一件事儿不是说主动找活儿做,你要先学会融入团队,摸清ld的性格,投其所好。然后才是展示你的能力,能力上可以说技术或者业务,以业务能力为主,技术能力为辅。优先保证自己对业务需求的开发保证质量效率,然后再谈技术的问题,不要你觉得啥啥啥不行就想着整体优化了(发现校招生最喜欢干这事儿),我工作快5年了发现搞这种的最后都没啥好的结果,产出没有还引入新的bug,校招或者实习的水平看到的问题别人看不到嘛?为什么别人不去搞?浪费时间还没收益的事儿不要去做,技术上的能力体现在对于一个新需求,在不符合现在业务发展的架构设计上,你能拿出好的技术方案同时能考虑到后续业务发展逐渐将技术架构引入合理的架构,这是一个漫长的过程而不是一次性的
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务