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依賴磁盤但依然保障高性能的原因。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章