kafka 系列 -- 7.2、日志索引

本文详细介绍了Kafka的日志切分、偏移量索引和时间戳索引的原理,强调了在查找过程中使用二分查找法,并对比了与RocketMQ的不同,特别是索引文件的存储结构和查找策略。
摘要由CSDN通过智能技术生成


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 个字节
  2. relativeOffset:
    时间戳所对应的消息的相对偏移量。占 4 个字节

与 RocketMQ 异同

不同点
  1. rocketMQ 的索引文件,存放在 index 目录下。
  2. rocketMQ index 文件的存储结构为 index header + 500W个 hash槽 + 2000W 个 index条目
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6LEBwAcp-1602337551933)(evernotecid://B58292A4-43F3-4C3E-ACA3-E9C7D829CC18/appyinxiangcom/15559189/ENResource/p3019)]
  3. rocketMQ 使用的是 hash 进行查找,使用的是链表法解决冲突hash 冲突。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值