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

时间:2016-12-14 07:46:59

标签: node.js apache-kafka apache-zookeeper

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

是什么决定了偏移量是存储在Kafka还是Zookeeper中?什么是利弊?

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

有关我的设置的更多详细信息:

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

3 个答案:

答案 0 :(得分:34)

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

向代理提交偏移的优点是,消费者不依赖于ZK,因此客户只需要与经纪人交谈,这简化了整体架构。此外,对于拥有大量消费者的大型部署,ZK可能成为瓶颈,而Kafka可以轻松处理此负载(提交偏移与写入主题相同,Kafka在这里非常好地扩展 - 事实上,默认情况下{{ 1}}创建了50个分区IIRC)。

我不熟悉NodeJS或kafka-node - 它依赖于客户端实现如何提交偏移量。

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

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

对于Java消费者:

这取决于消费者使用的是什么:在0.9之前有两个"旧消费者"即高级消费者"和"低级消费者"。两者都直接向ZK提交抵消。自0.9以来,两位消费者都被合并为单一消费者,称为“新消费者”#34; (它基本上统一了两个老消费者的低级别和高级别API - 这意味着,在0.9中有三种类型的消费者)。新的消费者承诺向经纪人提供抵消(即内部Kafka主题)

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

答案 1 :(得分:4)

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

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

对于经纪人0.9及更高版本,您应该使用新的ConsumerGroup。偏移量与kafka经纪人一起存储。

请注意,HighLevelConsumer仍然适用于0.8之前的版本,但它们已在0.10.1中弃用,支持可能会很快消失。如果您致力于使用ConsumerGroup,则HighLevelConsumer具有滚动迁移选项以帮助从{{1}}移动。

答案 2 :(得分:0)

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