在Kafka中,我想只使用单个代理,单个主题和一个具有一个生产者和多个消费者的分区(每个消费者从代理获得自己的数据副本)。鉴于此,我不希望使用Zookeeper的开销;我不能只使用经纪人吗?为什么动物园管理员必须?
是的,运行Kafka需要Zookeeper。从Kafka入门文档:
第2步:启动服务器
Kafka使用zookeeper,因此如果您还没有动物园管理员服务器,则需要先启动它。您可以使用与kafka一起打包的便捷脚本来获取快速且脏的单节点zookeeper实例。
至于为什么,很久以前人们发现你需要有一些方法来协调分布式系统中的任务,状态管理,配置等。一些项目已经构建了自己的机制(想想MongoDB分片集群中的配置服务器,或Elasticsearch集群中的主节点)。其他人选择利用Zookeeper作为通用的分布式过程协调系统。所以Kafka,Storm,HBase,SolrCloud只是命名一些都使用Zookeeper来帮助管理和协调。
Kafka是一个分布式系统,用于使用Zookeeper。您没有使用Kafka的任何分布式功能这一事实并没有改变它的构建方式。无论如何,使用Zookeeper不应该有太多开销。更大的问题是为什么要使用这种特殊的设计模式--Kafka的单个代理实现错过了多代理群集的所有可靠性功能以及它的扩展能力。
正如其他人所解释的那样,没有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/
恕我直言,动物园管理员不是一个开销,但让你的生活更轻松。
它主要用于维护集群中不同节点之间的协调。 Kafka最重要的事情之一是它使用zookeeper定期提交偏移量,以便在节点发生故障的情况下,它可以从先前提交的偏移量恢复(想象一下你自己处理所有这些)。
Zookeeper还可以用于服务于许多其他目的,例如领导者检测,配置管理,同步,检测新节点何时加入或离开集群等。
未来的Kafka版本计划取消对zookeeper的依赖,但截至目前它已成为其中不可或缺的一部分。
以下是他们的常见问题解答页面中的几行:
一旦Zookeeper法定人数下降,经纪人可能会导致状态不佳,无法正常服务客户请求等。虽然当Zookeeper法定人数恢复时,卡夫卡经纪人应该能够自动恢复到正常状态,仍有一些极端情况他们不能,并且需要一个艰难的杀戮和恢复才能恢复正常。因此,建议密切监视您的zookeeper群集并对其进行配置,以使其具有高性能。
有关更多详细信息,请查看here
除了通常的有效载荷消息传输之外,还有许多其他通信在kafka中发生。 like *与请求集群成员资格的经纪人相关的事件*与经纪人相关的事件变得可用*获取引导程序配置设置。 *与控制器和领导者更新相关的事件。 *帮助状态更新,如Heartbeat更新。
Zookeeper本身是一个分布式系统,由一个集合中的多个节点组成。 Zookeeper是用于维护此类元数据的集中服务。
Zookeeper是任何类型的分布式系统的集中和管理系统。分布式系统是在不同节点/集群上运行的不同软件模块(可能位于地理位置较远的位置),但作为一个系统运行。 Zookeeper促进节点之间的通信,在节点之间共享配置,跟踪哪个节点是领导者,哪个节点加入/离开等等.Zookeeper是保持分布式系统健全并保持一致性的人。 Zookeeper基本上是一个编排平台。
Kafka是一个分布式系统。因此,对于可能在地理上遥远(或不是)的节点,它需要某种编排。