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。