kafka 系列 -- 7.2、日誌索引
阿新 • • 發佈:2020-10-11
文章目錄
kafka
的索引檔案以稀疏索引的方式構造訊息的索引,每個
segmentfault
檔案,對應 2 個索引檔案。偏移量索引檔案(xx.index)用於建立訊息偏移量到實體地址之間的對映關係;時間戳索引檔案(xx.timeindex)根據指定的時間戳查詢對應的偏移量資訊。
.index、.timeindex
均保持嚴格單調遞增,在查詢時,都使用二分查詢法,如果查不到,均返回比查詢值要小的最大值。
日誌切分
當日志分段檔案滿足以下幾個條件任意之一,便會切分索引檔案
-
分段檔案大小超過
broker
log.segment.bytes
配置的值,預設為1073741824
,即1G
-
當前分段日誌中訊息的最大時間戳與當前系統的時間戳差值大於
log.roll.ms
或log.roll.hours
引數配置的值。其中前者優先順序大於後者,預設配置了log.roll.hours = 168
,即7
天 -
.index
或.timeindex
的大小達到broker
端引數log.index.size.max.bytes
配置的值,該值預設為10485760
即10MB -
追加的訊息的偏移量與當前日誌分段的偏移量之間差值大於
Integer.MAX_VALUE
偏移量索引(.index)
.index
每個索引項,佔 8
個位元組。結構如下圖所示:
-
relativeOffset:相對偏移量,表示訊息相對於
baseOffset
偏移量,佔用4
個位元組 -
position:實體地址,訊息在日誌分段檔案中對應的物理位置
訊息的偏移量(offset)佔用 8
個位元組,稱為絕對偏移量。為了節省空間, relativeoffset
採用 4
個位元組,relativeOffset = offset - baseOffset
。
因為 relativeOffset
是 4
個位元組,因此當 offset - baseOffset
值大於 Integer.MAX_VALUE
,則會導致無法繼續儲存在當前 .index 檔案
時間戳索引(.timeindex)
每個索引項佔用 12
個位元組,結構如下圖:
- timestamp:
當前日誌分段最大的時間戳。佔8
個位元組 - relativeOffset:
時間戳所對應的訊息的相對偏移量。佔4
個位元組
與 RocketMQ 異同
不同點
rocketMQ
的索引檔案,存放在index
目錄下。rocketMQ
index 檔案的儲存結構為index header
+500W個 hash槽
+2000W 個 index條目
。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-6LEBwAcp-1602337551933)(evernotecid://B58292A4-43F3-4C3E-ACA3-E9C7D829CC18/appyinxiangcom/15559189/ENResource/p3019)]rocketMQ
使用的是hash
進行查詢,使用的是連結串列法解決衝突hash
衝突。