kafka訊息儲存機制理解、總結
阿新 • • 發佈:2021-11-21
本文記錄了閱讀《深入理解kafka核心設計與實踐原理》第5章日誌儲存的相關知識點和理解總結。
關於訊息儲存的資料夾佈局規則
在學習與理解了topic分割槽、broker的前提下,我們知道分割槽會被分配到特定的broker中。這裡繼續展開說明,分割槽儲存具體表現為topic+partitionID名稱的資料夾,如下:每個分割槽資料夾內至少包含這幾個檔案::/bitnami/kafka/data$ ls -al drwxr-xr-x 2 1001 root 4096 Nov 20 23:51 mgr-created-1-2 drwxr-xr-x 2 1001 root 4096 Nov 20 23:51 mgr-created-1-5 drwxr-xr-x 2 1001 root 4096 Nov 20 23:51 mgr-created-1-8
kafka1:/bitnami/kafka/data/mgr-created-1-8$ ls
00000000000000000000.index
00000000000000000000.log
00000000000000000000.timeindex
log檔案是訊息內容主體檔案;
index檔案是偏移量索引檔案;
timeindex是時間戳索引檔案。
這樣的三個檔案組合稱為日誌分段(Log Segment),分段檔案的名稱就是檔案內第一條訊息的offset;
以上這些概念的邏輯示意圖如下:
需要單獨說明的是: kafka的資料檔案目錄可以設定為多個,用於支援多個獨立的儲存裝置,提高IO效能。因此就帶來一個問題:當此broker節點分配到新分割槽時,在哪個資料目錄建立呢?答案:在分割槽數量最少的資料目錄中建立,直到各個資料目錄的topic+partitonID資料夾數量平衡。
關於2個索引檔案
日誌檔案的清理
kafka提供兩種清理策略:日誌刪除、日誌壓縮; 關於日誌刪除策略:- 基於時間:即超過xx天的日誌會被刪除。
- 基於大小:當所有log日誌總大小超過設定值,就會開始刪除最早的日誌。
- 基於日誌起始偏移量:略
- 相當於日誌整合,非單純的壓縮,尤其要與訊息壓縮區分開。
- 細節不在展開。
關於採用磁碟儲存與記憶體儲存的說明
kafka依賴於檔案系統(也就是磁碟)來儲存和快取訊息,而不是記憶體(不是說不用記憶體)。此處還澄清了一個迷惑點:即順序寫磁碟的速度並不慢。 而且按照kafka的設計,訊息寫入是順序的,即追加到最後的段檔案中,屬於典型的磁碟順序寫入。 藉助於現代作業系統的頁快取技術,充分利用記憶體空間,減少了直接的磁碟IO,更保證了磁碟讀寫的效能。關於零拷貝Zero-Copy
零拷貝的含義是資料直接從磁碟複製到網絡卡裝置,不需要經過應用程式處理。由此處說明可知,零拷貝主要應用於磁碟到網絡卡的轉發場景,而不是針對kafka特有。採用零拷貝也只是因為kafka主要依賴磁碟的原因。