18

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

4

2 回答 2

43

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

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

这就是为什么有一个索引文件。首先,索引文件中的消息结构只描述了 2 个字段,每个字段都是 32 位长:

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

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

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

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

于 2015-05-14T08:49:13.053 回答
-4

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

编辑:

从文档

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

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

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

例如,日志文件00000000005120942793.log是 Kafka 实际存储消息以及所有详细信息的位置,例如偏移量(一旦将消息推送到 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/如何-kafkas-storage-internals-work-3a29b02e026

于 2013-10-21T05:45:11.613 回答