Kafka的位移索引和时间戳索引(上)

简介: Kafka的位移索引和时间戳索引

在Kafka的数据路径下有很多.index.timeindex后缀文件:

  • .index文件,即Kafka中的位移索引文件
  • .timeindex文件,即时间戳索引文件。

1 OffsetIndex - 位移索引

1.1 定义

用于根据位移值快速查找消息所在文件位置。


每当Consumer需要从topic分区的某位置开始读消息时,Kafka就会用OffsetIndex直接定位物理文件位置,避免从头读取消息的I/O性能开销。


不同索引类型保存不同的 K.V 对。OffsetIndex的K即消息的相对位移,V即保存该消息的日志段文件中该消息第一个字节的物理文件位置。

相对位移

AbstractIndex类中的抽象方法entrySize定义了单个K.V对所用的字节数。

OffsetIndex的entrySize就是8,如OffsetIndex.scala中定义的那样:

image.png

相对位移是个Integer,4字节,物理文件位置也是一个Integer,4字节,因此共8字节。


Kafka的消息位移值是一个长整型(Long),应占8字节。在保存OffsetIndex的K.V对时,Kafka做了一些优化。每个OffsetIndex对象在创建时,都已保存了对应日志段对象的起始位移,因此,OffsetIndex无需保存完整8字节位移值。实际上,只需保存与起始位移的差值,该差值整型存储足矣。这种设计就让OffsetIndex每个索引项都节省4字节。


假设某一索引文件保存1000个索引项,使用相对位移值就能节省大约4M。

AbstractIndex定义了relativeOffset方法


将一个Long位移值转换成相对偏移

image.png

真正的转换

image.png

读取OffsetIndex时,还需将相对偏移值还原成之前的完整偏移。

  • parseEntry:构造OffsetPosition所需的Key和Value
  • image.png
  • 该方法返回OffsetPosition类型。因为该类的俩方法分别返回索引项的K、V。
  • image.png
  • physical
  • image.png

写索引项 - append

通过Long位移值和Integer物理文件位置参数,然后向mmap写入相对位移值、物理文件位置

image.png

Truncation 截断

将索引文件内容直接裁剪掉部分。比如,OffsetIndex索引文件中当前保存100个索引项,现在只想保留最开始40个索引项。

  • truncateToEntries
  • image.png
目录
相关文章
|
1月前
|
消息中间件 存储 分布式计算
大数据-61 Kafka 高级特性 消息消费02-主题与分区 自定义反序列化 拦截器 位移提交 位移管理 重平衡
大数据-61 Kafka 高级特性 消息消费02-主题与分区 自定义反序列化 拦截器 位移提交 位移管理 重平衡
23 1
|
6月前
|
消息中间件 Kafka 数据处理
了解Kafka位移自动提交的秘密:避免常见陷阱的方法
了解Kafka位移自动提交的秘密:避免常见陷阱的方法
366 1
|
6月前
|
消息中间件 存储 Kafka
【深入浅出 RocketMQ原理及实战】「底层源码挖掘系列」透彻剖析贯穿一下RocketMQ和Kafka索引设计原理和方案
【深入浅出 RocketMQ原理及实战】「底层源码挖掘系列」透彻剖析贯穿一下RocketMQ和Kafka索引设计原理和方案
125 1
|
6月前
|
存储 消息中间件 监控
探秘Kafka位移在消息旅程中的神奇
探秘Kafka位移在消息旅程中的神奇
58 0
|
6月前
|
消息中间件 存储 Kafka
Kafka - 3.x offset位移不完全指北
Kafka - 3.x offset位移不完全指北
130 0
|
消息中间件 分布式计算 Dubbo
【Kafka从入门到成神系列 七】Kafka 位移主题
【Kafka从入门到成神系列 七】Kafka 位移主题
【Kafka从入门到成神系列 七】Kafka 位移主题
|
消息中间件 Java Kafka
Elastic实战:logstash将kafka数据同步到es时,如何将字符串型时间字段转换为时间戳
今天群里有同学问如何将字符串型的时间字段转换为long类型的时间戳。特记录下供后续参考。 原问题: > 我接收数据方传过来的数据,其中有个时间类型是字符串类型,格式为:yyyy-MM-dd hh:mm:ss,我需要转成时间戳保存,我按照网上的方法试了好多种都无法成功转换。 > 数据方把数据发到kafka,我用logstash读kafka,经过处理存到es
346 0
Elastic实战:logstash将kafka数据同步到es时,如何将字符串型时间字段转换为时间戳
|
消息中间件 存储 运维
【kafka原理】kafka Log存储解析以及索引机制
我们在kafka的log文件中发现了还有很多以 __consumer_offsets_的文件夹;总共50个; 由于Zookeeper并不适合大批量的频繁写入操作,新版Kafka已推荐将consumer的位移信息保存在Kafka内部的topic中,即__consumer_offsets topic,并且默认提供了kafka_consumer_groups.sh脚本供用户查看consumer信息。
【kafka原理】kafka Log存储解析以及索引机制
|
消息中间件 存储 算法
Kafka 消息存储与索引设计
消息中间件的性能好坏,它的消息存储的机制是衡量该性能的最重要指标之一,而 Kafka 具有高性能、高吞吐、低延时的特点,动不动可以上到几十上百万 TPS,离不开它优秀的消息存储设计。下面我按照自己的理解为大家讲解 Kafka 消息存储设计的那些事。
176 0
Kafka 消息存储与索引设计
|
消息中间件 存储 缓存
面试官:Kafka索引设计有什么亮点?
面试官:Kafka索引设计有什么亮点?
面试官:Kafka索引设计有什么亮点?
下一篇
无影云桌面