Zookeeper是Kafka的必需品吗?


133

在Kafka中,我只想使用一个代理,单个主题和一个具有一个生产者和多个消费者的分区(每个消费者都从代理获取自己的数据副本)。鉴于此,我不需要使用Zookeeper的开销;我不仅可以只使用经纪人吗?为什么动物园管理员必须?


12
Kafka的最大设计目标之一是集群部署。这就是他们正在解决的问题,而为独立服务器制作一个无zk-less版本会很愚蠢。我有一种感觉,卡夫卡不适合你的工作的工具,但你会只是使用香草文件越好..
RickyA

5
我真的很想知道您完成了什么?由于您没有选择任何答案,因此我想您对此有自己的解决方案。谢谢 !
Karthikeyan 2015年

Jocko是Kafka的golang实现,无需依赖动物园管理员,也无需安装单个二进制文件
Arun Gopalpuri,

1
动物园管理员已被删除,请参阅下面的答案- stackoverflow.com/a/57328140/1699956
Mangat清莱莫迪

1
只需添加一下,如果您阅读了Zookeeper所做的工作,您就会知道Zookeeper is network coordinator in a distributed system. Use ZooKeeper extensively for discovery, resource allocation, leader election, and high priority notifications.
roottraveller

Answers:


127

是的,运行Kafka需要Zookeeper。从Kafka入门文档中:

步骤2:启动伺服器

Kafka使用zookeeper,因此如果您还没有Zookeeper服务器,则需要先启动它。您可以使用kafka随附的便利脚本来获取快速且肮脏的单节点zookeeper实例。

至于为什么,很早以前人们就发现您需要某种方式来跨分布式系统协调任务,状态管理,配置等。一些项目已经建立了自己的机制(例如,在MongoDB分片群集中的配置服务器,或者在Elasticsearch群集中的主节点)。其他人则选择将Zookeeper用作通用的分布式过程协调系统。因此,仅举几例,Kafka,Storm,HBase,SolrCloud都使用Zookeeper来帮助管理和协调。

Kafka是一个分布式系统,旨在使用Zookeeper。您没有使用Kafka的任何分布式功能这一事实并不会改变其构建方式。无论如何,使用Zookeeper不会有太多开销。更大的问题是为什么要使用这种特殊的设计模式-Kafka的单个代理实现会错过多经纪人集群的所有可靠性功能以及扩展能力。


9
实际上,kafka的设计方式是,即使您使用单个代理,它仍然是分布式模式,但是复制因子为1-不会有任何快捷方式机制或特殊模式(这很好,实际上)。
om-nom-nom 2014年

2
Kafka 0.8.1需要zk。我想知道,如果Kafka中没有抽象层可用于协调系统,那么如何才能为Kafka启用其他协调系统。
stanleyxu2005


64

正如其他人所解释的那样,如果没有Zookeeper,Kafka(即使是最新版本)也无法使用。

Kafka将Zookeeper用于以下用途:

选择一个控制器。控制器是代理之一,负责维护所有分区的领导者/从属者关系。当节点关闭时,控制器会告诉其他副本成为分区负责人,以替换即将消失的节点上的分区负责人。Zookeeper用于选举控制器,请确保只有一个控制器,如果崩溃则选择一个新控制器。

集群成员资格 -哪些代理还活着并且是集群的一部分?这也可以通过ZooKeeper进行管理。

主题配置 -存在哪些主题,每个主题有多少个分区,副本在哪里,谁是首选领导者,为每个主题设置了哪些配置替代

(0.9.0)-配额 -每个客户端允许读写多少数据

(0.9.0)-ACL允许谁读写哪个主题(旧的高级消费者)-存在哪些消费者组,它们的成员是谁,以及每个组从每个分区获取的最新偏移量是多少。

