1. 程式人生 > 其它 >kafka訊息儲存機制理解、總結

kafka訊息儲存機制理解、總結

本文記錄了閱讀《深入理解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個索引檔案

偏移量索引檔案:用來建立訊息偏移量offset到實體地址之間的對映關係,方便快速定位訊息所在的物理檔案的位置。 時間戳索引檔案:根據時間接戳來查詢對應的偏移量資訊。找到偏移量需要再次查詢偏移量索引檔案才能最終找到物理檔案位置。 kafka中的索引採用係數索引構造,並不保證每個訊息都有索引項,而是寫入一定數量的訊息時才增加一個索引項。好處就是新增訊息的維護成本低、索引檔案佔用空間少,保證了訊息寫入效能。 由於偏移量和時間戳都是單調遞增的,因此查詢時,都是利用二分查詢快速定位。

日誌檔案的清理

kafka提供兩種清理策略:日誌刪除、日誌壓縮; 關於日誌刪除策略:
  • 基於時間:即超過xx天的日誌會被刪除。
  • 基於大小:當所有log日誌總大小超過設定值,就會開始刪除最早的日誌。
  • 基於日誌起始偏移量:略
關於日誌壓縮策略:
  • 相當於日誌整合,非單純的壓縮,尤其要與訊息壓縮區分開。
  • 細節不在展開。

關於採用磁碟儲存與記憶體儲存的說明

kafka依賴於檔案系統(也就是磁碟)來儲存和快取訊息,而不是記憶體(不是說不用記憶體)。此處還澄清了一個迷惑點:即順序寫磁碟的速度並不慢。 而且按照kafka的設計,訊息寫入是順序的,即追加到最後的段檔案中,屬於典型的磁碟順序寫入。 藉助於現代作業系統的頁快取技術,充分利用記憶體空間,減少了直接的磁碟IO,更保證了磁碟讀寫的效能。

關於零拷貝Zero-Copy

零拷貝的含義是資料直接從磁碟複製到網絡卡裝置,不需要經過應用程式處理。由此處說明可知,零拷貝主要應用於磁碟到網絡卡的轉發場景,而不是針對kafka特有。採用零拷貝也只是因為kafka主要依賴磁碟的原因。

綜述

關於磁碟這一章節,講解了kafka自身的分割槽格式、索引、清理等功能機制。同時也從底層原理方面解釋了kafka依賴磁碟但依然保障高效能的原因。