Kafka學習筆記(十) Kafka檔案儲存機制

2021-09-27 07:22:39 字數 1627 閱讀 9731

kafka的訊息以日誌檔案的形式進行儲存。不同主題下不同分割槽的訊息是分開儲存的。同乙個分割槽的不同副本也是以日誌的形式,分布在不同的broker上儲存

檢視/tmp/kafka-logs目錄,假設有4個partition

在kafka檔案儲存中,同乙個topic下有多個不同的partition,每個partiton為乙個目錄,partition的名稱規則為:topic名稱+有序序號,第乙個序號從0開始計,最大的序號為partition數量減1,partition是實際物理上的概念,而topic是邏輯上的概念

看起來,日誌的儲存是以副本為單位的。在程式邏輯上,日誌確實是以副本為單位的,每個副本對應乙個log物件。但實際在物理上,乙個log又劃分為多個segment進行儲存

kafka producer不斷傳送訊息,必然會引起partition檔案的無限擴張,這樣對於訊息檔案的維護以及已經被消費的訊息的清理帶來嚴重的影響,所以這裡以segment為單位又將partition細分

每個partition(目錄)相當於乙個巨型檔案被平均分配到多個大小相等的segment(段)資料檔案中(每個segment 檔案中訊息數量不一定相等)這種特性也方便old segment的刪除,即方便已被消費的訊息的清理,提高磁碟的利用率。每個partition只需要支援順序讀寫就行,segment的檔案生命週期由服務端配置引數(log.segment.bytes,log.roll.等若干引數)決定

segment檔案由兩部分組成,分別為「.index」檔案和「.log」檔案,分別表示segment索引檔案和資料檔案

segment檔案命令規則為:partition全域性的第乙個segment從0開始,後續每個segment檔名為上乙個segment檔案最後一條訊息的offset值,數值大小為64位,20位數字字元長度,沒有數字用0填充

index檔案,裡面儲存的是n對key-value,其中key是message在log檔案中的編號,value值表示該訊息的物理偏移位址。

index檔案中並沒有為資料檔案中的每條訊息都建立索引,而是採用了稀疏儲存的方式,每隔一定位元組的資料建立一條索引。這樣避免了索引檔案占用過多的空間,從而可以將索引檔案保留在記憶體中,但缺點是沒有建立索引的message不能一次定位到其在log檔案中的位置,這種情況下就需要做一次順序掃瞄,不過這次順序掃瞄的範圍很小

從partition中通過offset查詢message流程:

讀取offset=170420的訊息

首先查詢segment檔案,所有檔名稱被維護在concurrentskiplistmap中,根據二分查詢法從上面三個檔案:00000.index,170410.index,239430.index(前面0這裡省略) 中定位到第二個檔案

開啟這個segment的index檔案,繼續用二分查詢法找到offset小於或者等於指定offset的索引條目中最大的那個offset,這裡170410 + 8 = 170418,定位到[8,1325]

根據[8,1325]定位到00000000000000170410.log檔案中的1325的位置進行順序讀取,找到offset = 170420的message

kafka的message儲存採用了分割槽(partition),分段(logsegment)和稀疏索引來優化效能

參考

Kafka學習筆記 Kafka環境搭建

1.將kafka的tar包上傳到測試環境,解壓到 opt software,配置環境變數 kafka home opt software kafka 2.11 1.1.0 path kafka home bin scala home bin path export kafka home export...

學習筆記 Kafka

kafka kafka把資料往磁碟上寫,但是在磁碟上存它的讀寫速度比記憶體快,這個依賴於預讀和後寫功能,但是這個預讀和後寫必須是按照順序的方式,若沒有順序的方式優化的話,不存在什麼預讀和後寫。特點 訊息持久化 能落到磁碟 通過o 1 的磁碟資料結構提供資料的持久化 高吞吐量 分布式 擴充套件能力強 ...

Kafka學習筆記

1.1簡介 apache kafka 是分布式發布 訂閱訊息系統 訊息中介軟體 它最初由 linkedin 公司開發,之後成為 apache 專案的一部分。kafka 是一種快速 可擴充套件的 設計內在就是分布式的,分割槽的和可複製的提交日誌服務。apache kafka 與傳統訊息系統相比,有以下...