
Kafka控制器的選舉
Kafka控制器介紹
在Kafka集群中會有一個或多個broker,其中有一個broker會被選舉為控制器(Kafka Controller),它負責管理整個集群中所有分區和副本的狀態。
- 當某個分區的leader副本(一個分區會有多個副本,其中只有leader副本對外提供讀寫服務)出現故障時,由控制器負責為該分區選舉新的leader副本;
- 當檢測到某個分區的ISR集合發生變化時,由控制器負責通知所有broker更新其元數據信息;
- 當為某個Topic增加分區數量時,由控制器負責分區的重新分配。
分區集合介紹
- AR(Assigned Replicas):分區中的所有副本。
- ISR(In-Sync Replicas):所有與leader副本保持一定程度同步的副本(包括leader副本在內)。
- OSR(Out-of-Sync Replicas):與leader副本同步滯后過多的副本(不包括leader副本)。
Kafka控制器選舉原理
Kafka中的控制器選舉工作依賴於Zookeeper,成功競選成為控制器的broker會在Zookeeper中創建/controller臨時節點。
每個broker會對/controller節點添加監聽器,以此來監昕此節點的數據變化,當/controller節點發生變更,就會觸發新一輪的選舉。
臨時節點的內容:
{"version":1,"brokerid":0,"timestamp":"1593330804078"}
- version:Kafka版本相關,對同一個Kafka版本來說為固定值。
- brokerid:表示成為控制器的broker的id編號。
- timestamp:表示競選成為控制器時的時間戳(精確到毫秒)。
Broker選舉
在任意時刻,集群中有且只有一個控制器,每個broker都會在內存中保存當前控制器的brokerid值,這個值標識activeControllerId。
啟動時選舉
集群中第一個啟動的broker會通過在zookeeper中創建臨時節點/controller來讓自己成為控制器,其他broker啟動時
會去嘗試讀取/controller節點的brokerid的值,讀取到的brokerid的值不為-1知道已經有其他broker節點成功競選為控制器,就會在zookeeper中創建watch對象,便於它們收到控制器變更的通知。
leader異常選舉
那么如果broker由於網絡原因與zookeeper斷開連接或者異常退出,那么其他broker通過watch收到控制器變更的通知,就會去嘗試創建臨時節點/controller,如果有一個broker創建成功,那么其他broker就會收到創建異常通知,也就意味着集群中已經有了控制器,其他broker只需創建watch對象即可。
follower異常
如果集群中有一個broker發生異常退出了,那么控制器就會檢查這個broker是否有分區的副本leader,如果有那么這個分區就需要一個新的leader,此時控制器就會去遍歷其他副本,決定哪一個成為新的leader,同時更新分區的ISR集合。
broker加入
如果有一個broker加入集群中,那么控制器就會通過brokerid去判斷新加入的broker中是否含有現有分區的副本,如果有,就會從分區副本中去同步數據。
epoch防止腦裂
Kafka通過controller_epoch來保證控制器的唯一性,進而保證相關操作的一致性。
- controller_epoch是一個整型值,存放在Zookeeper的/controller_epoch這個持久節點中;
- controller_epoch值用於記錄控制器發生變更的次數,即記錄當前的控制器是第幾代控制器;
- controller_epoch的初始值為1,當控制器發生變更時,就將該字段值加1。
每個和控制器交互的請求都會攜帶controller_epoch字段:
- 如果請求的controller_epoch值小於內存中的controller_epoch值,則認為這個請求是向已經過期的控制器發送的請求,那么這個請求會被認定為無效的請求。
- 如果請求的controller_epoch值大於內存中的controller_epoch值,那么說明已經有新的控制器當選了。
分區Leader的選舉
controller感知到分區leader所在的broker掛了,controller會從replicas副本列表(同時在ISR列表里)中取出第一個broker作為leader。
leader副本介紹
- leader副本負責維護和跟蹤ISR集合中所有follower副本的滯后狀態,當follower副本落后太多或失效時,leader副本會把它從ISR集合中剔除。
- 當OSR集合中有follower副本“追上”了leader副本,那么leader副本會把它從OSR集合轉移至ISR集合。
- 默認情況下,當leader副本發生故障時,只有在ISR集合中的副本才有資格被選舉為新的leader。
消費組Leader的選舉
GroupCoordinator需要為消費組內的消費者選舉出一個消費組的leader,這個選舉的算法很簡單,當消費組內還沒有leader,那么第一個加入消費組的消費者即為消費組的leader,如果當前leader退出消費組,則會挑選以HashMap結構保存的消費者節點數據中,第一個鍵值對來作為leader。