深入瞭解Kafka【二】工作流程及檔案儲存機制
1、Kafka工作流程
Kafka中的訊息以Topic進行分類,生產者與消費者都是面向Topic處理資料。 Topic是邏輯上的概念,而Partition是物理上的概念,每個Partition分為多個Segment,每個Segment對應兩個檔案,一個索引檔案,一個日誌檔案。Producer生產的資料會被不斷的追加到日誌檔案的末端,且每條資料都有自己的offset。消費組中的每個Consumer都會實時記錄自己消費到了哪個offset,以便出錯恢復時,從上次的位置繼續消費。2、檔案儲存機制
由於Producer產生的訊息會不斷的追加到日誌檔案的末尾,這樣將對訊息檔案的維護以及以消費的訊息的清理帶來嚴重的影響,因此,Kafka引入的分片和索引的設計。每個Partition對應一個資料夾;“topic名稱 分割槽序號”。每個Partition分為多個Segment,Segment分為兩類檔案:“.index”索引檔案與“.log”資料檔案,其中索引檔案和資料檔案都在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檔案的詳細內容:
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)等等欄位,可以確定一條訊息的大小,即讀取到哪裡截止。