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

Offsets stored in Zookeeper or Kafka?

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

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

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

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

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

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

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

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

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

Java 消费者:

这取决于消费者使用的是什么:在 0.9 之前有两个 "old consumer",即 "high level consumer" 和 "low level consumer"。两者都将偏移量直接提交给 ZK。自 0.9 以来,两个消费者都合并为单个消费者,称为 "new consumer"(它基本上统一了两个旧消费者的低级和高级 API -- 这意味着,在 0.9有三种类型的消费者)。新的消费者向代理提交偏移量(即内部 Kafka 主题)

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

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

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

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

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

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