试图了解Apache Kafka保留期背后的逻辑。请帮助我了解以下情况的情况。
答案 0 :(得分:1)
Kafka不允许您将保留期限设置为零(以小时为单位)。它必须至少为1。如果将其设置为零,则会收到以下错误消息java.lang.IllegalArgumentException: requirement failed: log.retention.ms must be unlimited (-1) or, equal or greater than 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
的主题并将其保留期更改为零。
nohup ./zookeeper-server-start.sh ../config/zookeeper.properties &
nohup ./kafka-server-start.sh ../config/server.properties &
./kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
./kafka-configs.sh --zookeeper localhost:2181 --entity-type topics --entity-name test --alter --add-config log.retention.ms=0
log.segment.bytes
更改为100个字节。
./kafka-configs.sh --zookeeper localhost:2181 --entity-type topics --entity-name testing --alter --add-config segment.bytes=100
是的。 server.properties
中的每个Kafka参数都会发生这种情况,如果我们删除/注释一个属性,该属性的默认值就会生效。我认为默认保留期为1周。