深入研究 Apache Kafka 存储内部机制:段、滚动和保留

主要观点:

  • Apache Kafka 处理存储记录时像提交日志,记录依次追加到每个日志末尾,日志还按段分割,段有助于删除旧记录等,Broker 配置可调整与日志相关参数。
  • 不同日志清理策略(deletecompact)对 Broker 行为影响不同,delete策略下要了解日志分段和记录保留对 Broker 性能的影响。
  • Kafka 主题分区在磁盘上按分区存储记录,每个分区进一步分割为段,段包含实际文件,如.log.index.timeindex.snapshot等,活动段用于读写,非活动段只读。
  • 分区内索引工作方式:.index文件将逻辑偏移映射到记录在.log文件中的字节偏移,log.index.interval.bytes参数决定索引添加频率,可影响记录搜索速度;.timeindex文件根据时间戳和偏移对记录进行索引。
  • 段会在达到最大段大小(log.segment.bytes)、经过生产者时间戳指定时间(log.roll.mslog.roll.hours)或索引(或时间索引)满时滚动,log.roll.jitter.ms可避免段同时滚动,索引和时间索引大小会影响段滚动。
  • 记录保留时间可通过log.retention.bytes(按字节)或log.retention.ms等参数配置,实际保留时间可能比预期长,因为段关闭才删除,且清理线程检查删除有延迟,这对消费者影响不大但会影响磁盘使用。

关键信息:

  • 各文件作用:.log存储记录,.index映射逻辑偏移到字节偏移,.timeindex按时间戳索引,.snapshot存储生产者状态。
  • 索引相关参数:log.index.interval.bytes默认 4096 字节,影响索引添加频率;.timeindex每个条目 12 字节,反映记录发送时间间隔。
  • 段滚动条件:最大段大小、生产者时间戳、索引(或时间索引)满,log.roll.jitter.ms避免同时滚动,索引和时间索引大小与段大小相关。
  • 记录保留:log.retention.bytes按字节,log.retention.ms等按时间,实际保留时间受段关闭和清理线程检查延迟影响。

重要细节:

  • Strimzi Canary 组件示例中各文件内容及分区结构。
  • 不同配置下段、索引、时间索引的大小及相关记录情况。
  • 记录保留时间计算示例及实际可能的保留时长。
阅读 16
0 条评论