RocketMQ5.0主備自動切換模式Broker選主詳解
持續創作,加速成長!這是我參與「掘金日新計劃 · 10 月更文挑戰」的第6天,點選檢視活動詳情
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命令觸發選主
首先看一下命令的說明:
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),文章對你有幫助點贊關注我,文章有不正確的地方請您斧正留言評論~謝謝!
- RocketMQ5.0主備自動切換模式Broker選主詳解
- CompletableFuture詳解
- Java執行緒池原始碼解析
- RocketMQ原始碼解析-消費者消費策略原始碼解析
- RocketMQ原始碼解析-消費者啟動原始碼解析
- 如何將本地已有專案關聯到github的新建的專案中
- AQS原始碼解析
- HashMap原始碼解析-JDK1.8
- Spring Framework原始碼解析-BeanPostProcessor講解
- 一個Java物件佔用多大記憶體-實踐篇
- RocketMQ原始碼解析-Broker訊息儲存ConsumeQueue
- 如何保證RocketMQ訊息不丟失
- Spring依賴注入時,什麼時候會建立代理類?
- 分散式ID生成器-美團Leaf
- 分散式ID生成器-MySQL資料庫自增
- LeetCode-260. 只出現一次的數字 III
- CopyOnWriteArrayList原始碼解析
- Java NIO 知識梳理和例子
- Spring AOP應用之Spring事務管理
- Spring Cloud Gateway-新一代API閘道器服務