我正在尝试理解ZooKeeper是如何工作和它的作用。是否有与ZooKeeper可比较的应用程序呢?
如果您了解的话,那么您会如何向外行人描述ZooKeeper?
我已经尝试过阅读Apache Wiki、ZooKeeper SourceForge等资料,但仍无法理解。
我刚刚阅读了http://zookeeper.sourceforge.net/index.sf.shtml,那么是否还有类似于它的其他服务呢?它是否只是复制服务器服务一样简单?
我正在尝试理解ZooKeeper是如何工作和它的作用。是否有与ZooKeeper可比较的应用程序呢?
如果您了解的话,那么您会如何向外行人描述ZooKeeper?
我已经尝试过阅读Apache Wiki、ZooKeeper SourceForge等资料,但仍无法理解。
我刚刚阅读了http://zookeeper.sourceforge.net/index.sf.shtml,那么是否还有类似于它的其他服务呢?它是否只是复制服务器服务一样简单?
ZooKeeper的复制数据库由一棵znode树组成,它们大致表示文件系统节点(将它们视为目录)。每个znode可以通过一个字节数组进行增强,用于存储数据。此外,每个znode下面可能还有其他znodes,实际上形成了一个内部目录系统。
有趣的是,znode的名称可以是序列化的,这意味着客户端在创建znode时提供的名称仅是前缀:完整的名称也由集合选择的顺序号给出。例如,如果多个客户端想要获取资源的锁,则可以在位置上同时创建序列化的znode,获得最低编号的客户端有权使用锁,从而实现同步目的。
此外,znode可以是临时的:这意味着只要创建它的客户端断开连接,它就会被销毁。这主要有助于了解客户端失败的情况,在客户端本身具有应该由新客户端承担的责任时,这可能是相关的。以锁为例,一旦持有锁的客户端断开连接,其他客户端就可以检查是否有资格使用锁。
与客户端断开连接相关的示例可能存在问题,如果我们需要定期轮询znode的状态。幸运的是,ZooKeeper提供了一个事件系统,可以在znode上设置监视器。这些监视器可以设置为在特定更改或删除znode或在其下创建新的子级时触发事件。这在与znode的序列化和临时选项结合使用时非常有用。
ZooKeeper的经典应用场景是分布式内存计算,在这种情况下,一些数据在客户端节点之间共享,并且必须以非常谨慎的方式进行访问/更新以实现同步。
ZooKeeper提供了构建同步原语的库,同时运行分布式服务器的能力避免了使用集中式(类似代理的)消息存储库时出现的单点故障问题。
ZooKeeper 是一个功能轻量级的系统,它没有提供领导者选举,锁定,屏障等机制,但可以在 ZooKeeper 原语之上编写这些机制。如果C/Java API对你来说太笨重,你应该依靠基于 ZooKeeper 构建的库,例如 cages 和尤其是 curator。
除了官方文档外,我建议阅读《Hadoop权威指南》的第14章,该章节共有约35页,主要解释ZooKeeper所做的事情,并且提供一个配置服务的示例。
Zookeeper是最好的开源服务器和服务之一,有助于可靠地协调分布式进程。Zookeeper是一个CP系统(参考CAP定理),提供一致性和分区容错。跨所有节点复制Zookeeper状态使其成为最终一致性的分布式服务。
此外,任何新选举的领导者都将使用缺少的提案或状态快照更新其追随者,如果追随者缺少许多提案。
Zookeeper还提供了一个非常易于使用的API。如果您正在寻找示例,本博客文章“Zookeeper Java API示例”中有一些示例。
那么我们在哪里使用它?如果您的分布式服务需要集中、可靠和一致的配置管理、锁、队列等,您会发现Zookeeper是一个可靠的选择。
它解决了什么问题?
假设我们有一个文件存储库,其中包含一百万个文件,并且每天每分钟都会增加文件数量。我们的任务是首先处理这些文件,然后将其删除。我们可以考虑的一种方法是编写一个脚本来执行此任务,并在多个服务器上并行运行多个实例。我们甚至可以根据需求增加或减少服务器数量。这基本上是分布式计算/数据处理应用程序。
在这里,我们如何确保同一文件不会同时被多个服务器选择和处理?为解决这个问题,所有服务器都应该共享关于当前正在处理哪个文件的信息。
这就是我们可以使用类似ZooKeeper的东西的地方。当第一个服务器想要读取一个文件时,它可以写入ZooKeeper,表示它将要处理的文件名。现在,其余的服务器可以查找ZooKeeper,并知道该文件已经被第一个服务器选中。
以下是一个简单的示例,需要在其中放置其他一些守卫才能正常运行,但我希望它能够说明Zookeeper的功能。下面是解释如何实现这些功能的页面https://zookeeper.apache.org/doc/current/recipes.html
ZooKeeper可以有更多的应用。根据您的分布式系统的要求,必须在ZK API之上构建这些功能。
注意:不应将ZK用于存储大量数据。它不是缓存/数据库。 请使用它交换分布式应用程序需要启动、运行和故障转移的小块信息。
数据是如何存储的?
数据存储在分层树形数据结构中。树中的每个节点称为 znode。znode 的最大大小为 1MB。znode 可以有数据和其他子 znode。将 znode 想象成计算机上的文件夹,该文件夹可以具有带有数据的文件,但是该文件夹本身也可以像文件一样具有数据。有没有任何与Zookeeper相媲美的应用程序?
Zookeeper是一个集中式的开源服务器,用于维护和管理分布式集群环境中的配置信息、命名约定和同步。Zookeeper通过提供低延迟和高可用性,帮助分布式系统减少管理复杂性。Zookeeper最初是Hadoop项目的子项目,现在是Apache Software Foundation的顶级独立项目。
我的方法来理解zookeeper,是通过CLI客户端进行试验。具体可以参考入门指南和命令行界面。
通过这种方式,我了解到zookeeper的外观与文件系统非常相似,客户端可以创建和删除对象,并读取或写入数据。
create /myfirstnode mydata
ls /
get /myfirstnode
delete /myfirstnode
如何在Docker for Windows、Linux或Mac上在几分钟内启动一个Zookeeper环境:
一次性设置:
docker network create dn
在终端窗口中运行服务器:
docker run --network dn --name zook -d zookeeper
docker logs -f zookeeper
docker run -it --rm --network dn zookeeper zkCli.sh -server zook
Apache ZooKeeper 是一个用于协调和管理分布式应用程序配置的开源技术。它简化了维护配置细节、启用分布式同步以及管理命名注册表等任务。
它的名称非常贴切 - 想象一下动物管理员如何四处走动,照顾所有的动物,维护它们的围栏,喂养它们等等。
Apache ZooKeeper 可以与 Apache Pinot 或 Apache Flink 等 Apache 项目一起使用。Apache Kafka 也使用 ZooKeeper 来管理代理、主题和分区信息。由于 Apache ZooKeeper 是开源的,因此您可以将其与任何您选择的技术或项目配对,而不仅仅是 Apache Foundation 项目。