一、社團扛把子不為人知的秘密
????????香港社團里,Kafka 是整個組織的名號,ZooKeeper 就是說一不二的長老團,各個片區的 “話事人” 就是 broker,而能統領所有片區的 “扛把子”,就是 Kafka 里的控制器。?
1.1 選舉的秘密
????????每天社團開工,各個片區的話事人都要先去長老團報備。這時候,大家都會偷偷瞄一眼長老團手里的 “花名冊”—— 也就是 ZooKeeper 里的 /controller 節點。
????????要是花名冊上已經寫了某個片區話事人的名字(brokerid),其他人就只能乖乖退回,承認對方是扛把子;
????????可要是花名冊是空的,或者上面的名字糊了,所有人就得立刻搶著去長老團登記,誰先把自己名字寫上,誰就是新扛把子。不過這登記有講究,花名冊是 “臨時的”,要是扛把子出了意外(節點宕機),名字會自動從花名冊上消失,這時候就得重新選扛把子。?
????????每個新扛把子上任,長老團還會給一個 “任期編號”—— 也就是 controller_epoch。
頭一任扛把子是 1 號,要是扛把子換了人,編號就自動加 1。為啥要有這編號?比如前扛把子的小弟拿著命令來找現任扛把子,現任一看編號不對(比自己的小),就知道這是過期命令,直接不認。這規矩能避免前任的舊指令擾亂社團。?
1.2 日常工作的職責之謎
????????當了扛把子,就得比普通話事人多扛不少活兒(這些事都得扛把子親自拍板,還得讓長老團盯著相關的節點,隨時匯報動靜)。
-
片區地盤調整(分區重分配):
-
為ZooKeeper中的/admin/reassign_partitions 節點注冊 PartitionReassignmentHandler
-
-
手下兄弟變動(ISR 集合變更):
-
為 ZooKeeper 中的/isr_change_notification節點注冊IsrChangeNotificetionHandler
-
-
換片區負責人(優先副本選舉):
-
為ZooKeeper中的/admin/preferred-replica-election節點添加PreferredReplicaElectionHandler
-
-
社團里新來重大任務(新增主題):
-
為 ZooKeeper 中的/brokers/topics 節點添加TopicChangeHandler
-
-
社團某些重大任務不干了(刪除主題):
-
為 ZooKeeper 中的/admin/delete_topics節點點添加TopicDeletionHandler。?
-
-
有新話事人加入(broker 上線)或者老話事人跑路(broker 下線),扛把子得盯著花名冊(/brokers/ids),及時調整人手。
- 為ZooKeeper中的/brokers/ids節點添加BrokerChangeHandler,用來處理broker增減的變化。
-
每天開工,扛把子得先從長老團那里把所有地盤、兄弟的信息抄一遍,整理成總表,再下發給所有片區,保證大家信息一致。?
-
為ZooKeeper中的/brokers/topics/<topic>節點添加PartitionModificationsHandler。?
-
????????對了,社團里還有個規矩:要不要定期調整各個地盤的負責人(優先副本均衡),得看扛把子手里的 “自動調整開關”(auto.leader.rebalance.enable)。這開關要是打開,扛把子會每 5 分鐘查一次,要是發現 10% 以上的地盤負責人不合適,就會自動換人。但老江湖都知道,這自動調整容易出亂子,萬一正忙著做事呢,突然換負責人會耽誤事,所以社團里一般都把這開關關了,換成手動調整 —— 就像用腳本 kafka-perferred-replica-election.sh 指定換人,穩妥得多。?
????????說到底,扛把子的存在就是為了讓整個社團不亂套:誰的地盤誰負責,兄弟變動有記錄,地盤調整有章法,就算扛把子換了人,有任期編號頂著,新老大照樣能順利接盤。這一套規矩下來,社團才能在香港的復雜環境里穩穩當當運行。