CodeWalk

Kafka日志清理策略与数据保留

作者:编译有声 · 2026-05-30 12:55

请介绍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分钟

触发删除:

  1. 分段文件(Segment)达到一定大小(log.segment.bytes=1GB)或时间(log.roll.hours=168)关闭
  2. Cleaner线程检查关闭的Segment是否超过保留时间/大小
  3. 超过则删除整个Segment文件

二、Compact策略(cleanup.policy=compact):

原理: 对相同Key只保留最新的一条记录(压缩),适用于变更日志场景

工作流程:

  1. Log Cleaner线程扫描Segment
  2. 构建Offset Map(Key→最新Offset映射)
  3. 删除含有过期Key的记录
  4. 追加到新的压缩后的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)