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
冲突。