kafka log檔案和offset原理

2022-07-03 17:24:11 字數 1219 閱讀 8797

日誌儲存路徑根據配置log.dirs ,日誌檔案通過 topic-partitionid分目錄,再通過log.roll.hours 和log.segment.bytes來分檔案,預設是超過7天,或者是1gb大小就分檔案,在kafka的術語中,這被稱為段(segment )。例如00000000000000033986.log,檔名就是offset,除了資料檔案之外,相應的還有乙個index檔案,例如00000000000000033986.index。記錄的是該資料檔案的offset和對應的物理位置,正是有了這個index檔案,才能對任一資料寫入和檢視擁有o(1)的複雜度,index檔案的粒度可以通過引數log.index.interval.bytes來控制,預設是是每過4096位元組記錄一條index,太小意味著讀取效率更高但是index檔案會變大。基於這個特性,可以根據時間找到粗粒度的offset。(0.10.0.1版本之後增加記錄了時間戳,粒度更細)

官方展示的log和segment關係

可以通過命令手動檢視index檔案

# /srv/bigdata/kafka/data1/kafka-logs這個路徑就是log.dirs,topic-9是topic-partitionid

比如:要查詢絕對offset為7的message:

用二分查詢確定它是在哪個logsegment中,自然是在第乙個segment中。

開啟這個segment的index檔案,也是用二分查詢找到offset小於或者等於指定offset的索引條目中最大的那個offset。自然offset為6的那個索引是我們要找的,通過索引檔案我們知道offset為6的message在資料檔案中的位置為9807。

開啟資料檔案,從位置為9807的那個地方開始順序掃瞄直到找到offset為7的那條message。

// 官方文件

kafka Log 原始碼結構和初始化邏輯學習筆記

log 檔案位於core src main scala kafka log log.scala 目錄下。改檔案定義了10個類和物件 loglog伴生物件定義一些常量輔助方法。log 類是log檔案最核心部分。rollparams 定義控制日誌段是否切分的資料結構,對應的伴生物件也是對應的工廠方法。l...

a 檔案 和 so 檔案

所謂靜態鏈結是指把要呼叫的函式或者過程鏈結到可執行檔案中,成為可執行檔案的一部分。當多個程式都呼叫相同函式時,記憶體中就會存在這個函式的多個拷貝,這樣就浪費了寶貴的記憶體資源。so檔案是共享庫檔案 動態鏈結 動態鏈結所呼叫的函式 並沒有被拷貝到應用程式的可執行檔案中去,而是僅僅在其中加入了所呼叫函式...

lib檔案和dll檔案

什麼是lib檔案,lib和dll的關係如何 1 lib是編譯時需要的,dll是執行時需要的。如果要完成源 的編譯,有lib就夠了。如果也使動態連線的程式執行起來,有dll就夠了在開發和除錯階段,當然最好都有。2 一般的動態庫程式有lib檔案和dll檔案。lib檔案是必須在編譯期就連線到應用程式中的,...