【问题标题】:Kafka doesn't produce a tombstone for expired offset commitsKafka 不会为过期的偏移提交生成墓碑
【发布时间】:2020-04-17 12:13:58
【问题描述】:

用例

我为 Kafka Consumer Group 偏移量 (https://github.com/cloudworkz/kafka-minion) 编写了一个 prometheus 导出器,它通过使用内部 __consumer_offsets 主题来工作。该主题内所有消息的键和值都是二进制的,我可以对其进行解码。当任何组偏移量过期时,Kafka 应该为此键创建一个墓碑(由组 ID、主题名称和分区 ID 组成)。

问题

到目前为止,这种方法效果很好,但是 Kafka 有时显然不会为某些过期的偏移量/组生成墓碑。我用这个命令消耗了偏移量主题:

kafka-console-consumer.sh --from-beginning --topic __consumer_offsets zookeeper.connect=${ZOO_HOST} --bootstrap-server="${KAFKA_HOST}"  --formatter "kafka.coordinator.group.GroupMetadataManager\$OffsetsMessageFormatter

这会生成格式化的日志行,其中包含偏移提交及其组名、partitionID 和提交时间戳。它还将打印墓碑(NULL 值)。有一些消费者组偏移量仍然没有墓碑,即使它们的偏移量已在 6 个月前提交(偏移量保留设置为 2w)。当我列出来自 Kafka 的消费者组时(使用其他 shell 脚本),Kafka 也没有列出这个消费者组 - 所以内部 Kafka 显然知道这些偏移量已过期。

问题

为什么 Kafka 有时不会为过期的偏移量生成墓碑?当 Kafka 显然不依赖于接收 Tombstones 来获取过期的组偏移量时,它如何知道这些偏移量已过期?

【问题讨论】:

    标签: apache-kafka


    【解决方案1】:

    过期的记录不会被删除:文件段只是从磁盘中删除。

    听起来您在应用程序中维护状态,而您使用的记录没有 TTL

    您可能想要检查其他 Prometheus Lag 导出器或 Burrow 的工作方式

    您也不需要 zookeeper.connect 作为该命令的一部分

    【讨论】:

    • 你能详细说明你的第一句话吗?我的意思是这是一个紧凑的主题,消息确实仍然存在(正如我与控制台消费者核对的那样)。如果不是通过墓碑(由经纪人生产),这些消息将如何被删除?过期偏移量的墓碑是由kafka经纪人发送的(通常是这种情况),但有时它不会发送这些墓碑(我不明白)。
    • 该页面已 6 年未更新,并声称已过时。 offsets.retention.minutes 属性清除过期的偏移量。主题不是无限压缩的,主题配置是实际的compact,deletecwiki.apache.org/confluence/display/KAFKA/…
    • 由于该消息仍然存在于主题中,因此即使清理策略是紧凑删除也无法删除偏移量(顺便说一句,我的集群不是这种情况)
    • 正确,在这种情况下,它也没有被墓碑化,所以我不确定我理解你想说什么。我只是回答了消息是如何被删除的,因为它们没有被墓碑化。描述主题不会显示偏移主题的两个属性。您可以尝试将该属性设置为 -1,从而禁用它
    猜你喜欢
    • 2019-02-03
    • 1970-01-01
    • 2021-02-03
    • 2021-02-23
    • 2018-03-27
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    相关资源
    最近更新 更多