apache-kafka - 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 来获取过期的组偏移量时,它如何知道这些偏移量已过期?
解决方案
过期的记录不会被删除:文件段只是从磁盘中删除。
听起来您在应用程序中维护状态,而您已使用的记录没有 TTL
您可能想要检查其他 Prometheus Lag 导出器或 Burrow 的工作方式
您也不需要zookeeper.connect
作为该命令的一部分
推荐阅读
- mysql - 如何正确连接我的 php (symfony) 容器和 mysql 容器?
- javascript - 由jQuery插件打开的Angular 6中的模态仅在单击两次后关闭
- node.js - 一个中间件中的许多功能 expressjs restful api
- java - 标记以 super 为界的泛型类型参数
- python - 用随机噪声替换图像中的颜色值
- dart - angular dart js 与客户端中等待的异步/承诺互操作
- python - 如何解码这个错误?我正在使用 Google API 使用 python 翻译列表
- mysql - MariaDb/Mysql 查询以计算树中的节点并找到最大的节点
- python - 我的颜色图从零发散,但我怎样才能将它移动到颜色条的中心?
- amazon-web-services - 在 AWS Elastic Beanstalk 上安装 bcrypt 失败