RocketMQ5.0主備自動切換模式Broker選主詳解

語言: CN / TW / HK

持續創作,加速成長!這是我參與「掘金日新計劃 · 10 月更文挑戰」的第6天,點選檢視活動詳情

RocketMQ5.0增加了主備自動切換模式,這個模式是基於新開發的模組DLedger Controller(基於Raft元件DLedger)。下面結合原始碼來分析一下RocketMQ主備自動切換模式下的選主的流程。

Tips: RocketMQ原始碼版本:5.0.0

1. 何時選主Broker

Broker Elect Master.png

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 elect process.png

主備自主切換模式下Broker啟動時候到底是Master還是Slave需要通過DLedger Controller服務通過選主的方式來確定。

Broker啟動註冊到DLedger Controller

Broker啟動後,將Broker的元資料:

  • clusterName
  • brokerName
  • address
  • epoch
  • maxOffset

註冊到DLedger Controller,由 BrokerOuterAPI#registerBrokerToController 提供註冊的服務:

image-20221019180858462.png

DLedger Controller觸發選主

DLedger Controller 模組的主要邏輯在ReplicasInfoManager中。當DLedger Controller接收到Broker傳送的 CONTROLLER_REGISTER_BROKER 訊息後就處理選主,由ReplicasInfoManager#registerBroker處理邏輯:

image-20221019182903186.png

Broker Change Role

Broker註冊後收到DLedger Controller返回的資料,根據返回資料的Master Address和Broker的IP進行對比來判斷當前Broker是設定為Master還是Slave。

image-20221019190349777.png

到這裡就實現了Broker的選主。

2.2 Broker Master Inactive觸發選主

Broker Master下線或者Broker Master和DLedger Controller心跳失效觸發選主,DLedger Controller有一個定時任務執行 DefaultBrokerHeartbeatManager#scanNotActiveBroker

image-20221019191416688.png

通知最終會觸發 ControllerManager#onBrokerInactive 方法:

image-20221019191744705.png

ReplicasInfoManager#electMaster 負責選主:

image-20221019195612264.png

Tips: 筆者領了一個開發一個Preferred Master 的功能任務,可以優先選擇某個 Broker 作為 master。還在程式碼研究和設計階段。後續會提交PR

參與選主的Broker是從SyncStateSet選取的。

然後選舉的結果通知Broker, AdminBrokerProcessor#notifyBrokerRoleChanged 處理改變:

image-20221019200415384.png

image-20221019200445279.png

2.3 Admin命令觸發選主

首先看一下命令的說明:

shell 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。

我是螞蟻背大象(GitHub:mxsm),文章對你有幫助點贊關注我,文章有不正確的地方請您斧正留言評論~謝謝!