Kafka消息存储原理详解(图文全面总结)

Kafka是大型架构的必备技能,下面我重点详解Kafka消息存储原理@mikechen

Kafka消息存储

消息队列 Kafka 最初由 LinkedIn 开发,后成为 Apache 顶级项目,定位为一个分布式流处理平台。

Kafka消息存储原理详解(图文全面总结)-mikechen

Kafka作为一个高吞吐、低延迟的分布式消息队列,其核心设计之一就是消息存储机制。

Kafka 不像传统消息队列一样消息“消费即删除”,而是将消息以日志文件的形式持久化在磁盘中。

Kafka 需要保证消息的持久性、和可靠性,这意味着一旦消息被成功写入 Kafka,即使 Broker 发生故障,消息也不会丢失。

并且在 Consumer 消费之前一直可用,这对于构建可靠的分布式系统至关重要。

 

Kafka消息存储原理

Kafka 的消息存储基于日志分段机制(Segmented Log),每个 Topic 被分成多个 Partition,每个 Partition 被物理映射成一组按顺序写入的 Segment 文件。

Kafka消息存储原理详解(图文全面总结)-mikechen

Kafka 的消息存储基于分布式日志结构,每个 Topic 被划分成多个 Partition。

而每个 Partition 又被实现为一个有序追加写的日志文件序列,这套机制称为 Segmented Log(日志分段机制)。

Topic: user-events
├── Partition-0: Segment-0 → Segment-1 → Segment-2 ...
├── Partition-1: Segment-0 → Segment-1 → ...
├── Partition-2: ...

为了更有效地管理大量的消息数据,Kafka 将每个 Partition 的物理存储划分为多个大小相等的 Segment 文件。

默认单个 Segment 文件大小约为 1GB(log.segment.bytes 参数控制)。

每个 Segment 采用顺序追加写,避免磁盘寻址开销。

Kafka消息存储原理详解(图文全面总结)-mikechen

每个 Segment 其实是一组三个文件,按相同前缀命名(即起始 Offset):

/kafka-logs/my-topic-0/
├── 00000000000000000000.log
├── 00000000000000000000.index
├── 00000000000000000000.timeindex
├── 00000000000000010000.log
├── ...
  • .log:消息日志文件,记录真实消息内容;

  • .index:Offset 到物理地址的稀疏索引;

  • .timeindex:消息时间戳到 Offset 的映射。

Kafka消息存储原理详解(图文全面总结)-mikechen

Kafka 会将新消息持续追加到当前活跃 Segment 的 .log 文件中,当满足以下任一条件时,Kafka 会“滚动”创建新 Segment:

 

  • 当前 Segment 达到最大字节数(如 1GB);

  • 达到时间上限(如 1 小时);

  • Broker 重启或强制触发滚动;

总之:Kafka 并非简单写文件,而是通过Segmented Log机制,将每个 Partition 管理为一组分段日志,使消息存储具备高性能。

 

评论交流
    说说你的看法