Kafka 的存储结构围绕主题(Topic)、分区(Partition)、段文件(Segment File)、以及索引(Index)展开 ,以下是详细的结构说明:
Kafka 存储结构详解
1. 主题(Topic)
Kafka 的消息按 主题 分类,生产者向主题发送消息,消费者从主题读取。
一个主题会被划分为多个 分区(Partition),每个分区是一个 有序、不可变的消息序列。
2. 分区(Partition)
每个分区相当于一个 逻辑日志(log),底层对应服务器上的一个目录。
每个消息在分区中都有一个唯一的 偏移量(Offset),表示它在该分区中的位置。
3. 分区目录结构
例如,主题 test-topic 有 3 个分区,则可能会在磁盘目录 /kafka/logs/ 下看到:
/kafka/logs/
├── test-topic-0/
├── test-topic-1/
└── test-topic-2/
4. 段文件(Segment File)
每个分区下会按大小或时间切分成多个段文件(segment),例如:
test-topic-0/
├── 00000000000000000000.log
├── 00000000000000000000.index
├── 00000000000000000000.timeindex
├── 00000000000000001000.log
└── ...
文件类型 | 描述 |
---|---|
.log 文件 | 实际消息数据(key, value, timestamp) |
.index 文件 | 存储 offset 到 .log 中物理位置的映射 |
.timeindex 文件 | 存储时间戳到 offset 的映射,用于基于时间查询消息 |
5. 索引机制
Kafka 使用两个索引加速消息查找:
-
OffsetIndex:Offset ➝ 文件位置,用于根据 Offset 快速定位。
-
TimeIndex:时间戳 ➝ Offset,用于根据时间范围查找。
6. 日志清理(Log Cleanup)机制
Kafka 支持两种清理策略:
策略 | 描述 |
---|---|
delete | 默认策略,超过配置的保留时间/大小后删除旧段文件 |
compact | 保留每个 key 的最后一条记录,适合类似数据库的日志 |
7. Kafka 不修改日志
Kafka 所有日志都是 追加写入,不修改历史记录。这使得 Kafka 非常高效,并支持重复消费与故障恢复。
总结图示(结构图)
Topic
├── Partition 0
│ ├── Segment 1: 00000000000000000000.log
│ ├── Segment 2: 00000000000000001000.log
│ └── ...
└── Partition 1
├── Segment 1: 00000000000000000000.log
├── Segment 2: 00000000000000001000.log
└── ...
每个 Segment:
-
.log: 日志文件(消息)
-
.index: offset索引
-
.timeindex: 时间索引