Kafka的選舉機制



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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM