删除策略适用于活动段还是仅适用于非活动段?

问题描述 投票:0回答:1

来自 Emil Koutanov 的《Effective Kafka》:

删除策略以日志段为粒度进行操作。一个 在副本中运行的后台进程会查看每个inactive 记录段以确定某个段是否符合删除条件。

回想一下,活动状态上只允许生产者发起的写入 部分;所有其他操作——删除和压缩——可能只 发生在非活动段

但是如果我有

  • 一个测试主题(运行 Kafka 2.4),
  • retention.ms
    设置为 30 秒
  • log.retention.check.interval.ms
    为经纪商 1 秒
  • 我只有一个片段(.log 文件)- 大概是活动的

然后产生 2-3 条消息并停止,30 秒后,段文件被删除并创建一个新的。

segment.ms
和大小是默认的,所以这不是滚动行为。

作者是否错误地理解了删除策略如何在活动段上实际发挥作用,或者我是否误解了活动的含义。

apache-kafka
1个回答
0
投票

在 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 代码来实现此强制滚动逻辑。


以下是一些参考链接,可以帮助您了解更多:

  1. 卡夫卡-475
  2. KAFKA-4336
  3. Kafka 活动段删除:何时以及如何发生
© www.soinside.com 2019 - 2024. All rights reserved.