乐趣区

关于kafka:kafka-系列-72日志索引

kafka 的索引文件以稠密索引的形式结构音讯的索引,每个 segmentfault 文件,对应 2 个索引文件。偏移量索引文件 (xx.index) 用于建设音讯偏移量到物理地址之间的映射关系;工夫戳索引文件 (xx.timeindex) 依据指定的工夫戳查找对应的偏移量信息。

.index、.timeindex 均放弃严格枯燥递增,在查找时,都应用二分查找法,如果查不到,均返回比查找值要小的最大值。

日志切分

当日志分段文件满足以下几个条件任意之一,便会切分索引文件

  1. 分段文件大小超过 broker 参数 log.segment.bytes 配置的值,默认为 1073741824,即 1G
  2. 以后分段日志中音讯的最大工夫戳与以后零碎的工夫戳差值大于 log.roll.mslog.roll.hours 参数配置的值。其中前者优先级大于后者,默认配置了 log.roll.hours = 168,即 7
  3. .index.timeindex 的大小达到 broker 端参数 log.index.size.max.bytes 配置的值,该值默认为 10485760 即 10MB
  4. 追加的音讯的偏移量与以后日志分段的偏移量之间差值大于 Integer.MAX_VALUE

偏移量索引(.index)

.index 每个索引项,占 8 个字节。构造如下图所示:

  1. relativeOffset:绝对偏移量,示意音讯绝对于 baseOffset 偏移量,占用 4 个字节
  2. position:物理地址,音讯在日志分段文件中对应的物理地位

音讯的偏移量 (offset) 占用 8 个字节,称为相对偏移量。为了节俭空间, relativeoffset 采纳 4 个字节,relativeOffset = offset - baseOffset
因为 relativeOffset4 个字节,因而当 offset - baseOffset 值大于 Integer.MAX_VALUE,则会导致无奈持续存储在以后 .index 文件

工夫戳索引(.timeindex)

每个索引项占用 12 个字节,构造如下图:

  1. timestamp:

以后日志分段最大的工夫戳。占 8 个字节

  1. relativeOffset:

工夫戳所对应的音讯的绝对偏移量。占 4 个字节

与 RocketMQ 异同

不同点

  1. rocketMQ 的索引文件,寄存在 index 目录下。
  2. rocketMQ index 文件的存储构造为 index header + 500W 个 hash 槽 + 2000W 个 index 条目

  1. rocketMQ 应用的是 hash 进行查找,应用的是链表法解决抵触hash 抵触。
退出移动版