Skip to main content
 首页 » 编程设计

apache-zookeeper之解释 Apache ZooKeeper

2024年02月23日12zhwl

我试图了解 ZooKeeper,它是如何工作的以及它的作用。是否有任何应用程序可以与 ZooKeeper 相媲美?

如果您知道,那么您会如何向外行描述 ZooKeeper?

我已经尝试过 apache wiki、zookeeper sourceforge ......但我仍然无法与之相关。

我只是通读了 http://zookeeper.sourceforge.net/index.sf.shtml ,所以不是还有更多这样的服务吗?是否像复制服务器服务一样简单?

请您参考如下方法:

简而言之,ZooKeeper 可以帮助您构建分布式应用程序。

这个怎么运作

您可以将 ZooKeeper 描述为具有最终一致性的复制同步服务。它是健壮的,因为持久化数据分布在多个节点之间(这组节点称为“集合”)并且一个客户端连接到其中任何一个(即特定的“服务器”),如果一个节点出现故障则迁移;只要严格的大多数节点都在工作,ZooKeeper 节点的集合就处于事件状态。特别是,主节点是通过集成内部的共识动态选择的;如果 master 节点发生故障,master 的角色将迁移到另一个节点。

如何处理写入

master 是写入的权限:这样可以保证写入按顺序持久化,即写入为 线性 .每次客户端写入集成时,大多数节点都会保存信息:这些节点包括客户端的服务器,显然是主节点。这意味着每次写入都会使服务器与主服务器保持同步。但是,这也意味着您不能进行并发写入。

线性写入的保证是 ZooKeeper 在写入主导的工作负载中表现不佳的原因。尤其不能用于媒体等大数据的交换。只要您的通信涉及共享数据,ZooKeeper 都会帮助您。当数据可以并发写入时,ZooKeeper 实际上会造成阻碍,因为即使从编写者的角度来看并不是绝对必要的,它也强加了严格的操作顺序。它的理想用途是用于协调,即在客户端之间交换消息。

如何处理读取

这就是 ZooKeeper 的优势所在:读取是并发的,因为它们由客户端连接的特定服务器提供服务。然而,这也是最终一致性的原因:客户端的“ View ”可能已经过时,因为主节点以有限但未定义的延迟更新相应的服务器。

详细地

ZooKeeper 的复制数据库包含一个 znode 树,这些 znode 是大致代表文件系统节点的实体(将它们视为目录)。每个 znode 都可以通过一个字节数组来丰富,该数组存储数据。此外,每个 znode 下可能还有其他 znode,实际上形成了一个内部目录系统。

顺序节点

有趣的是,znode 的名称可以是连续的,这意味着客户端在创建 znode 时提供的名称只是一个前缀:全名也由集合选择的序列号给出。例如,这对于同步目的很有用:如果多个客户端想要获得一个资源的锁,他们可以每个人同时在一个位置上创建一个顺序 znode:获得最小数字的人有权获得锁。

临时节点

此外,znode 可能是短暂的:这意味着一旦创建它的客户端断开连接,它就会被销毁。这主要用于了解客户端何时失败,这在客户端本身具有应由新客户端承担的责任时可能是相关的。以锁为例,一旦拥有锁的客户端断开连接,其他客户端就可以检查他们是否有权获得锁。

watch

如果我们需要定期轮询 znodes 的状态,那么与客户端断开相关的示例可能会出现问题。幸运的是,ZooKeeper 提供了一个事件系统,可以在 znode 上设置监视。如果 znode 被特别更改或删除,或者在其下创建了新的子节点,则可以将这些监视设置为触发事件。这与 znode 的顺序和临时选项结合使用显然非常有用。

在哪里以及如何使用它

Zookeeper 使用的一个典型例子是分布式内存计算,其中一些数据在客户端节点之间共享,并且必须以非常小心的方式访问/更新以解决同步问题。

ZooKeeper 提供了构建同步原语的库,同时运行分布式服务器的能力避免了使用集中式(类似代理)消息存储库时出现的单点故障问题。

ZooKeeper 是轻功能的,这意味着领导者选举、锁、屏障等机制尚不存在,但可以写在 ZooKeeper 原语之上。
如果 C/Java API 对您的目的来说太笨拙,您应该依赖基于 ZooKeeper 构建的库,例如 cages尤其是 curator .

在哪里阅读更多

除了官方文档,还是不错的,建议看Hadoop: The Definitive Guide的第14章它有大约 35 页,主要解释 ZooKeeper 的作用,然后是配置服务的示例。