保留策略是什么
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 见效很慢:活动段不会被删除,且要等段滚动与清理周期。紧急场景需要同时评估段大小、清理间隔,或直接把新数据分流到其他集群。