kafka logs storage

Kafka 会将日志文件按段(Segment)存储。

Segment是Kafka的最小存储单元,它是一个可追加的文件,用于存储Kafka分区中的一部分消息。

在文件系统中,Partition 是目录名,而Segment 是文件名。

Segment可以通过下面的配置来控制滚动和清理。

bash 复制代码
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 复制代码
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 条消息切换)

text 复制代码
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

相关推荐
宸津-代码粉碎机2 小时前
OpenAI 连夜迎战 Grok Bot 和 Muse:AI 智能体从 “会聊天” 到 “能办事”,现在入场还来得及吗
java·大数据·人工智能·分布式·python
程序猿乐锅4 小时前
【黑马点评 | 第八篇】Redisson分布式锁
java·数据库·spring boot·redis·分布式·spring·缓存
灯澜忆梦5 小时前
【RabbitMQ #7】 | 消息转换器
分布式·rabbitmq·ruby
需要8265 小时前
分布式事务:Seata AT/TCC/SAGA 的取舍与踩坑
java·spring boot·分布式·spring·spring cloud
CS创新实验室8 小时前
为什么三台机器就能选出一个“带头大哥“?——Raft 一致性算法,一次讲透
分布式·操作系统
本人手速666+10 小时前
企微开发API如何设计客户冻结状态?WeComApi 在删除、投诉和异常客户场景中的自动化边界
运维·分布式·自动化·企业微信·企微外部群开发·wecomapi·企业微信二次开发
灯澜忆梦11 小时前
【RabbitMQ #4】 | Work 任务模型
分布式·rabbitmq
程序猿乐锅11 小时前
【黑马点评 | 第七篇】Redis 分布式锁的两种实现
java·数据库·redis·分布式·spring·缓存
千里码aicood13 小时前
基于Hadoop的机票价格波动分析系统的设计与实现
大数据·hadoop·分布式
今年下半年18 小时前
记录一次IBMS物联网项目的架构设计及技术栈应用
物联网·websocket·网络协议·tcp/ip·微服务·udp·kafka