为啥Kafka消费者连接zookeeper,生产者从broker获取元数据?

Posted

技术标签:

【中文标题】为啥Kafka消费者连接zookeeper,生产者从broker获取元数据?【英文标题】:Why do Kafka consumers connect to zookeeper, and producers get metadata from brokers?为什么Kafka消费者连接zookeeper,生产者从broker获取元数据? 【发布时间】:2015-03-11 04:02:19 【问题描述】:

为什么消费者连接到zookeeper来检索分区位置?并且 kafka 生产者必须连接到其中一个代理来检索元数据。

我的意思是,当每个代理都已经拥有所有必要的元数据来告诉生产者发送消息的位置时,zookeeper 到底有什么用?经纪人不能将同样的信息发送给消费者吗?

我可以理解为什么代理拥有元数据,而不必在每次向它们发送新消息时都与 zookeeper 建立连接。动物园管理员有我缺少的功能吗?我发现很难想出为什么在 kafka 集群中真正需要 zookeeper 的原因。

【问题讨论】:

【参考方案1】:

首先,只有高级消费者才需要 Zookeeper。 SimpleConsumer 不需要 zookeeper 工作。

高级消费者需要 zookeeper 的主要原因是跟踪消耗的偏移量并处理负载平衡。

现在更详细。

关于偏移量跟踪,想象以下场景:您启动一个消费者,消费 100 条消息并关闭该消费者。下次启动消费者时,您可能希望从上次消耗的偏移量(即 100)恢复,这意味着您必须在某处存储最大消耗的偏移量。这是 zookeeper 的作用:它存储每个组/主题/分区的偏移量。因此,下次您启动消费者时,它可能会问“嘿动物园管理员,我应该从什么偏移量开始消费?”。 Kafka 实际上正朝着能够存储偏移量的方向发展,不仅可以在 zookeeper 中存储,还可以在其他存储中存储(目前只有 zookeeperkafka 偏移存储可用,我不确定 kafka 存储是否已完全实现) .

关于负载平衡,产生的消息量可能非常大,可以由 1 台机器处理,并且您可能希望在某个时候增加计算能力。假设您有一个包含 100 个分区的主题,并且要处理这么多消息,您有 10 台机器。这里实际上出现了几个问题:

这10台机器之间应该如何划分分区? 如果其中一台机器死了会怎样? 如果您想添加另一台机器会怎样?

再一次,这里是 zookeeper 发挥作用的地方:它跟踪组中的所有消费者,并且每个高级消费者都订阅了该组中的更改。关键是当消费者出现或消失时,zookeeper 会通知所有消费者并触发重新平衡,以便他们几乎平等地分割分区(例如平衡负载)。这样可以保证如果其中一个消费者死亡,其他消费者将继续处理该消费者拥有的分区。

【讨论】:

感谢您的回答,这清除了它,这是我的猜测,但我无法在任何地方找到它。我也刚刚读到 0.9 版消费者将不再使用 Zookeeper,它仅由经纪人用于领导选举等。 感谢您提供的有用信息。你能给我这个信息的参考吗?【参考方案2】:

在 kafka 0.9+ 中引入了新的 Consumer API。新消费者不需要连接到 Zookeeper,因为组平衡是由 kafka 本身提供的。

【讨论】:

【参考方案3】:

你是对的,消费者不需要连接到 ZooKeeper,因为 kafka 0.9 release。他们重新设计了 API 并引入了新的消费者客户端:

0.9 版本引入了对重新设计的新版本的 beta 支持 消费者客户端。在高层次上,新的主要区别 消费者是它消除了“高级”之间的区别 基于 ZooKeeper 的消费者和“低级”SimpleConsumer API,以及 而是提供统一的消费者 API。

终于完成了过去几年完成的一系列项目 将 Kafka 客户端与 Zookeeper 完全解耦,从而完全移除 消费者客户端对 ZooKeeper 的依赖。

【讨论】:

以上是关于为啥Kafka消费者连接zookeeper,生产者从broker获取元数据?的主要内容,如果未能解决你的问题,请参考以下文章

kafka内置的zookeeper

Kafka高可用的保证

kafka

4 kafka集群部署及生产者java客户端编程 + kafka消费者java客户端编程

[Golang] kafka集群搭建和golang版生产者和消费者

kafka消费者java版本读取不到消息怎么办