Kafka是大型架构的必备技能,下面我重点详解Kafka消息存储原理@mikechen
Kafka消息存储
消息队列 Kafka 最初由 LinkedIn 开发,后成为 Apache 顶级项目,定位为一个分布式流处理平台。
Kafka作为一个高吞吐、低延迟的分布式消息队列,其核心设计之一就是消息存储机制。
Kafka 不像传统消息队列一样消息“消费即删除”,而是将消息以日志文件的形式持久化在磁盘中。
Kafka 需要保证消息的持久性、和可靠性,这意味着一旦消息被成功写入 Kafka,即使 Broker 发生故障,消息也不会丢失。
并且在 Consumer 消费之前一直可用,这对于构建可靠的分布式系统至关重要。
Kafka消息存储原理
Kafka 的消息存储基于日志分段机制(Segmented Log),每个 Topic 被分成多个 Partition,每个 Partition 被物理映射成一组按顺序写入的 Segment 文件。
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 采用顺序追加写,避免磁盘寻址开销。
每个 Segment 其实是一组三个文件,按相同前缀命名(即起始 Offset):
/kafka-logs/my-topic-0/ ├── 00000000000000000000.log ├── 00000000000000000000.index ├── 00000000000000000000.timeindex ├── 00000000000000010000.log ├── ...
-
.log
:消息日志文件,记录真实消息内容; -
.index
:Offset 到物理地址的稀疏索引; -
.timeindex
:消息时间戳到 Offset 的映射。
Kafka 会将新消息持续追加到当前活跃 Segment 的 .log
文件中,当满足以下任一条件时,Kafka 会“滚动”创建新 Segment:
-
当前 Segment 达到最大字节数(如 1GB);
-
达到时间上限(如 1 小时);
-
Broker 重启或强制触发滚动;
总之:Kafka 并非简单写文件,而是通过Segmented Log机制,将每个 Partition 管理为一组分段日志,使消息存储具备高性能。