Kafka知識點匯總
阿新 • • 發佈:2017-05-21
net all 1.5 try 安全 決定 keep 獨立 文件
Part
整體結構
Producer
producer依據用戶指定的算法,將消息發送到指定的partitionPart
- kafka以topic來進行消息管理,每一個topic包括多個part(ition),每一個part相應一個邏輯log,有多個segment組成。
- 每一個segment中存儲多條消息(見下圖),消息id由其邏輯位置決定。即從消息id可直接定位到消息的存儲位置。避免id到位置的額外映射。
- 每一個part在內存中相應一個index,記錄每一個segment中的第一條消息偏移。
- 公布者發到某個topic的消息會被均勻的分布到多個part上(隨機或依據用戶指定的回調函數進行分布)。broker收到公布消息往相應part的最後一個segment上加入該消息,
- 當某個segment上的消息條數達到配置值或消息公布時間超過閾值時。segment上的消息會被flush到磁盤。僅僅有flush到磁盤上的消息訂閱者才幹訂閱到。
- segment達到一定的大小後將不會再往該segment寫數據。broker會創建新的segment。
Broke
- 消息不在內存中cache,直接寫入到磁盤,充分利用磁盤的順序讀寫性能
- 直接使用linux 文件系統的cache,來高效緩存數據。
- 即使消息被消費,消息仍然不會被馬上刪除.日誌文件將會依據broker中的配置要求,保留一定的時間之後刪除
- 採用linux Zero-Copy提高發送性能。
- Topic劃分為多個partition,提高parallelism
- 能夠通過實現Partitioner接口來定制Partition的分區規則
- At least one 消息絕不會丟。但可能會反復傳輸
- 通過冗余機制來保證信息的安全
- 一個Broke能夠包括多個Topic的Part,一個Topic也能夠將多個Part分布到不同的不同的Broke上
- 數據壓縮:支持GZIP和Snappy壓縮協議
Consumer 公共特性
- Consumer依據消費能力自主控制消息拉取速度
- Consumer依據自身情況自主選擇消費模式,比如批量,反復消費,從尾端開始消費等
Lower Level Consumer
- Consumer從kafka集群pull數據
- Consumer負責維護消息的消費記錄,控制獲取消息的offset
- Consumer可將offset設成一個較小的值,又一次消費一些消息
- 必須找出指定Topic Partition中的lead
broker
- 加入事務管理機制以保證消息被處理且僅被處理一次
- 在一個處理過程中僅僅消費Partition當中的一部分消息
High Level Consumer
- High Level模式下的Group Name 是整個Kafka集群的全局變量
- 消息消費以Consumer Group為單位,每一個Consumer Group中能夠有多個consumer,每一個consumer是一個線程。topic的每一個partition同一時候僅僅能被某一個consumer讀 取。Consumer Group相應的每一個partition都有一個最新的offset的值,存儲在zookeeper上的。
所以在正常情況下不會出現反復消費的情況。
- 由於consumer的offerset並非實時的傳送到zookeeper(通過配置來制定更新周期)。所以Consumer假設突然Crash,有可能會讀取反復的信息
-
High Level Consumer 能夠而且應該被使用在多線程的環境,線程模型中線程的數量(也代表group中consumer的數量)和topic的partition數量有關,以下列舉一些規則:
- 當提供的線程數量多於partition的數量。則部分線程將不會接收到消息;
- 當提供的線程數量少於partition的數量,則部分線程將從多個partition接收消息;
- 當某個線程從多個partition接收消息時,不保證接收消息的順序;可能出現從partition3接收5條消息,從partition4接收6條消息。接著又從partition3接收10條消息。
- 當加入很多其它線程時,會引起kafka做re-balance, 可能改變partition和線程的相應關系。
Consumer Group
- 同意consumer group(包括多個consumer。如一個集群同一時候消費)對一個topic進行消費。不同的consumer group之間獨立訂閱。互不幹擾。
- 當broker或consumer增加或離開時會觸發負載均衡算法,使得一個consumer group內的多個consumer的訂閱負載平衡
- 每一個partition僅僅會被consumer group內的一個consumer消費,故kafka保證每一個partition內的消息會被順序的訂閱,但多個Consumer Group可同一時候消費這一消息。。
- 每一個Consumer屬於一個特定的Consumer Group(可為每一個Consumer指定group name,若不指定group name則屬於默認的group
- 假設須要實現廣播,僅僅要每一個Consumer有一個獨立的Group
- 要實現單播僅僅要全部的Consumer在同一個Group裏
Zookeeper
- 每一個broker啟動後會在zookeeper上註冊一個暫時的broker registry,包括broker的ip地址和port號。所存儲的topics和partitions信息。
- 每一個consumer啟動後會在zookeeper上註冊一個暫時的consumer registry:包括consumer所屬的consumer group以及訂閱的topics。
- 每一個consumer group關聯一個暫時的owner registry和一個持久的offset registry。對於被訂閱的每一個partition包括一個owner registry。內容為訂閱這個partition的consumer id;同一時候包括一個offset registry。內容為上一次訂閱的offset。
Kafka知識點匯總