1. 程式人生 > 程式設計 >深入瞭解Kafka【二】工作流程及檔案儲存機制

深入瞭解Kafka【二】工作流程及檔案儲存機制


1、Kafka工作流程

kafka工作流程.png
Kafka中的訊息以Topic進行分類,生產者與消費者都是面向Topic處理資料。 Topic是邏輯上的概念,而Partition是物理上的概念,每個Partition分為多個Segment,每個Segment對應兩個檔案,一個索引檔案,一個日誌檔案。Producer生產的資料會被不斷的追加到日誌檔案的末端,且每條資料都有自己的offset。消費組中的每個Consumer都會實時記錄自己消費到了哪個offset,以便出錯恢復時,從上次的位置繼續消費。

2、檔案儲存機制

由於Producer產生的訊息會不斷的追加到日誌檔案的末尾,這樣將對訊息檔案的維護以及以消費的訊息的清理帶來嚴重的影響,因此,Kafka引入的分片和索引的設計。每個Partition對應一個資料夾;“topic名稱 分割槽序號”。每個Partition分為多個Segment,Segment分為兩類檔案:“.index”索引檔案與“.log”資料檔案,其中索引檔案和資料檔案都在Partition對應的資料夾中。

kafka檔案儲存機制.png
假設test-topic有3個分割槽,則對應的資料夾名稱為:test-topic-0、test-topic-1、test-topic-2。 partition資料夾下檔案形如:

00000000000000000000.index
00000000000000000000.log
00000000000000170410.index
00000000000000170410.log
00000000000000239430.index
00000000000000239430.log
複製程式碼

可以看到有索引檔案與資料檔案,有3個Segment。 這兩個檔案的命令規則為:Partition全域性的第一個Segment從0開始,後續每個Segment檔名為上一個Segment檔案最後一條訊息的offset值,數值大小為64位,20位數字字元長度,沒有數字用0填充。

以Segment檔案的詳細內容:

segment檔案.png
圖中,索引檔案儲存的元資料指向資料檔案中的message的物理偏移地址。

3、從partition中通過offset查詢message

以上圖為例,讀取offset=170418的訊息,首先查詢segment檔案,其中00000000000000000000.index 為最開始的檔案,第二個檔案為 00000000000000170410.index(起始偏移為 170410 1=170411),而第三個檔案為 00000000000000239430.index(起始偏移為 239430 1=239431),所以這個 offset=170418 就落到了第二個檔案之中。其它後續檔案可以依次類推,以其偏移量命名並排列這些檔案,然後根據二分查詢法就可以快速定位到具體檔案位置。其次根據 00000000000000170410.index 檔案中的 [8,1325] 定位到 00000000000000170410.log 檔案中的 1325 的位置進行讀取。要是讀取 offset=170418 的訊息,從 00000000000000170410.log 檔案中的 1325的位置進行讀取,那麼,如何確定何時讀完本條訊息呢? 這個問題由訊息的物理結構解決,訊息都具有固定的物理結構,包括:offset(8 Bytes)、訊息體的大小(4 Bytes)、crc32(4 Bytes)、magic(1 Byte)、attributes(1 Byte)、key length(4 Bytes)、key(K Bytes)、payload(N Bytes)等等欄位,可以確定一條訊息的大小,即讀取到哪裡截止。

參考

深入淺出理解基於 Kafka 和 ZooKeeper 的分散式訊息佇列

tencent.jpg