存储在 Zookeeper 或 Kafka 中的偏移量?

Posted

技术标签:

【中文标题】存储在 Zookeeper 或 Kafka 中的偏移量?【英文标题】:Offsets stored in Zookeeper or Kafka? 【发布时间】:2017-04-29 11:15:41 【问题描述】:

我对使用 Kafka 和 Zookeeper 时存储偏移量的位置有点困惑。在某些情况下,偏移量似乎存储在 Zookeeper 中,在其他情况下,它们存储在 Kafka 中。

是什么决定了偏移量是存储在Kafka还是Zookeeper中?以及有什么好处和坏处?

注意:当然,我也可以将偏移量自己存储在一些不同的数据存储中,但这不是本文图片的一部分。

关于我的设置的更多细节:

我运行这些版本:KAFKA_VERSION="0.10.1.0", SCALA_VERSION="2.11" 我使用我的 NodeJS 应用程序中的 kafka-node 连接到 Kafka/Zookeeper。

【问题讨论】:

【参考方案1】:

较旧版本的 Kafka(0.9 之前)仅在 ZK 中存储偏移量,而较新版本的 Kafka 在默认情况下将偏移量存储在名为 __consumer_offsets 的内部 Kafka 主题中(尽管较新版本可能仍会提交到 ZK)。

向代理提交偏移量的优点是,消费者不依赖 ZK,因此客户端只需与代理对话,从而简化了整体架构。此外,对于有大量消费者的大型部署,ZK 可能成为瓶颈,而 Kafka 可以轻松处理这种负载(提交偏移量与写入主题相同,Kafka 在这里扩展得很好——事实上,默认情况下 @987654322 @ 是用 50 个分区 IIRC 创建的)。

我不熟悉 NodeJS 或 kafka-node ——这取决于客户端实现如何提交偏移量。

长话短说:如果您使用经纪人0.10.1.0,您可以向主题__consumer_offsets 提交偏移量。但这取决于你的客户,如果它实现了这个协议。

更详细地说,这取决于您的代理和客户端版本(以及您使用的消费者 API),因为旧客户端可以与新代理通信。首先,您需要有代理和客户端版本0.9 或更高版本才能将偏移量写入 Kafka 主题。但如果老客户端连接到 0.9 代理,它仍然会向 ZK 提交偏移量。

对于 Java 消费者:

这取决于消费者使用的是什么:0.9 之前有两个“老消费者”,即“高级消费者”和“低级消费者”。两者都直接向 ZK 提交偏移量。从0.9开始,两个消费者合并为一个消费者,称为“新消费者”(它基本上统一了两个老消费者的低级和高级API——这意味着,在0.9中有三种类型的消费者)。新的消费者向代理提交偏移量(即内部 Kafka 主题)

为了使升级更容易,还可以使用旧消费者“双重提交”偏移量(截至0.9)。如果您通过dual.commit.enabled 启用此功能,偏移量将提交给 ZK 和__consumer_offsets 主题。这允许您从旧的消费者 API 切换到新的消费者 API,同时将偏移量从 ZK 移动到 __consumer_offsets 主题。

【讨论】:

谢谢,我会确保升级到最新的 API。【参考方案2】:

这完全取决于您使用的消费者。您应该根据您的 Kafka 版本选择合适的消费者。

对于版本0.8 代理使用HighLevelConsumer。您的组的偏移量存储在 zookeeper 中。

对于0.9 及更高级别的经纪人,您应该使用新的ConsumerGroup。偏移量存储在 kafka 代理中。

请记住,HighLevelConsumer 仍适用于 0.8 之后的版本,但它们已在 0.10.1 中被弃用,支持可能很快就会消失。 ConsumerGroup 具有滚动迁移选项,可帮助您从 HighLevelConsumer 迁移(如果您承诺使用它)。

【讨论】:

【参考方案3】:

Kafka 中的偏移量作为消息存储在名为 '__consumer_offsets' 的单独主题中。在最新版本的 kafka 中,每个消费者都会定期向主题提交一条消息。

【讨论】:

以上是关于存储在 Zookeeper 或 Kafka 中的偏移量?的主要内容,如果未能解决你的问题,请参考以下文章

kafka笔记-Kafka在zookeeper中的存储结构

消息中间件(十四)-----kafka高可用以及在zookeeper中的存储

消息中间件(十四)-----kafka高可用以及在zookeeper中的存储

kafkakafka offset 的存储 (存储zookeeper 与 存储 kafka)

kafka中的 zookeeper 起到什么作用,可以不用zookeeper么?

kafka中的 zookeeper 起到什么作用,可以不用zookeeper么?