ZooKeeper

ZooKeeper:分布式应用程序的分布式协调服务

ZooKeeper 是用于分布式应用程序的分布式,开放源代码协调服务。它公开了一组简单的 Primitives,分布式应用程序可以基于这些 Primitives 来实现用于同步,配置维护以及组和命名的更高级别的服务。它的设计易于编程,并使用了按照文件系统熟悉的目录树结构样式设置的数据模型。它以 Java 运行,并且具有 Java 和 C 的绑定。

众所周知,协调服务很难做到。它们特别容易出现诸如 match 条件和死锁之类的错误。 ZooKeeper 背后的动机是减轻分布式应用程序从头开始实施协调服务的责任。

Design Goals

ZooKeeper 很简单. ZooKeeper 允许分布式进程通过共享的分层命名空间相互协调,该命名空间的组织方式类似于标准文件系统。名称空间由数据寄存器(在 ZooKeeper 中称为 znodes)组成,它们类似于文件和目录。与设计用于存储的典型文件系统不同,ZooKeeper 数据保留在内存中,这意味着 ZooKeeper 可以实现高吞吐量和低延迟数。

ZooKeeper 实施对高性能,高可用性,严格有序访问加以重视。 ZooKeeper 的性能方面意味着它可以在大型分布式系统中使用。可靠性方面使它不会成为单点故障。严格的排序意味着可以在 Client 端上实现复杂的同步 Primitives。

ZooKeeper 是复制的. 像它协调的分布式进程一样,ZooKeeper 本身也可以在称为集合的一组主机上进行复制。

ZooKeeper Service

组成 ZooKeeper 服务的服务器都必须彼此了解。它们维护内存中的状态图像,以及持久存储中的事务日志和快照。只要大多数服务器可用,ZooKeeper 服务将可用。

Client 端连接到单个 ZooKeeper 服务器。Client 端维护一个 TCP 连接,通过该连接发送请求,获取响应,获取监视事件并发送心跳。如果与服务器的 TCP 连接断开,则 Client 端将连接到其他服务器。

ZooKeeper 已 Order. ZooKeeper 在每次更新中标记一个数字,该数字反映了所有 ZooKeeper 事务的 Sequences。后续操作可以使用该命令来实现更高级别的抽象,例如同步 Primitives。

ZooKeeper 速度很快. 在“读取占主导地位”的工作负载中特别快。 ZooKeeper 应用程序可在数千台计算机上运行,并且在读取比写入更常见的情况下,其性能最佳,比率约为 10:1.

数据模型和分层名称空间

ZooKeeper 提供的名称空间与标准文件系统的名称空间非常相似。名称是由斜杠(/)分隔的一系列路径元素。 ZooKeeper 名称空间中的每个节点都由路径标识。

ZooKeeper 的层次命名空间

ZooKeeper 的层次命名空间

节点和临时节点

与标准文件系统不同,ZooKeeper 命名空间中的每个节点都可以具有与其关联的数据以及子节点。就像拥有一个文件系统一样,该文件系统也允许文件成为目录。 (ZooKeeper 旨在存储协调数据:状态信息,配置,位置信息等,因此存储在每个节点上的数据通常很小,在字节到千字节范围内.)我们使用术语* znode *来使之清晰我们在谈论 ZooKeeper 数据节点。

Znodes 维护一个统计信息结构,其中包括用于数据更改,ACL 更改和时间戳的版本号,以允许进行缓存验证和协调更新。 znode 的数据每次更改时,版本号都会增加。例如,每当 Client 端检索数据时,它也会接收数据的版本。

原子地读取和写入存储在名称空间中每个 znode 上的数据。读取将获取与 znode 关联的所有数据字节,而写入将替换所有数据。每个节点都有一个访问控制列表(ACL),用于限制谁可以做什么。

ZooKeeper 还具有短暂节点的概念。只要创建 znode 的会话处于活动状态,这些 znode 就存在。会话结束时,将删除 znode。

有条件的更新和观看

ZooKeeper 支持* watches *的概念。Client 端可以在 znode 上设置手表。 znode 更改时,将触发并删除监视。触发监视后,Client 端会收到一个数据包,说明 znode 已更改。如果 Client 端与 ZooKeeper 服务器之一之间的连接断开,则 Client 端将收到本地通知。

Guarantees

ZooKeeper 非常快速且非常简单。但是,由于其目标是作为构建更复杂的服务(例如同步)的基础,因此它提供了一组保证。这些是:

  • Sequences 一致性-来自 Client 端的更新将按照发送的 Sequences 应用。

  • 原子性-更新成功或失败。没有部分结果。

  • 单个系统映像-无论 Client 端连接到哪个服务器,Client 端都将看到相同的服务视图。

  • 可靠性-应用更新后,此更新将一直持续到 Client 端覆盖更新为止。

  • 及时性-确保系统的 Client 视图在特定时间范围内是最新的。

