存储在 Zookeeper 或 Kafka 中的偏移量?
Offsets stored in Zookeeper or Kafka?
我对使用 Kafka 和 Zookeeper 时偏移量的存储位置感到有点困惑。似乎在某些情况下偏移量存储在 Zookeeper 中,在其他情况下它们存储在 Kafka 中。
是什么决定了偏移量是存储在Kafka还是Zookeeper中?以及有什么好处和坏处?
注意:当然我也可以自己将偏移量存储在一些不同的数据存储中,但这不是这个 post 的图片的一部分。
关于我的设置的更多细节:
- 我运行这些版本:KAFKA_VERSION="0.10.1.0", SCALA_VERSION="2.11"
- 我从我的 NodeJS 应用程序使用 kafka-node 连接到 Kafka/Zookeeper。
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 中,每个消费者定期向主题提交一条消息。
我对使用 Kafka 和 Zookeeper 时偏移量的存储位置感到有点困惑。似乎在某些情况下偏移量存储在 Zookeeper 中,在其他情况下它们存储在 Kafka 中。
是什么决定了偏移量是存储在Kafka还是Zookeeper中?以及有什么好处和坏处?
注意:当然我也可以自己将偏移量存储在一些不同的数据存储中,但这不是这个 post 的图片的一部分。
关于我的设置的更多细节:
- 我运行这些版本:KAFKA_VERSION="0.10.1.0", SCALA_VERSION="2.11"
- 我从我的 NodeJS 应用程序使用 kafka-node 连接到 Kafka/Zookeeper。
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 中,每个消费者定期向主题提交一条消息。