kafka
的索引文件以稀疏索引的方式構造消息的索引,每一個 segmentfault
文件,對應 2 個索引文件。偏移量索引文件(xx.index)用於創建消息偏移量到物理地址之間的映射關係;時間戳索引文件(xx.timeindex)根據指定的時間戳查找對應的偏移量信息。segmentfault
.index、.timeindex
均保持嚴格單調遞增,在查找時,都使用二分查找法,若是查不到,均返回比查找值要小的最大值。spa
當日志分段文件知足如下幾個條件任意之一,便會切分索引文件日誌
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
即10MBInteger.MAX_VALUE
.index
每一個索引項,佔 8
個字節。結構以下圖所示:
code
baseOffset
偏移量,佔用 4
個字節消息的偏移量(offset)佔用 8
個字節,稱爲絕對偏移量。爲了節省空間, relativeoffset
採用 4
個字節,relativeOffset = offset - baseOffset
。
由於 relativeOffset
是 4
個字節,所以當 offset - baseOffset
值大於 Integer.MAX_VALUE
,則會致使沒法繼續存儲在當前 .index 文件blog
每一個索引項佔用 12
個字節,結構以下圖:
索引
當前日誌分段最大的時間戳。佔 8
個字節kafka
時間戳所對應的消息的相對偏移量。佔 4
個字節hash
rocketMQ
的索引文件,存放在 index
目錄下。rocketMQ
index 文件的存儲結構爲 index header
+ 500W個 hash槽
+ 2000W 個 index條目
。
rocketMQ
使用的是 hash
進行查找,使用的是鏈表法解決衝突hash
衝突。