kafka logs storage
Kafka 会将日志文件按段(Segment)存储。
Segment是Kafka的最小存储单元,它是一个可追加的文件,用于存储Kafka分区中的一部分消息。
在文件系统中,Partition 是目录名,而Segment 是文件名。
Segment可以通过下面的配置来控制滚动和清理。
log.segment.bytes=1073741824 # 每个 segment 最大 1GB
log.segment.ms=604800000 # 每 7 天切一个新 segment
log.retention.hours=168 # 168 小时后旧段可被删除
cleanup.policy=delete # 设置删除策略
📁 Segment 文件组成
Kafka 会为每个 segment 创建一组文件,位于某个partition的目录下,例如:
bash-4.4$ ls -lh /opt/kafka/data/logs/my-topic-0
total 216K
-rw-r--r-- 1 202390 10000 10M May 8 06:29 00000000000000000000.index
-rw-r--r-- 1 202390 10000 196K May 8 06:30 00000000000000000000.log
-rw-r--r-- 1 202390 10000 10M May 8 06:29 00000000000000000000.timeindex
-rw-r--r-- 1 202390 10000 8 May 8 02:54 leader-epoch-checkpoint
-rw-r--r-- 1 202390 10000 43 May 8 02:54 partition.metadata
文件类型 | 后缀 | 说明 |
---|---|---|
.log | 主数据文件,存储消息本体(key/value) | |
.index | 根据 offset 建立的稀疏索引,便于定位 | |
.timeindex | 根据时间戳的索引,用于基于时间的查找 | |
.snapshot | (事务日志)支持事务性读写 | |
leader-epoch-checkpoint | 用于记录 leader 任期信息(确保 ISR 一致性) |
这些文件中的 00000000000000000000
表示这个 segment 的起始 offset。
一个partition 可以有多组segments.
🧱 Kafka 中 segment 的作用
功能 | 说明 |
---|---|
分割日志文件 | 防止一个 partition 文件无限增长 |
支持时间/大小滚动 | 可配置最大时间或大小 |
清理目标单位 | Kafka 的数据清理(删除或压缩)以 segment 为单位 |
快速查找消息 | 每个 segment 有对应的 .index 和 .timeindex 文件 |
降低内存压力 | 分段可以控制内存索引的加载大小 |
🔧 Segment 的滚动(roll over)
Kafka 会根据如下条件创建新的 segment:
条件 | 对应配置项 |
---|---|
达到最大字节数 | segment.bytes (默认 1GB) |
达到最大时间 | segment.ms (默认 7 天) |
手动 flush/滚动 | API 控制或管理工具操作 |
一旦新 segment 被创建,旧的 segment 就变成“sealed”,不能再写入,只能读取、压缩或删除。
🗑️ Segment 与数据清理策略
Kafka 的两种主要数据清理策略都以 segment 为操作单位:
清理策略 | 说明 |
---|---|
delete | Kafka 会定期删除超过保留时间/大小的旧 segment。 |
compact | Kafka 会对旧 segment 进行压缩,保留每个 key 的最新 value。 |
⚠️ 当前写入的 segment(active segment)不会被清理或压缩,只有旧的 segment 会成为目标。
🧠 示例图解(假设 segment 每 100 条消息切换)
Partition: my-topic-0┌────────────┬────────────┬────────────┬────────────┐│ Segment A │ Segment B │ Segment C │ Active ││ (offset 0) │ (100) │ (200) │ (300~now) │└────────────┴────────────┴────────────┴────────────┘
Segment A/B/C
是 sealed,可被清理。- 最后一个 segment 是 active segment,不断追加写入,不会被清理。
✅ 总结:Segment 是 Kafka 存储的基本块
特性 | 说明 |
---|---|
顺序追加 | 高效写入磁盘 |
可被删除或压缩 | 支持灵活的数据生命周期管理 |
可快速索引查找 | 借助 .index 和 .timeindex 实现高效定位 |
有助于持久性和故障恢复 | 数据持久化到磁盘,可随时恢复 |
Reference
kafka 日志文件segment