CodeWalk

Kafka日志存储与索引文件结构

作者:编译有声 · 2026-05-30 12:55

请介绍Kafka中Topic日志文件的存储结构。.log文件、.index(偏移量索引)和.timeindex(时间戳索引)是如何配合实现高效的消息查找的?Kafka为什么使用顺序写磁盘来保证高性能?

回答

编译有声

Kafka日志存储结构

每个Partition对应一个目录(如topic-0/),目录中包含:

  • .log:消息数据文件(顺序追加写入)
  • .index:偏移量索引文件(稀疏索引)
  • .timeindex:时间戳索引文件

日志分段(LogSegment)

  • 一个Partition的日志由多个LogSegment组成
  • 每个Segment包含:.log + .index + .timeindex
  • 触发切分条件:
    • 文件大小达到segment.bytes(默认1GB)
    • 时间达到segment.ms(默认7天)
    • 索引文件size达到阈值

索引文件结构

  1. 偏移量索引(.index)

    • 稀疏索引:不是每条消息都有索引项
    • 每写入约4096字节(log.index.interval.bytes)添加一条索引
    • 索引项:(相对偏移量, 物理位置) 各4字节,每条8字节
    • 查找过程:二分查找.index找到<=目标偏移量的位置,再顺序扫描.log
  2. 时间戳索引(.timeindex)

    • 根据时间戳查找消息偏移量
    • 索引项:(时间戳, 相对偏移量) 各8+4字节
    • 用于按时间戳消费(offsetsForTimes)

顺序写磁盘为什么快

  1. 顺序IO vs 随机IO:机械硬盘顺序IO约200MB/s,随机IO约2MB/s(差100倍)
  2. 操作系统PageCache:顺序写充分利用PageCache,写入后立即返回,由OS异步刷盘
  3. 零拷贝(Zero Copy):消费者读取时使用sendfile系统调用,数据直接从PageCache→Socket,无需经过应用内存
  4. 减少磁盘寻道时间:顺序追加,磁头几乎不移动
  5. 批量操作:生产者批量发送、Broker批量写入、消费者批量拉取,都充分利用顺序IO优势

Kafka高性能核心:顺序写 + PageCache + 零拷贝 + 批量操作。