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 会删除符合条件的非活动分片。
日志分片滚动与保留原理示意图
以下是日志分片滚动与保留原理的示意图:
日志配置限制
Segment配置限制
| 配置项 | 默认值 | 配置范围 | 实际含义 |
|---|---|---|---|
| segment.ms | 7 天 | 1 天~90 天 | 日志分片滚动的最短周期是1天。 |
| segment.bytes | 1GB | 固定1GB | 每个日志分片固定为1GB,无法更改。 |
说明:
- 由于 segment.ms 最短可设为1天,因此Kafka至少会每隔1天强制创建新分片,即使分片大小未达到 1GB。
- 每个日志分片文件最大容量为 1GB,到达该大小后会立即滚动生成新分片。
Retention 配置限制
| 配置项 | 默认值 | 配置范围 | 实际含义 |
|---|---|---|---|
| retention.ms | 3 天 | 1分钟~90天 | 日志的最短保留期可精细到1分钟。 |
| retention.bytes | 1GB | 1GB~1024GB | 日志保留最小容量为1GB(即至少保留1分片日志)。 |
说明:
Kafka 会基于时间或容量,满足任一条件即触发日志删除。
场景说明
场景一:期望保留日志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天日志。 |