前面我們已經分享過幾篇Kafka的文章,最近簡單梳理了下Kafka內核相關的知識,涵蓋了Kafka架構總結,副本機制,控制器,高水位機制,日誌或消息存儲,消息發送與消費機制等方面知識。文末含對應的Kafka內核思維導圖,供參考。
1、 架構總結
1)Kafka實際上也是一個主從架構,有一個Controller角色即控制器,協調管理整個集羣;
2)有幾個Kafka術語肯定是不陌生的:broker,topic,partition,segment,生產者producer,消費者consumer;
2、消費發送機制
1)序列化器:序列化消息對象轉成字節數組,然後通過網絡傳輸。
2)分區器:計算消息發往的具體分區;如果顯示指定了partition,便不會走分區器。
3)消息緩衝池:客戶端的消息緩衝池,默認大小32M,見參數buffer.memory。
4)批量發送:緩衝池中消息會按batch分批次發送,默認批次大小16KB,見參數batch.size。
3、副本機制
1)分區副本默認1,見參數default.replication.factor。
2)副本作用(並不提供讀寫分離)
-
實現冗餘,提高消息可靠性;
-
實現高可用,參與leader選舉,在leader不可用時提高可用性。
3)leader副本選舉
-
由控制器負責;
-
選舉機制或策略:首先要弄明白AR,ISR的概念,基本策略是從AR中找第一個存活的副本,且該副本在ISR中。
4)Unclean leader選舉
參數unclean.leader.election.enable,用於控制是否允許非同步副本參與leader 選舉,默認false。如果開啓,則當ISR爲空時就會從這些副本中選舉新的leader,這個過程就稱爲Unclean leader選舉。
4、控制器概述
1)作用:協調與管理整個集羣,5個主要職責:
-
主題增刪改
-
分區重分配
-
leader選舉
-
元數據管理
-
broker成員管理,宕機或加入
2)控制器選舉:基於zookeeper實現,利用了zookeeper的znode模型與監聽機制。
3)控制器故障轉移
-
存在單點故障,但是每個broker節點都可以成爲controller;
-
故障轉移即failover也是基於zookeeper實現的,znode模型與監聽機制,/controller節點。
5、HW機制
1)概念
HW即高水位,是Kafka副本對象的重要屬性,分區的高水位由leader副本的高水位表示,含義是被follower副本同步之後的位置。
2)作用
-
定義消息可見性,只有分區高水位以下的消息才能被消費;
-
幫助kafka完成副本同步,kafka是基於高水位實現的異步的副本同步機制。
3)LEO的概念
含義是日誌末端位移(Log End Offset),下一條消息寫入的位移。
6、消息消費機制
1)拉取機制
Kafka生產端是推的機制即Push,消費端是拉的機制即Pull。
2)Pull的優缺點
-
優點是消費端可以自己控制消息的讀取速度和數量;
-
缺點是不知道服務端有沒有數據,所以要一直pull或隔一定時間pull,可能要pull多次並等待。
3)消息投遞語義:
Kafka默認保證at-least-once delivery,容許用戶實現at-most-once語義,exactly-once的實現取決於目的存儲系統。
4)分區分配策略
-
RangeAssignor:按照分區範圍分配,當前默認策略;
-
RoundRobinAssignor:輪詢的方式分配;
-
StickyAssignor:Kafka 0.11版本引入,根據更多指標比如負載,儘可能均勻。
7、日誌存儲機制
1)原理
-
分段存儲,這裏的段segment指的是日誌段文件,Kafka中的日誌含義即是消息或數據,日誌回滾受log.segment.bytes控制,默認1G;
-
索引文件,一個稀疏格式的索引,受參數log.index.interval.bytes控制,默認4KB。即不是每條數據都會寫索引,默認每寫4KB數據纔會寫一條索引。
$ ll
-rw-r--r-- 1 kafka kafka 1002496 Apr 25 17:08 00000000000051402174.index
-rw-r--r-- 1 kafka kafka 1073741338 Apr 25 17:08 00000000000051402174.log
-rw-r--r-- 1 kafka kafka 10485760 Apr 26 15:03 00000000000051638285.index
-rw-r--r-- 1 kafka kafka 219984088 Apr 26 15:04 00000000000051638285.log
2)日誌留存策略
Kafka 會定期檢查是否要刪除舊消息,見參數 log.retention.check.interval.ms,默認5分鐘。當前有三種日誌留存策略:
-
基於空間:log.retention.bytes,默認未開啓;
-
基於時間:log.retention.hours(mintues/ms),默認7天;
-
基於起始位移:Kafka 0.11.0.0版本引入,解決流處理場景中已處理的中間消息刪除問題。
目前基於時間的日誌留存策略最常使用。
爲了更好的精進學習Kafka,筆者參考本文製作了的一張思維導圖,分享:
關注本公衆號,後臺回覆 kafka2020 即可下載Kafka內核高清PDF文檔。
往期推薦
2、HBase原理 | HBase Compaction介紹與參數調優