Kafka 中的 Topic 由一个或多个分区(Partition)组成,每个分区是一个有序的、不可变的消息队列。分区的数据在磁盘上的存储是通过以下方式实现的:

  1. 分区以文件夹形式保存
    • 每个 Kafka 主题的分区在磁盘上都有一个独立的目录,目录的命名通常是 <topic_name>-<partition_number> 的形式。例如,orders-0 表示 orders 主题的第 0 个分区。
    • 这些目录通常位于 Kafka 日志目录中,该目录由 Kafka broker 的配置参数 log.dirs 指定。
  2. 日志段文件(Log Segment Files)
    • 每个分区的数据以一个或多个日志段文件的形式存储。这些日志段文件是顺序写入的,文件名通常包含开始偏移量,例如 00000000000000000000.log
    • 当一个日志段达到一定的大小限制(通常是通过配置参数  log.segment.bytes  控制)或者一定的时间间隔后(如  log.roll.hours  配置),Kafka 就会创建一个新的日志段,并将新的消息追加到新的日志段中。这种机制称为日志的分段和滚动,通过这种方式,Kafka 实现了日志的循环复用,避免了单个日志文件过大导致的性能问题。
  3. 索引文件
    • 每个日志段文件会有对应的索引文件,通常包括偏移量索引(.index)和时间戳索引(.timeindex),用于加速消息的查找。
    • 索引文件帮助 Kafka 实现快速定位特定消息的位置,从而提高查找效率。
    • *.timeindex 和 kafka 清理数据有着密切的关系,kafka 默认保留 7 天内的数据,对于超过 7 天的数据,会被清理掉,这里的清理逻辑主要根据 timeindex 时间索引文件里最大的时间来判断的,如果最大时间与当前时间差值超过 7 天,那么对应的数据段就会被清理掉。
  4. 数据文件格式
    • 每条消息在日志段文件中是以二进制格式存储,包括消息的元数据(如偏移量、时间戳)和消息体。
  5. 顺序写入
    • Kafka 采用顺序写入的方式将消息写入日志段文件,这种方式非常高效,充分利用磁盘的顺序写能力。
  6. 日志压缩和清理
    • Kafka 支持基于保留时间或保留大小的日志清理策略,可以删除或压缩不再需要的旧数据。
    • 使用日志清理(Log Compaction)可以让 Kafka 存储最新版本的记录,并删除旧版本,节约磁盘空间。