[摘自https://www.quora.com/What-is-the-actual-role-of-ZooKeeper-in-Kafka/answer/Gwen-Shapira ]

关于您的方案,只有一个经纪人实例和一个具有多个使用者的生产者,您可以使用pusher创建一个频道,并将事件推送到该使用者可以订阅并处理这些事件的频道。 https://pusher.com/


3
您想将“最新版本”编辑为实际版本吗?使您的回复年龄更好。
akauppi


我添加参考,最后一段最初来自我。
凯文·李

47

重要更新-2019年8月:

ZooKeeper依赖关系将从Apache Kafka中删除。请参阅KIP-500中的高级讨论:用自管理元数据仲裁替换ZooKeeper

这些工作将需要一些Kafka版本和其他KIP。Kafka控制器将接管当前的ZooKeeper任务。管制员将利用事件日志的好处,这是Kafka的核心概念。

新的Kafka架构的一些好处是更简单的架构,易于操作和更好的可伸缩性(例如,允许“无限分区”。



11

Kafka是为使用Zookeeper而构建的。没有逃避的可能。

Kafka是一个分布式系统,使用Zookeeper来跟踪kafka群集节点的状态。它还跟踪Kafka主题,分区等。

看您的问题,看来您不需要Kafka。您可以使用任何支持pub-sub的应用程序(例如Redis,Rabbit MQ)或托管解决方案(例如Pub-nub)


9

恕我直言,Zookeeper并不是开销,但可以使您的生活更加轻松。

它基本上用于维护集群中不同节点之间的协调。对于Kafka而言,最重要的事情之一是它使用zookeeper定期提交偏移量,以便在节点发生故障的情况下,它可以从先前提交的偏移量中恢复(想像一下,您要自己照顾所有这一切)。

Zookeeper在服务于许多其他目的方面也起着至关重要的作用,例如领导者检测,配置管理,同步,检测新节点何时加入或离开群集等。

未来的Kafka版本计划删除Zookeeper依赖性,但到目前为止,它已成为其不可分割的一部分。

以下是从“常见问题”页面中摘录的几行:

一旦Zookeeper仲裁失败,代理可能会导致状态恶化,无法正常处理客户请求等。尽管当Zookeeper仲裁恢复后,Kafka代理应该能够自动恢复到正常状态,但仍然存在一些极端情况他们无法做到,因此需要进行艰苦的追捕和恢复工作才能使其恢复正常。因此,建议密切监视您的Zookeeper群集并对其进行配置,以使其性能良好。

欲了解更多详情,请点击这里


13
动物园管理员很头疼。在HBase中。在卡夫卡。在风暴中。我知道在Kafka / ZK中存在一些长期存在的错误,这些错误导致我的团队放弃了它,转而使用RabbitMQ。安装HBase涉及到解决ZK问题的时间。但是,与OP相关的答案是正确的:必须输入ZK。
javadba

2
确实存在bug和版本兼容性问题(至少对于Kafka和ZK而言),但是zookeeper的主要目的是管理任何分布式系统所需的那些复杂任务。在zk上可能不是明智的选择。也许这就是为什么kafka试图在更高版本中减少zk依赖性的原因。另一方面,我认为RabitMQ和Kafka具有非常不同的设计理念,旨在解决不同的用例,但我认为这超出了本文的讨论范围:)
user2720864 2015年

是的,kafka在高负载情况下表现出色。我们决定做RabbitMQ,直到/除非我们明确要求这些优势。使用RabbitMQ进行编程也更加容易:Kafka的scala版本存在依赖性。
javadba

4
IMHO zookeeper is not an overhead but makes your life a lot easier.->不是从sysop的角度来看。Zk是一块落后的旧Java代码。例如,它有一个很长的突出错误,即它不遵守dns条目的ttl,因此不会重新解析条目。不在窗口中的是您的服务器交换可能性。我很乐意将它换成etcd。
RickyA

“我们决定做RabbitMQ,直到/除非我们明确要求这些优势。” 希望我的团队能受到这样的启发。恕我直言,我们显然没有足够高的负载来证明Kafka合理,但无论如何我们都在使用Kafka :(
Smith先生,

4

Zookeeper正在对任何种类的分布式系统进行集中和管理。分布式系统是在不同的节点/群集(可能位于地理位置较远的位置)上运行但作为一个系统运行的不同软件模块。Zookeeper促进了节点之间的通信,在节点之间共享配置,跟踪哪个节点是领导者,哪个节点加入/离开等。Zookeeper是使分布式系统保持健全并保持一致性的人。Zookeeper基本上是一个编排平台。

Kafka是一个分布式系统。因此,它需要对其节点进行某种编排,这些节点可能在地理位置上相距遥远(或不相距较远)。


3

是的,Zookeeper必须是Kafka设计的。因为Zookeeper负责管理Kafka集群。它具有所有Kafka经纪人的列表。如果任何代理发生故障,分区发生故障或新代理发生故障或分区已发生故障,它将通知Kafka。简而言之,ZK可使每个Kafka经纪人保持有关Kafka集群当前状态的最新信息。

然后,每个Kafka客户端(生产者/消费者)所需要做的就是与任何单个代理连接,并且该代理具有Zookeeper更新的所有元数据,因此客户端无需为代理发现麻烦而烦恼。


3

除了通常的有效负载消息传输外,kafka中还会发生许多其他通信,例如

  • 与代理请求集群成员资格有关的事件。
  • 与经纪人有关的事件可用。
  • 获取引导程序配置设置。
  • 与控制器和领导者更新有关的事件。
  • 帮助状态更新,例如心跳更新。

Zookeeper本身是一个分布式系统,由一个集合中的多个节点组成。Zookeeper是用于维护此类元数据的集中服务。


1

文章解释了动物园管理员在卡夫卡的作用。它解释了kafka是如何无状态的,以及zookeper在kafka(以及更多分布式系统)的分布式性质中如何发挥重要作用。


1

在没有Zookeeper的情况下运行Kafka的请求似乎很常见。Charlatan图书馆解决了这个问题。

根据描述,Charlatan或多或少是Zookeeper的模拟,它通过其他工具或数据库来提供Zookeeper服务。

在处理Charlatan库作者的主要产品时,我遇到了该库。那里工作正常...


0

首先

Apache ZooKeeper是一个分布式存储,用于提供 高度可用的方式配置同步服务。在较新版本的卡夫卡,工作,以便做客户端消费者不存储有关它在多大程度上使用的消息(称为偏移)到动物园管理员.This reduced usage did not get rid of the need for consensus and coordination in distributed systems however.虽然卡夫卡提供容错性和弹性,是必要的,以提供一些需要进行协调,而ZooKeeper可以启用整个系统的那一部分。

其次

商定分区的领导者是谁,这是ZooKeeper在Kafka生态系统中实际应用的一个示例。

Zookeeper would work if there was even a single broker. 

这些来自《Kafka In Action》一书。图片来自此课程

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.