首页 > 解决方案 > Kafka 不会为过期的偏移提交生成墓碑

问题描述

用例

我为 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

解决方案


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

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

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

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


推荐阅读