为什么 .index 文件存在于 kafka-log 目录中



我刚刚做了一个新主题,还没有产生任何消息。在目录/tmp/kafka-logs-1/topicname-0/中创建了一个名为 00000000000000000000.index 的文件,该文件的大小非常大。我在vi中打开了那个二进制文件,内容只有"0000 0000 0000 0000..."这是什么意思?这个索引文件是关于什么的?

日志的每个段(文件 *.log)都有其对应的索引(文件 *.index),其名称与它们表示基本偏移量的名称相同。

为了便于理解,日志文件包含以消息格式构造的实际消息。对于此文件中的每条消息,前 64 位描述递增的偏移量。现在,查找此文件中具有特定偏移量的消息变得昂贵,因为日志文件可能会在千兆字节范围内增长。为了能够生成消息,代理实际上必须执行此类查找以确定最新的偏移量,并能够进一步正确增加传入消息。

这就是有一个索引文件的原因。首先,索引文件中的消息结构仅描述 2 个字段,每个字段的长度为 32 位:

  1. 4 字节:相对偏移
  2. 4 字节:物理位置

如前所述,文件名表示基本偏移量。与日志文件中每条消息的偏移量递增相反,索引文件中的消息包含与基本偏移量的相对偏移量。第二个字段表示相关日志消息的物理位置(基数偏移量 + 相对偏移量),因此可以查找 O(1)。

毕竟要提到的是,并非日志中的每条消息在索引中都有相应的消息。配置参数 index.interval.bytes 默认为 4096 字节,它设置了一个索引间隔,该间隔基本上描述了添加索引条目的频率(在多少字节之后)。

关于 .index 文件的大小问题,有以下几点要说:配置参数 segment.index.bytes(默认为 10MB)描述了此文件的大小。此空间将重新分配,并且仅在日志滚动后才会缩小。

每个日志文件都有一个对应的索引文件,索引文件的用途是将逻辑消息偏移量转换为数据文件中的物理位置。 如图所示。

编辑:

来自文档

每个分区都是一个有序的、不可变的记录序列,这些记录不断追加到结构化提交日志。

在 Kafka 中,主题分区不能跨多个代理拆分。现在,在 Kafka 需要在保留期结束后从分区中删除某些消息的情况下,它需要扫描分区文件。如果存在单个大分区文件,此操作将非常慢。 为了避免这种情况,Kafka 将分区分成多个段。

当当前段文件(称为活动段)达到其大小限制(由log.segment.bytes属性控制)时创建的新段文件。因此,对于每个段,都有一个log文件和一个index文件。现在,每个段都从其基本偏移量开始,该偏移量大于先前段中的偏移量。

日志文件,例如 00000000005120942793.log是Kafka实际存储消息以及所有细节的地方,例如偏移量(一旦消息被推送到Kafka中,它就会被赋予一个称为Offset的唯一序列号),时间戳,压缩,有效载荷等。

索引文件,例如 00000000005120942793.index映射日志中的实际消息位置。它通常由两部分组成,每部分有 4 个字节。第一部分存储消息偏移量(相对于其基本偏移量),后一部分存储消息的位置。索引文件是内存映射的,Kafka 使用二进制搜索来定位小于或等于目标偏移量的最近偏移量。

源:
http://kafka.apache.org/documentation.html#brokerconfigshttp://supergsego.com/apache/kafka/0.8.2.0/scaladoc/kafka/log/OffsetIndex.htmlhttps://thehoard.blog/how-kafkas-storage-internals-work-3a29b02e026

最新更新