【问题标题】:Kafka doesn't delete old messages in topicsKafka 不会删除主题中的旧消息
【发布时间】:2018-07-22 14:28:21
【问题描述】:

在 kafka 中,我将 server.properties 中的保留政策设置为 3 天

############################# Log Retention Policy #############################
...
log.retention.hours=72
...

主题已将 retention.ms 设置为 172800000 (48h)。

但是,/tmp/kafka-logs 文件夹中仍有旧数据,并且没有被删除。 我在更改这些属性后等了几个小时。

有什么需要设置的吗?所有主题都在当前产生和消费。

【问题讨论】:

    标签: apache-kafka


    【解决方案1】:

    编辑:根据 kafka 文档,cleanup.policy 似乎应该默认为 delete

    retention.msretention.bytes 指定删除数据的方式。


    关键是将log.cleanup.policy 设置为compactdelete。我没有设置这个。

    Running: kafka-topics --zookeeper 127.0.0.1:2181 --topic topic1 --describe 显示在主题上设置的属性,例如。 Configs:retention.ms=172800000,cleanup.policy=compact

    必须设置cleanup.policy。我还手动设置了retention.ms / retention.bytes 来控制清理触发器。

    【讨论】:

    • 另请注意,日志段的大小也会影响此行为。
    【解决方案2】:

    Compact 策略只会压缩键中的值。也就是说,它最终将触发压缩过程,该过程将只为键留下一个(最终)值。但永远不要删除最后一个值。

    要按时间触发删除,您需要设置delete 策略。在这种情况下,删除过程将删除比给定数据更旧的数据。

    但是,您可以将策略设置为 compact,delete 以在同一主题上利用两个进程(在早期版本中不可用)。

    但是,这些过程并不是秒级的:它们最终会被触发在某些条件下,例如:

    # The interval at which log segments are checked to see 
    # if they can be deleted according to the retention policies
    log.retention.check.interval.ms=300000
    

    (在Kafka documentation上检查更多条件,然后将保证超过阈值的数据将被删除。

    另外,对于不同的时间粒度有不同的设置,并且有优先级(如果设置了,则忽略下一个)。确保没有意外的覆盖。有关详细信息,请查看综合文档。

    【讨论】:

    • log.retention.check.interval.ms 给出“未知主题配置名称:log.retention.check.interval.ms”
    • 这是代理配置。也许你正在其他地方设置它?您可以在这里找到详细信息:kafka.apache.org/documentation/#brokerconfigs
    • 好吧,我在主题配置中搜索
    【解决方案3】:

    kafka retention policy didn't work as expected 中所述:

    日志保留基于日志文件的创建日期。尝试设置您的 log.roll.hours

    【讨论】:

    • 我设置了这个属性但是没有效果。我现在有超过 7*24 的日志,所以我想这不是。我猜卡夫卡根本不会触发清除。
    • 我注意到主题 consumer offsets 被删除了,但我的主题没有。进行比较是否是由于未设置清理策略引起的,请参阅我的答案。不过还是谢谢!
    猜你喜欢
    • 2020-02-16
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    • 2019-03-31
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多