Kafka日志清理策略与数据保留
请介绍Kafka的日志清理策略(Log Cleanup Policy),包括delete和compact两种模式的工作原理和配置方式。
回答
编译有声
Kafka的日志清理由Log Cleaner线程管理。
一、Delete策略(cleanup.policy=delete,默认):
原理: 根据保留时间或文件大小删除旧数据
配置:
# 基于时间(默认7天)
log.retention.hours=168
# 或 log.retention.ms/minutes
# 基于大小
log.retention.bytes=-1 # 不限大小
# 检查频率
log.retention.check.interval.ms=300000 # 5分钟
触发删除:
- 分段文件(Segment)达到一定大小(
log.segment.bytes=1GB)或时间(log.roll.hours=168)关闭 - Cleaner线程检查关闭的Segment是否超过保留时间/大小
- 超过则删除整个Segment文件
二、Compact策略(cleanup.policy=compact):
原理: 对相同Key只保留最新的一条记录(压缩),适用于变更日志场景
工作流程:
- Log Cleaner线程扫描Segment
- 构建Offset Map(Key→最新Offset映射)
- 删除含有过期Key的记录
- 追加到新的压缩后的Segment
关键概念:
- Head:未压缩的部分(最新写入)
- Tail:已压缩的部分(每个Key保留最新值)
- Delete Tombstone:写入Key的null值,表示该Key被删除
配置:
cleanup.policy=compact
min.cleanable.dirty.ratio=0.5 # 脏数据比例≥50%时触发压缩
min.compaction.lag.ms=0 # 消息写入后至少多久才能被压缩
# 也支持组合策略
cleanup.policy=delete,compact # 先压缩再删除
三、场景选择:
| 策略 | 场景 | 示例 |
|---|---|---|
| delete | 日志/事件流(不需要保留旧值) | 点击流/埋点日志 |
| compact | 变更数据捕获/维表 | MySQL Binlog同步 |
| delete+compact | 即保留时间又去重 | 数据湖增量 |
四、注意:
- Compact不能保证压缩完成的时间(依赖脏数据比例)
- 频繁Compact影响性能
- 建议对Compact Topic设置较小的Segment大小(如256MB)