Kafka 控制器(controller)
在kafka集群中 會存在一個或者多個broker(一個服務器就是一個broker),其中有一個broker會被選舉為控制器 kafka controller ,負責管理整個集群中所有副本、分區的狀態,主要為以下三個功能:
- 當某個分區中的leader 副本發生故障時,控制器負責選舉新的leader副本
- 某個分區的ISR信息發生變化時,控制器負責通知所有的broker更新元數據信息
- 某個topic增加分區時,控制器負責分區的重新分配
控制器如何選舉呢?
依賴于zookeeper,選舉成功的controller會在zk中創建/controller臨時節點。
每個broker在啟動的時候都會嘗試創建一個controller節點,但是只有一個可以成功,創建成功后的臨時節點 內容可以如下所示:
{“version”:1,“brokerid”:0,“timestamp”:“xxxxxxxxx”}
version貌似目前是固定的
brokerid 表示選舉成功的broker
timestamp 表示選舉成功時的時間戳
另外 在zk中還有一個/controller_epoch持久節點,記錄當前的控制器是第幾代控制器,初始值為1,保證控制器的唯一性。
控制器在選舉成功后會讀取zk的各個節點數據來初始化上下文信息,這些信息需要同步到其他的普通broker節點中。這就涉及到線程安全問題,kafka控制器是如何確保線程安全的同時又確保性能的呢?
如圖所示,將每個事件(這些事件會讀取或者更新上下文信息)封裝,按照先后順序暫存到LinkedBlockingQueue中,使用一個ControllorEventThread線程按照FIFO的原則處理各個事件
優雅關閉:
kafka-server-stop.sh 不一定都有用。
分區leader的選舉
由kafka controllor負責,選舉規則:在ISR中存活,在AR中靠前的第一個。
ISR:表示和 Leader 保持同步的 Follower 集合 (“活著”),follower長時間沒有向leader發送通信請求或者同步數據,就會被踢出isr,時間由replica.lag.time.max.ms參數設定默認是30s。
OSR:表示延遲過多的副本。(“死了”)
AR:ISR+OSR
參考:《深入理解 Kafka:核心設計與實踐原理》