存储在 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高可用以及在zookeeper中的存储
消息中间件(十四)-----kafka高可用以及在zookeeper中的存储
kafkakafka offset 的存储 (存储zookeeper 与 存储 kafka)