1.選舉Leader 性能
Leader 是 Partition 級別的,當一個 Broker 掛掉後,全部 Leader 在該 Broker 上的 Partition 都會被從新選舉,選出一個新 Leader。spa
Kafka 先使用 ZooKeeper 在 Broker 中選出一個 Controller,用於上述 Partition分配和 Leader 選舉。操作系統
Controller 會在 ZooKeeper 的 /brokers/ids 節點上註冊 Watch 監聽,一旦有 Broker 宕機,Controller就收到通知。 blog
Partition 分配: 排序
Leader 選舉:索引
Controller 從 ZooKeeper 的 /brokers / topics / [topic名稱] / partitions / [partition名稱] / state 中,讀取對應 Partition 的 ISR(in-sync replica 已同步的副本)列表,選一個出來作 Leader。 同步
ISR 列表中的機器是會變化的,根據配置 replica.lag.time.max.ms,多久沒同步,就會從 ISR 列表中去除。 it
0.10版本以前,還有個參數是根據落後多少條消息就踢出 ISR,在 0.10 版本後就去掉了,由於這個值很難取,在高峯的時候很容易出現節點不斷的進出 ISR 列表的狀況。io
選出 Leader 後,更新 ZooKeeper,而後Controller發送 LeaderAndISRRequest 給受影響的 Broker,通知全部相關Broker:新leader已產生。集羣
選舉完成以後,全部對某個 Partition 的請求,實際操做的都是 Leader,而後其餘 Follower 再 Pull 消息同步。
2.Partition的分發策略:
3.Partition文件:
Partition 在操做系統中就是一個個的文件夾,每一個 Partition 的文件夾下面會有多組 Segment 文件。
每組 Segment 文件又包含 .index 文件、.log 文件、.timeindex 文件(早期版本中沒有)三個文件。
Log 文件就是實際存儲 Message 的地方,而 Index 和 Timeindex 文件爲索引文件,用於檢索消息。
文件的命名是以該 Segment 最小 Offset 來命名的,以下圖中間那個segment的命名是 368796.index, 存儲了Offset 爲 368796~1105813 的消息。
創建在 Offset 爲有序的基礎上,Kafka利用 Segment分段文件記錄+Segment文件內索引+有序Offset+稀疏索引+二分查找+順序查找等多種手段來高效的查找數據。
在0.10版本前,消費者將消費到的 Offset 維護在 Zookeeper 中,Consumer 每間隔一段時間上報一次,容易致使重複消費,且性能很差;
0.10版本後,消費者消費到的 Offset 已經直接維護在 Kafka 集羣的 __consumer_offsets 這個Topic 中。