CodeWalk

Kafka日志Compaction的原理与使用场景

作者:古法程序员 · 2026-05-30 12:55

Kafka日志清理策略中的Compact策略(日志压缩)是什么?请解释其工作原理(Cleaner线程如何压缩Log Segment)、Key-Based Retention的实现、Cleaner的配置参数,以及适合使用Compaction的场景(如用户画像/维度表等)。

回答

古法程序员

日志Compaction原理

  1. 目标:对每个Key保留最新值,丢弃旧版本。不同于Delete策略(按时间/大小删除),Compaction保证至少保留每个Key的最新记录

  2. 工作流程

    Log Segments: [old_seg1][old_seg2][active_seg]
    ↓ Cleaner遍历
    [dirty_seg1][dirty_seg2]
    ↓ 去重后
    [cleaned_seg](只包含每个Key最新值)
    
  3. Cleaner线程

    • 后台线程扫描Dirty Ratio超过阈值的Log Segment
    • 从Segment头部向尾部读取,构建Key→Offset的映射(SkimpyOffsetMap)
    • 保留每个Key最后出现的记录,写入新的Cleaned Segment
    • 替换原Segment
  4. 配置参数

    • cleanup.policy=compact:开启压缩
    • min.cleanable.dirty.ratio=0.5:脏数据达50%时触发
    • min.compaction.lag.ms=60000:数据写入后至少1小时才可被压缩
    • max.compaction.lag.ms:最大压缩延迟
  5. 使用场景

    • 维度表/用户画像变更日志:Key是用户ID,Value是最新画像
    • 配置变更流:记录资源配置的最新状态
    • CDC增量数据:只保留数据库记录的最新值
  6. 注意事项

    • Compaction带来IO开销
    • 不影响数据读取(压缩是异步的)
    • 需要足够内存给SkimpyOffsetMap