集羣成員關係:網絡
Kafka使用zookeeper維護集羣成員信息,每一個broker擁有惟一標識符,這個標識符能夠在配置文件裏指定也能夠自動生成,會註冊到Zookeeper的/brokers/ids路徑下架構
控制器:併發
本質就是一個broker,可是還負責分區首領選舉線程
Kafka使用zookeeper的臨時節點來選舉控制器,並在節點加入集羣或退出集羣時通知控制器,控制器負責在節點加入或離開集羣時進行分區首領的選舉。控制器使用epoch來避免腦裂3d
複製:日誌
複製功能時Kafka架構核心blog
Kafka使用主題來組織數據,每一個主題分爲若干分區,每一個分區有多個副本,保存在broker上,每一個broker能夠保存成千上百屬於不一樣主題和分區的副本索引
副本有如下2個類型:隊列
首領副本: 每一個分區都有一個首領副本,全部的生產者請求和消費者請求都會通過這個副本kafka
跟隨者副本:首領之外的副本都是跟隨者副本,跟隨者副本惟一任務是從首領那裏複製消息,保持與首領一致的狀態
只有持續請求獲得消息的副本被稱爲同步的副本,首領失效時纔有機會成爲首領
除了當前首領以外,每一個分區還有一個首選首領-------建立主題時選定的首領就是分區的首選首領
auto.leader.rebalance.enable=true 會檢查首選首領是否是當前首領,若是不是,而且該副本是同步的,就會觸發首領選舉,讓首選首領成爲首領
分區的副本清單裏第一個副本通常就是首選首領
處理請求:
broker大部分工做就是處理客戶端/分區副本/控制器發送給分區首領的請求。Kafka提供了一個基於TCP的二進制協議,指定請求消息的格式以及broker如何對請求作出響應
客戶端發起鏈接併發送請求,broker處理請求並作出響應,broker按照請求到達順序處理他們----這種順序保證讓Kafka具備消息隊列的特性,同時保證保存的消息也是有序的
broker會在監聽的每個端口上運行一個Acceptor線程,這個線程會建立一個鏈接,並交給Processor線程處理,processor線程也稱爲網絡線程,負責從客戶端獲取請求消息,放進請求隊列,而後從響應隊列獲取響應消息,發送給客戶端
索引:
索引把偏移量映射到片斷文件和偏移量在文件裏的位置
索引若出現損壞,Kafka會自動從新生成索引
每一個日誌片斷能夠分爲2個部分:
乾淨的部分 未清理過,每一個鍵只有一個對應的值
污濁的部分 這些消息是上一次清理以後寫入的
log.clear.enabled=true kafka啓用清理功能