一、Kafka是什麼
Kafka是一個開源的分佈式消息隊列,通過緩衝,來異構、解耦系統,與其他MQ相比,其優勢在於高吞吐高性能。
上圖所示爲Kafka的基本架構,主要爲:
Cluster:由多個服務器組成,每個服務器單獨叫broker
Broker:Kafka集羣中包含的服務器
Producer:消息生產者,發佈消息到Kafka集羣的終端或者服務
Consumer:消息消費者,負責消費數據
Topic:主題,一類消息的名稱
二、分片與副本機制
分片機制:主要解決了單臺服務器存儲容量有限的問題。
當數據量非常大的時候,一個服務器存放不了,就將數據分成兩個或者多個部分,存放在多臺服務器上。每個服務器上的數據,叫做一個分片。
副本機制:解決了數據存儲的高可用問題。
當數據只保存一份的時候,有丟失的風險。爲了更好的容錯和容災,將數據拷貝幾份,保存到不同的機器上。
三、消息不丟失機制
1、生產者端
生產者數據部不丟失,需要服務器端返回一個ack。
1) 消息確認分爲三個狀態
a) 0:生產者只負責發送數據
b) 1:某個partition的leader收到數據給出響應
c) -1:某個partition的所有副本都收到數據後給出響應
2) 在同步模式下
a) 生產者等待10S,如果broker沒有給出ack響應,就認爲失敗。
b) 生產者重試3次,如果還沒有響應,就報錯。
3) 在異步模式下
a) 先將數據保存在生產者端的buffer中。Buffer大小是2萬條。
b) 滿足數據閾值或者數量閾值其中的一個條件就可以發送數據。
c) 發送一批數據的大小是500條。
如果broker遲遲不給ack,而buffer又滿了。可以設置是否直接清空buffer中的數據。
2、Broker端
broker端的消息不丟失,其實就是用partition副本機制來保證。
Producer ack -1(all). 能夠保證所有的副本都同步好了數據。其中一臺機器掛了,並不影像數據的完整性。
3、消費者端
消費者,有偏移量記錄消費到哪裏。
只要記錄offset值,消費者端不會存在消息不丟失的可能。只會重複消費。
當Kafka中的偏移量與zookeeper中的偏移量不一致就會重複消費
四、分發策略
分發就是消息發到哪裏,哪個分片
-
如果是用戶指定了partition,生產就不會調用DefaultPartitioner.partition()方法,數據分發策略的時候,可以指定數據發往哪個partition。當ProducerRecord 的構造參數中有partition的時候,就可以發送到對應partition上。
public ProducerRecord(String topic, Integer partition, K key, V value) { this(topic, partition, null, key, value, null); }
-
當用戶指定key,使用hash算法,找出分片。
-
當用既沒有指定partition也沒有key。使用輪詢的方式發送數據。
五、負載均衡
生產者生產消息太快,消費者消費不過來怎麼辦?
- 點對點消費
- 消費者組裏,消費者<=分片數
六、文件存儲機制
segment段中有兩個核心的文件一個是log,一個是index。 當log文件等於1G時,新的會寫入到下一個segment中。
超1G創建新的文件,過期會刪掉(默認7天刪除)。
磁盤的文件只能順序往裏面寫,不能改。因爲,硬盤的隨機寫和順序寫有非常大的差異。
爲了保證高吞吐,只能讓你在文件後面一直追加。
七、文件查詢機制
讀取offset=368776的message,需要通過下面2個步驟查找。
a、查找segment file
00000000000000000000.index表示最開始的文件,起始偏移量(offset)爲0
00000000000000368769.index的消息量起始偏移量爲368770=368769+1
00000000000000737337.index的起始偏移量爲737338=737337+1
其他後續文件依次類推。
以起始偏移量命名並排序這些文件,只要根據offset**二分查找**文件列表,就可以快速定位到具體文件。當offset=368776時定
位到00000000000000368769.index和對應log文件。
b、通過 segment file 查找message
當offset=368776時,依次定位到00000000000000368769.index的元數據物理位置和00000000000000368769.log的物理偏移地
址然後再通過00000000000000368769.log順序查找直到offset=368776爲止。