Kafka - 保留期参数

Kar*_*raj 1 apache-kafka

试图了解 Apache Kafka 中保留期背后的逻辑。请帮助我了解以下场景的情况。

  1. 如果保留期设置为 0,会发生什么?会删除所有记录吗?
  2. 如果我们删除retention参数本身,会不会取默认值?

Bit*_*sky 5

  1. Kafka 不允许您将保留期设置为零,以小时为单位。它必须至少为 1。如果您将其设置为零,您将收到以下错误消息,并且代理将无法启动。

java.lang.IllegalArgumentException:要求失败:log.retention.ms 必须是无限制的 (-1) 或等于或大于 1

您仍然可以在使用参数时将其设置为零log.retention.minuteslog.retention.ms

  • 现在,让我们来到数据删除点。在这种情况下,即使在设置的保留时间(比如 1 小时或 1 分钟)到期后,旧数据也不太可能被删除,因为server.properties调用log.segment.bytes中的另一个变量在那里起着重要作用。的值log.segment.bytes默认设置为 1GB。Kafka 只对关闭的段执行删除操作。所以,一旦一个日志段达到 1GB,它就会被关闭,只有在此之后保留log.segment.bytes才会生效。您计划在短时间内保留的数据。例如,如果您的保留期为 10 分钟,并且您每分钟获得大约 1 MB 的数据,那么您可以设置log.segment.bytes=10485760哪个是1024 x 1024 x 10. 您可以在线程中找到有关保留如何依赖于数据摄取和时间的示例。

  • 为了测试这一点,我们可以尝试一个小实验。让我们启动 Zookeeper 和 Kafka,创建一个名为的主题test并将其保留期更改为零。

    1) nohup ./zookeeper-server-start.sh ../config/zookeeper.properties &
    2) nohup ./kafka-server-start.sh ../config/server.properties &
    3) ./kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
    4) ./kafka-configs.sh --zookeeper localhost:2181 --entity-type topics --entity-name test --alter --add-config log.retention.ms=0
    
    Run Code Online (Sandbox Code Playgroud)
  • 现在如果我们使用 Kafka-console-producer 插入足够多的记录,即使在 2-3 分钟后,我们也会看到记录没有被删除。但是现在,让我们将 更改log.segment.bytes为 100 字节。

    5) ./kafka-configs.sh --zookeeper localhost:2181 --entity-type topics --entity-name test --alter --add-config segment.bytes=100 
    
    Run Code Online (Sandbox Code Playgroud)
  • 现在,几乎立即我们就会看到旧记录正在从 Kafka 中删除。

  1. 是的。就像 Kafka 中的每个参数一样server.properties,如果我们删除/注释掉一个属性,该属性的默认值就会生效。我认为,默认保留期是 1 周。