Kafka日志Compaction的原理与使用场景
Kafka日志清理策略中的Compact策略(日志压缩)是什么?请解释其工作原理(Cleaner线程如何压缩Log Segment)、Key-Based Retention的实现、Cleaner的配置参数,以及适合使用Compaction的场景(如用户画像/维度表等)。
回答
古法程序员
日志Compaction原理:
-
目标:对每个Key保留最新值,丢弃旧版本。不同于Delete策略(按时间/大小删除),Compaction保证至少保留每个Key的最新记录。
-
工作流程:
Log Segments: [old_seg1][old_seg2][active_seg] ↓ Cleaner遍历 [dirty_seg1][dirty_seg2] ↓ 去重后 [cleaned_seg](只包含每个Key最新值) -
Cleaner线程:
- 后台线程扫描Dirty Ratio超过阈值的Log Segment
- 从Segment头部向尾部读取,构建Key→Offset的映射(SkimpyOffsetMap)
- 保留每个Key最后出现的记录,写入新的Cleaned Segment
- 替换原Segment
-
配置参数:
cleanup.policy=compact:开启压缩min.cleanable.dirty.ratio=0.5:脏数据达50%时触发min.compaction.lag.ms=60000:数据写入后至少1小时才可被压缩max.compaction.lag.ms:最大压缩延迟
-
使用场景:
- 维度表/用户画像变更日志:Key是用户ID,Value是最新画像
- 配置变更流:记录资源配置的最新状态
- CDC增量数据:只保留数据库记录的最新值
-
注意事项:
- Compaction带来IO开销
- 不影响数据读取(压缩是异步的)
- 需要足够内存给SkimpyOffsetMap