在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中定义的那样:
相对位移是个Integer,4字节,物理文件位置也是一个Integer,4字节,因此共8字节。
Kafka的消息位移值是一个长整型(Long),应占8字节。在保存OffsetIndex的K.V对时,Kafka做了一些优化。每个OffsetIndex对象在创建时,都已保存了对应日志段对象的起始位移,因此,OffsetIndex无需保存完整8字节位移值。实际上,只需保存与起始位移的差值,该差值整型存储足矣。这种设计就让OffsetIndex每个索引项都节省4字节。
假设某一索引文件保存1000个索引项,使用相对位移值就能节省大约4M。
AbstractIndex定义了relativeOffset方法
将一个Long位移值转换成相对偏移
真正的转换
读取OffsetIndex时,还需将相对偏移值还原成之前的完整偏移。
- parseEntry:构造OffsetPosition所需的Key和Value
- 该方法返回
OffsetPosition
类型。因为该类的俩方法分别返回索引项的K、V。 - physical
写索引项 - append
通过Long位移值和Integer物理文件位置参数,然后向mmap写入相对位移值、物理文件位置
Truncation 截断
将索引文件内容直接裁剪掉部分。比如,OffsetIndex索引文件中当前保存100个索引项,现在只想保留最开始40个索引项。
- truncateToEntries