为什么Kafka消费者连接到zookeeper,生产者从经纪人那里获取元数据?

Luc*_*507 34 apache-kafka apache-zookeeper

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

我的观点是,当每个经纪人已经拥有所有必要的元数据来告诉生产者发送他们的消息的位置时,使用zookeeper究竟是什么?经纪人难道不能向消费者发送同样的信息吗?

我可以理解为什么代理拥有元数据,每次向它们发送新消息时都不必与zookeeper建立连接.动物园管理员有没有我失踪的功能?我发现很难想到为什么在kafka集群中确实需要zookeeper的原因.

ser*_*jja 49

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

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

现在更详细.

关于偏移量跟踪,请考虑以下情况:启动消费者,消耗100条消息并关闭消费者.下次启动消费者时,您可能希望从上次消耗的偏移量(即100)恢复,这意味着您必须在某处存储最大消耗偏移量.这里是zookeeper开始的地方:它存储每个组/主题/分区的偏移量.所以这种方式下次你启动消费者时可能会问"嘿,动物园管理员,我应该开始消费的偏差是多少?".卡夫卡朝着能够存储偏移不仅在饲养员,但在其他存储器以及实际移动(目前只zookeeperkafka偏移存储器可用,我不知道kafka存储全面实施).

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

  • 这10台机器应该如何划分彼此之间的分区?
  • 如果其中一台机器死了怎么办?
  • 如果你想添加另一台机器会发生什么?

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

  • 谢谢你的回答,这清除了它,这是我猜到的,但我无法在任何地方找到它.我也读过0.9版本的消费者将不再使用zookeeper,它只被经纪人用于领导者选举等. (4认同)

小智 12

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