首页/数据/数据工程与 ETL 速查/消息保留策略与日志清理
Kafka64 条

消息保留策略与日志清理

Kafka 按时间或大小保留消息,过期以日志段(segment)为单位删除:retention.ms 控制时间、retention.bytes 控制容量,检查周期决定删除的及时性。

保留策略是什么

Kafka 不因消息被消费而删除数据,删除只由保留策略触发:按时间(超过保留时长的日志段)或按容量(分区总大小超过上限)清理。清理以日志段为最小单位,而不是逐条删除,所以「过期」并不等于「立刻释放磁盘」。

为什么改了保留期磁盘没变

原因通常有三个:当前正在写入的活动段永远不会被删除,即使它已超过保留时间;段只有滚动出新段之后才能按旧段清理;清理动作本身按固定间隔执行。因此缩短保留期后,需要等段滚动并经过一次清理周期,空间才会释放。

基本信息

默认保留log.retention.hours=168,即 7 天
容量上限log.retention.bytes 控制单分区容量,默认不限
最小清理单位日志段(segment),先滚动再删除
段大小log.segment.bytes 默认约 1GB
检查周期log.retention.check.interval.ms 默认 5 分钟
清理策略cleanup.policy=delete 或 compact

相关配置读法

配置作用于影响
retention.ms主题或集群消息可回溯窗口,也是下游补数的上限
retention.bytes主题或集群单分区磁盘占用上限,超出即删旧段
log.segment.bytes集群段越大,过期数据释放越滞后
log.retention.check.interval.ms集群清理动作的执行频率
cleanup.policy主题delete 删除旧数据,compact 按键保留最新值

典型使用场景

  • 控制磁盘成本:按下游重放需求设定保留天数,而不是无脑延长
  • 补数窗口评估:保留时长决定下游最多能回溯多久的历史
  • 状态类主题:用 compact 策略保留每个键的最新值,用于维表或配置同步
  • 磁盘告急应急:临时缩短保留并加快清理节奏,快速回收空间
  • 排查现场保护:先临时延长保留,避免证据数据被自动清理掉

调整主题保留

调整主题保留
# 同时按时间与容量限制保留(先到期者生效)
kafka-configs.sh --bootstrap-server localhost:9092 \
  --entity-type topics --entity-name orders \
  --alter --add-config 'retention.ms=259200000,retention.bytes=10737418240'

# 查看当前生效的保留配置
kafka-configs.sh --bootstrap-server localhost:9092 \
  --entity-type topics --entity-name orders --describe

# 集群默认值(未单独配置的主题取这里)
kafka-configs.sh --bootstrap-server localhost:9092 \
  --entity-type brokers --entity-default --describe
把保留时长当作数据契约的一部分:下游依赖「Kafka 里还有几天数据」做补数方案时,缩短保留期等于同时缩短了补数的可行范围,变更前需要通知下游。
磁盘告急时只改 retention 见效很慢:活动段不会被删除,且要等段滚动与清理周期。紧急场景需要同时评估段大小、清理间隔,或直接把新数据分流到其他集群。

易错点

  • 活动段(当前正在写入的段)不会被删除,即使已超过保留时间,期望立刻释放空间会落空
  • 缩短保留期后误以为磁盘会马上回落,实际要等段滚动并经过清理周期
  • 对事件流主题误用 compact 清理策略,旧记录被合并压缩,按位点重放时数据不完整
  • 不评估下游补数需求就缩短保留,出现问题时已无历史消息可重放

数据来源与参考

  • Apache Kafka 官方文档:Log Retention 与 Topic Configs
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