Kafka通过日志分片滚动与日志保留优化存储管理,用户可通过配置相关参数实现消息保留机制。以下将介绍消息保留机制配置方法、工作原理,帮助您高效管理存储资源并平衡数据可用性。
消息保留机制概述
Kafka 通过日志分片滚动和日志保留策略协同管理消息生命周期。
日志分片滚动
在 Kafka 中,每个主题(topic)被划分为多个分区(partition),每个分区的日志被进一步划分为多个分片(segment)。Kafka 通过以下两种方式控制日志分片的滚动:
基于时间的滚动(segment.ms):当当前活动分片的存在时间超过配置的 segment.ms 时,Kafka 会关闭当前分片并创建一个新的分片。
基于大小的滚动(segment.bytes):当当前活动分片的大小达到配置的 segment.bytes 时,Kafka 会关闭当前分片并创建一个新的分片。
一旦日志分片被关闭,它就变为非活动状态,成为日志保留策略的管理对象。
日志保留原理
Kafka 的日志保留策略决定了消息在被删除之前可以保留多长时间或占用多大空间。Kafka 提供以下两种保留策略:
基于时间的保留(retention.ms):配置 retention.ms 来指定消息的保留时间。超过该时间的非活动分片将被删除。
基于大小的保留(retention.bytes):配置 retention.bytes 来指定每个分区的最大日志大小。超过该大小的旧分片将被删除。
当上述任一条件满足时,Kafka 会删除符合条件的非活动分片。
说明:
消息生命周期不直接受控,而是由其所在分片的删除时间决定:若分片因滚动延迟未关闭,则即使消息超时仍保留。
消息保留机制示意图

注意:
Kafka 以分片为单位删除文件,而非逐条删除消息。若某消息在活跃分片内,即使超时也不会被删除。
消息保留机制的配置
日志分片滚动配置
配置项 | 参数中文名称 | 默认值 | 配置范围 | 实际含义 |
segment.ms | 分片滚动周期 | 7 天 | 1 天~90 天 | 日志分片滚动的最短周期是1天。 |
segment.bytes | 分片大小上限 | 1GB | 固定1GB | 每个日志分片固定为1GB,无法更改。 |
说明:
由于 segment.ms 最短可设为1天,因此Kafka至少会每隔1天强制创建新分片,即使分片大小未达到 1GB。
每个日志分片文件最大容量为 1GB,到达该大小后会立即滚动生成新分片。
日志保留配置
配置项 | 参数中文名称 | 默认值 | 配置范围 | 实际含义 |
retention.ms | 消息保留时间 | 3 天 | 1分钟~90天 | 日志的最短保留期可精细到1分钟。 |
retention.bytes | 消息保留大小 | 1GB | 1GB~1024GB | 日志保留最小容量为1GB(即至少保留1分片日志)。 |
场景示例
场景一:期望消息保留1天
客户配置:
retention.ms 设置为1天。
segment.ms 设置为1天。
极端情况(日志产生量较低)分析:
Kafka 的 segment.ms 最小只能为1天,当日志量特别少的时候,日志每天滚动一次,生成一个新的 segment 。
因此,最多会有2个 segment 同时存在:
第1天产生的 segment(已经滚动到非活动)。
第2天当前活动的 segment 。
非活动 segment 在满足保留条件时才会删除:
客户希望保留期1天后第1个 segment 可删除。
但当前活动 segment 至少要达到1天才能被关闭并标记为非活动。
因此,实际消息可能最大保留2天(1个活动+1个非活动分片)。
结论:
日志量少的时候,极端情况下,实际消息最大保留时间可能达到:2天。
日志量正常的时候,实际消息最大保留时间约是1天。
场景二:期望保留日志1小时
客户配置:
retention.ms 设置为1小时。
segment.ms 设置为1天。
极端情况(日志产生量较低)分析:
假设日志量极少,未达到1GB,始终无法触发基于 segment.bytes (1GB) 的滚动,Kafka 只能在1天后强制滚动一次。
同时活动 segment 始终有1小时内的日志,只能达到至少1天才滚动。
这种情况下,消息实际上可能被保留:1天(非活动分片)+1小时(日志过期时间),最长可达到25小时。
结论:
日志量少的时候,极端情况下,实际消息最大保留时长可能达到:1天 + 1小时(即25小时)。
配置建议表
客户期望实际 消息保留时长 | retention.ms 配置建议 | segment.ms 配置建议 | 实际消息 最大保留时长 | 备注 |
1小时 | 1天 | 1天 | 25小时(1天 + 1小时) | 因 segment.ms 最小为1天限制。 |
12小时 | 12小时 | 1天 | 1.5天(1天 + 12小时) | 因 segment.ms 最小为1天限制。 |
1天 | 1天 | 1天 | 2天 | 1个活动分片(最大1天)+ 1个非活动分片(1天内删除) |
N天 | N * 86400000 | 1天 | (N+1)天 | segment.ms 每天滚动,最多保留N + 1天日志。 |