共计 1029 个字符,预计需要花费 3 分钟才能阅读完成。
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 条目
。
rocketMQ
应用的是hash
进行查找,应用的是链表法解决抵触hash
抵触。
正文完