来自 Emil Koutanov 的《Effective Kafka》:
删除策略以日志段为粒度进行操作。一个 在副本中运行的后台进程会查看每个inactive 记录段以确定某个段是否符合删除条件。
回想一下,活动状态上只允许生产者发起的写入 部分;所有其他操作——删除和压缩——可能只 发生在非活动段
但是如果我有
retention.ms
设置为 30 秒log.retention.check.interval.ms
为经纪商 1 秒然后产生 2-3 条消息并停止,30 秒后,段文件被删除并创建一个新的。
segment.ms
和大小是默认的,所以这不是滚动行为。
作者是否错误地理解了删除策略如何在活动段上实际发挥作用,或者我是否误解了活动的含义。
在 Kafka 中,每个分区都有一个活动段接受传入写入。一旦该段达到配置的限制(例如,
segment.ms
或segment.bytes
),Kafka就会滚动该段,创建一个新的活动段并将前一个段标记为不活动。
保留策略(
retention.ms
和retention.bytes
)默认仅适用于非活动段,因为这些段不再接收写入。因此,仅根据保留设置,活动分段通常可以免于删除。
不过
Kafka 还包含一种机制来处理活动段超过
retention.ms
限制的情况,即使它尚未达到 segment.ms
或 segment.bytes
阈值。发生这种情况时,Kafka 会强制滚动活动段,将其标记为非活动状态,并使其符合保留策略下的删除条件。这种方法可确保空闲段在超过 retention.ms
时不会无限期地保持打开状态,特别是在低容量或空闲主题中。
当 Kafka 强制滚动且活动段超出
retention.ms
阈值并保持空闲时,您应该看到如下日志:
[Log partition=<topic>-<partition>, dir=<log_dir>] Found deletable segments with base offsets [0] due to Retention time 604800ms breach
请参阅 UnifiedLog.scala 代码来实现此强制滚动逻辑。
以下是一些参考链接,可以帮助您了解更多: