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

时间:2013-10-16 03:21:38

标签: apache-kafka

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

2 个答案:

答案 0 :(得分:33)

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

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

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

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

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

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

答案 1 :(得分:-2)

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

修改

来自文档

  

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

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

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

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

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

资料来源:
http://kafka.apache.org/documentation.html#brokerconfigs http://supergsego.com/apache/kafka/0.8.2.0/scaladoc/kafka/log/OffsetIndex.html https://thehoard.blog/how-kafkas-storage-internals-work-3a29b02e026