【发布时间】:2020-08-05 00:29:14
【问题描述】:
试图了解 Apache Kafka 中保留期背后的逻辑。请帮助我了解以下情况的情况。
- 如果保留期设置为 0,会发生什么情况?是否会删除所有记录?
- 如果我们删除保留参数本身,它会采用默认值吗?
【问题讨论】:
-
注意:[confluent-kafka] 标签仅用于基于 librdkafka 的客户端。
标签: apache-kafka
试图了解 Apache Kafka 中保留期背后的逻辑。请帮助我了解以下情况的情况。
【问题讨论】:
标签: apache-kafka
java.lang.IllegalArgumentException:要求失败: log.retention.ms 必须是无限的 (-1) 或等于或大于 1
您仍然可以在使用参数log.retention.minutes 或log.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。您可以在this 线程中找到有关保留如何依赖于数据摄取和时间的示例。
为了测试这一点,我们可以尝试一个小实验。让我们启动 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
现在,如果我们使用 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
现在,我们几乎会立即看到旧记录正在从 Kafka 中删除。
server.properties 中的每个 Kafka 参数一样,如果我们删除/注释掉一个属性,该属性的默认值就会生效。我认为,默认保留期是 1 周。【讨论】:
log.retention.hours=168。可以在broker网站上更改,但也可以为每个主题设置不同的值