kafka log文件和offset原理


log與offset

日志存儲路徑根據配置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

./kafka-run-class.sh kafka.tools.DumpLogSegments --files /srv/BigData/kafka/data1/kafka-logs/topic-9/00000000000000033986.index

 

 

通過log找message流程

 

 

比如:要查找絕對offset為7的Message:

  1. 用二分查找確定它是在哪個LogSegment中,自然是在第一個Segment中。
  2. 打開這個Segment的index文件,也是用二分查找找到offset小於或者等於指定offset的索引條目中最大的那個offset。自然offset為6的那個索引是我們要找的,通過索引文件我們知道offset為6的Message在數據文件中的位置為9807。
  3. 打開數據文件,從位置為9807的那個地方開始順序掃描直到找到offset為7的那條Message。

 

// 官方文檔

http://kafka.apache.org/0100/documentation.html#log


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM