日志压实是什么
压实是 Kafka 的一种日志清理策略:主题设置 cleanup.policy=compact 后,后台会按键归并,同一 key 只保留最后一条 value,更早的记录最终被清除。它解决的是「这个主题表达的是状态而不是事件流」的场景——变更日志、配置下发、按主键的最新值快照。删除一条记录不是真的删行,而是写入一条 value 为 null 的消息(称为 tombstone),让压实过程把该 key 一并清掉。
基本信息
| 语义 | 同一 key 只保留最后一个 value(更早的最终被清理) |
|---|---|
| 典型场景 | KTable changelog、配置变更流、CDC 明细表 |
| 相关参数 | min.cleanable.dirty.ratio、delete.retention.ms、segment.ms |
| 混合策略 | cleanup.policy=compact,delete 可同时按时间清理 |
| 删除方式 | 写入 key 相同、value 为 null 的消息 |
| 偏移特性 | 压实后偏移不连续,出现空洞 |
创建压实主题
创建压实主题
kafka-topics.sh --bootstrap-server localhost:9092 \
--create --topic user-profile-compact \
--partitions 3 --replication-factor 3 \
--config cleanup.policy=compact \
--config min.cleanable.dirty.ratio=0.3
# 把已有主题改成压实策略
kafka-configs.sh --bootstrap-server localhost:9092 --alter \
--entity-type topics --entity-name user-profile --add-config cleanup.policy=compact
# 查看生效配置
kafka-configs.sh --bootstrap-server localhost:9092 --describe \
--entity-type topics --entity-name user-profile典型使用场景
- 状态快照:下游重启后重放主题即可恢复每个 key 的最新状态
- 配置下发:同一配置项只关心最终值,中间版本不需要长期保留
- CDC 明细同步:按主键保留最新一行,降低下游存储与读取压力
- 缓存预热:消费端重建本地缓存时不必重放全部历史变更
- 存储控制:相比 delete 策略,compact 能在保留语义的同时显著减小体积
关键参数读法
| 参数 | 含义 | 注意 |
|---|---|---|
| cleanup.policy | 清理策略 | compact、delete 或两者并用 |
| min.cleanable.dirty.ratio | 触发压实的脏数据比例阈值 | 越小越频繁,写放大越高 |
| delete.retention.ms | tombstone 保留时长 | 重放窗口要覆盖该保留期 |
| segment.ms | 日志段滚动时间 | 段过大压实粒度变粗 |
| max.compaction.lag.ms | 压实最大延迟 | 用于限制 key 长时间不被清理 |
压实只保证最终收敛:key 的旧值在被清理前仍然可以被读到,重放时要按 key 去重取最新。
压实不会在消息写入后立即发生,触发条件与段的脏数据比例有关;对时效敏感的场景不能依赖压实作为「删除」的手段,删除本身要发 tombstone。