kafka消費者組重平衡分析

一 概念

一個consumer group 通過一定的分配算法來分配消費訂閱的topic的所有分區。具體有協調者完成重平滑流程。

二 觸發條件

組成員發送變更,如consumer增加或減少如consumer進程崩潰、consumer進程所在機器宕機、consumer異常比如poll間隔太久;

組訂閱的topic數變更,如使用基於正則的訂閱,當匹配正則的新的topic創建時會觸發;

組訂閱topic的分區數變化,如使用命令增加了topic的分區數。

三 分區分配算法

range算法

round-roubin算法

四 重平衡協議

group與協調者共同使用協議完成組的重平衡,主要包括5個協議:

1 JointGroup: consumer請求加入組,consumer->協調者

2 LeaveGroup: consumer主動請求立刻組,consumer->協調者

3 DescribeGroup: 描述組信息如成員/訂閱信息/分配方案,管理員>協調者

4 SyncGroup: 羣主(第一個加入的consumer)把分配方案同步到組內所有成員,consumer LEADER->協調者

4 HeartBeat: consumer定期向協調者發送心跳,表面自己依然運行。每個consumer根據心態響應中是否包含重平衡標註決定是否開啓新一輪平衡。consumer->協調者

 

五 重平衡流程

5.1 確定協調者所在的broker

確定協調者的算法與確定offset被提交到__consumer_offsets的目標分區算法相同:

計算abs(group_id)%offtsets.topic.num.partions(默認是50)設爲a

尋找__consumer_offstes主題分區a對應的LEADER副本所在broker(通過consumer發送MetaDataRequest請求到任意一個broke即可,具體參考https://blog.csdn.net/yanerhao/article/details/106120753

然後consumer連接與該broker的socket連接。

5.2 開始重平衡(加入組和同步更新)

1 重平衡條件觸發,協調者在所有組內consumer的心跳響應中加入重平衡標註

2 加入組。組內consumer收到響應後開始重平衡。向協調者發送JointGroup請求,當收集完所有JointGroup請求後,從中選擇第一個加入的consumer作爲羣主,並把所有成員信息以及訂閱的信息發送給羣主。故可以看到協調者是一個broker,羣主是一個consumer,是由羣主而非協調者完成分區分配,協調者主要是協調完成重平衡。

3 分區分配。羣主獲取所有consumer和分區後採用range或round-roubin或其他算法完成所有topic的所有分區與組內消費組的分配。

4 同步分區結果。羣主會把分區分配方案裝入SyncGroup請求發送給協調者,再由協調者從請求中把屬於每個consumer的方案單獨抽出來作爲SyncGroup響應下發給所有consumer。故SyncGroup請求是所有consumer發給協調者但只有羣主的纔有方案,SyncGroup響應是協調者下方給所有consumer。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章