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

use*_*721 16 apache-kafka

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

Mar*_*hli 36

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

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

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

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

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

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

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

  • 我注意到有一个带*.timeindex*前缀的文件.它是为了什么? (3认同)
  • timeindex提供了一种基于时间戳而不是偏移值快速访问任何消息的方法.您甚至可以使用offsetsForTimes()方法通过时间戳查找偏移量 (2认同)