Simple API

ZooKeeper 的设计目标之一是提供一个非常简单的编程界面。因此,它仅支持以下操作:

    • create *:在树中的某个位置创建一个节点
    • delete *:删除节点
    • exists *:测试某个位置是否存在节点
  • 获取数据:从节点读取数据

  • 设置数据:将数据写入节点

    • get children *:检索节点的子代列表
    • sync *:await 数据传播

Implementation

ZooKeeper Components显示了 ZooKeeper 服务的高级组件。除请求处理器外,构成 ZooKeeper 服务的每个服务器都复制其自己的每个组件副本。

ZooKeeper Components

复制的数据库是包含整个数据树的内存数据库。更新会记录到磁盘以确保可恢复性,并且在将写入应用于内存数据库之前,会将写入序列化到磁盘。

每个 ZooKeeper 服务器都为 Client 端提供服务。Client 端仅连接到一台服务器即可提交请求。读取请求从每个服务器数据库的本地副本提供服务。更改服务状态的请求(写请求)由协议协议处理。

作为协议协议的一部分,来自 Client 端的所有写请求都转发到称为* leader 的单个服务器。其余的 ZooKeeper 服务器(称为 followers *)从领导者那里接收消息建议并同意消息传递。消息传递层负责替换失败者的领导者,并将跟随者与领导者同步。

ZooKeeper 使用自定义的原子消息传递协议。由于消息传递层是原子层,因此 ZooKeeper 可以保证本地副本永远不会发散。领导者收到写请求时,它将计算要应用写操作时系统的状态,并将其转换为捕获此新状态的事务。

Uses

ZooKeeper 的编程接口刻意简单。但是,使用它,您可以实现更高阶的操作,例如同步 Primitives,组成员身份,所有权等。

Performance

ZooKeeper 被设计为具有高性能。但是吗? Yahoo!的 ZooKeeper 开发团队的结果。研究表明确实如此。 (请参阅ZooKeeper 吞吐量随读写比率的变化而变化。)在读取数量超过写入数量的应用程序中,由于写入涉及同步所有服务器的状态,因此该性能尤其出色。 (对于协调服务,通常情况下,读取数多于写入数.)

ZooKeeper 吞吐量随读写比率的变化而变化

ZooKeeper 吞吐量随读写比率的变化而变化是运行在具有双 2Ghz Xeon 和两个 SATA 15K RPM 驱动器的服务器上的 ZooKeeper 3.2 版的吞吐量图。一个驱动器用作专用的 ZooKeeper 日志设备。快照已写入 OS 驱动器。写请求是 1K 写,读是 1K 读。 “服务器”指示 ZooKeeper 集合的大小,以及构成该服务的服务器的数量。大约还有 30 台其他服务器用于模拟 Client 端。 ZooKeeper 集成配置为使得领导者不允许来自 Client 端的连接。

Note

Note

先前的 3.1 版本相比,在 3.2 版中 r/w 性能提高了约 2 倍。

基准还表明它也是可靠的。 存在错误时的可靠性显示了部署如何响应各种故障。图中标记的事件如下:

  • 追随者的失败和恢复

  • 失败和其他追随者的恢复

  • 领导者的失败

  • 两个追随者的失败和恢复

  • 另一个领导者的失败

Reliability

为了显示随着故障注入系统随时间变化的行为,我们运行了由 7 台机器组成的 ZooKeeper 服务。我们使用与以前相同的饱和度基准,但是这次我们将写入百分比保持在恒定的 30%,这是我们预期工作量的保守比率。

存在错误时的可靠性

该图有一些重要的发现。首先,如果关注者失败并迅速恢复,则 ZooKeeper 能够在失败的情况下维持高吞吐量。但是,也许更重要的是,领导者选举算法允许系统恢复得足够快,以防止吞吐量大幅下降。根据我们的观察,ZooKeeper 只需不到 200 毫秒即可选出新的领导者。第三,随着关注者的恢复,ZooKeeper 能够在开始处理请求后再次提高吞吐量。

ZooKeeper 项目

ZooKeeper 在许多工业应用中已达到successfully used。它用于 Yahoo!作为 Yahoo!的协调和故障恢复服务 Message Broker 是一个高度可扩展的发布-订阅系统,Management 上千个主题以进行复制和数据传递。 Yahoo!的提取服务使用它。搜寻器,它还 Management 故障恢复。一些雅虎!广告系统还使用 ZooKeeper 实施可靠的服务。

鼓励所有用户和开发人员加入社区并贡献他们的专业知识。有关更多信息,请参见Apache 上的 Zookeeper 项目