ZooKeeper官方概述

前言

本文内容来自ZooKeeper官网。个人进行整理和翻译。

简介

Apache ZooKeeper 是一个开发和维护开源服务器的项目,它支持高度可靠的分布式协调。

ZooKeeper 是一个用于维护配置信息、命名、提供分布式同步和提供组服务的集中服务。所有这些类型的服务都以某种形式被分布式应用程序所使用。每次实现它们时,都会不可避免的有大量的工作用于修复 bug 和竞争条件。由于实现这些类型的服务很困难,应用程序在开始时通常会缩减这些服务,这使得它们在出现改变时变得脆弱和难以管理。即使正确地执行,在部署应用程序时,这些服务的不同实现也会导致管理复杂性。

ZooKeeper 是一个面向分布式应用程序的高性能协调服务。他在一个简单接口中暴露了通用服务——例如命名、配置管理、同步和组服务,这样你就不必从头开始编写它们。您可以使用它来实现共识、组管理、领导者选举和存在协议。你可以根据自己的特殊需要,在此基础上进行构建。

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

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

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

设计目标

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

    ZooKeeper 实现非常重视高性能、高可用、严格有序的访问。 ZooKeeper 的性能方面意味着它可以用于大型分布式系统。 可靠性方面使其不会成为单点故障。 严格的排序意味着可以在客户端实现复杂的同步原语。

  • ZooKeeper 可复制。 就像它协调的分布式进程一样,ZooKeeper 本身旨在通过一组称为集合的主机进行复制。

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

在这里插入图片描述

客户端连接到单个 ZooKeeper 服务器。 客户端维护一个 TCP 连接,通过它发送请求、获取响应、获取监视事件和发送心跳。 如果与服务器的 TCP 连接中断,客户端将连接到不同的服务器。

  • ZooKeeper 是有序的。 ZooKeeper每次都更新数字标记来反映所有ZooKeeper事务的顺序。 后续操作可以使用顺序来实现更高级别的抽象,例如同步原语。

  • ZooKeeper 速度很快。 它在“读取主导”工作负载中特别快。 ZooKeeper 应用程序在数千台机器上运行,它在读取比写入更常见的情况下表现最佳,比率约为 10:1。

数据模型和分层命名空间

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

ZooKeeper 的分层命名空间

zk分层命名空间

节点和临时节点

与标准文件系统不同,ZooKeeper命名空间中的每个节点都可以具有与它相关的数据以及子项。它就一个文件系统拥有允许既是文件也是目录的功能。(Zookeeper被设计为存储协调数据:状态信息,配置,位置信息等,因此存储在每个节点上的数据通常很小,在字节到千字节范围内。)我们使用术语Znode来明确表示我们正在谈论zookeeper数据节点。

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

以原子读取和写入在命名空间中存储在每个Znode处的数据。读取获取与znode关联的所有数据字节,并且写入替换所有数据。每个节点都有一个访问控制列表(ACL),其限制谁可以做什么。

Zookeeper还具有临时节点的概念。这些Znodes只存在于创建Znode的会话处于活动状态。当会话结束时,删除znode。

注:当前会话的临时节点在会话结束前,全局可看。

条件更新和watches

Zookeeper支持watches的概念。客户可以在Znode上设置watch。当Znode更改时,将触发并删除watch。当触发watch时,客户端收到一个数据包,说Znode已更改。如果客户端和一个Zookeeper服务器之间的连接被损坏,则客户端将接收本地通知。

3.6.0中的新增功能:客户端也可以在znode设置不会在触发时删除的永久的,递归的watches,并且会递归地对已注册的znode和他的r任何子znode的变更触发。

保证

Zookeeper非常快,非常简单。但是,它的目标是成为建造更复杂的服务的基础,例如同步,它提供了一套保证。这些是:

  • 顺序一致性 —— 客户端的更新将按照他们发送的顺序应用。

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

  • 单个系统映像 —— 客户端将通过服务看到相同的视图,不管它是否与该服务相连。即,即使客户端故障转义与其他服务器建立会话,客户端也不会看到系统的较旧视图。

  • 可靠性 —— 一旦应用了更新,它将从那时起持续向前,直到客户端覆盖更新。

  • 及时性 —— 系统的客户视图保证在一定时间内最新。

简单的API

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

  • create : 在树的某个位置创建一个节点
  • delete : 删除节点
  • exists : 测试节点是否存在于某个位置
  • get data : 从节点读取数据
  • set data : 向节点写入数据
  • get children : 获取节点的子节点列表
  • sync : 等待数据传播

实现

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

zk components
复制的数据库是包含整个数据树的内存数据库。更新被记录到磁盘以实现可恢复性,写入操作在应用到内存数据库之前被序列化到磁盘。

每个ZooKeeper服务器都为客户端服务。客户端精确地连接到一个服务器来提交请求。读请求从每个服务器数据库的本地副本获得服务。更改服务状态、写请求的请求由协议协议处理。

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

ZooKeeper使用自定义的原子消息传递协议。由于消息传递层是原子的,所以ZooKeeper可以保证本地副本永远不会分离。当leader接收到写请求时,它计算系统在应用写时的状态,并将其转换为捕获这个新状态的事务。

使用

ZooKeeper的编程接口是故意简化的。然而,使用它,您可以实现更高阶的操作,如同步原语、组成员关系、所有权等。

表现

ZooKeeper的设计是高性能的。但真的是这样吗?ZooKeeper的开发团队在Yahoo!研究表明确实如此。(请参见ZooKeeper的吞吐量随着读写比的变化。)在读的数量超过写的应用程序中,它的性能尤其高,因为写涉及同步所有服务器的状态。(对于协调服务来说,读取的数量通常超过写入的数量。)

吞吐量图

ZooKeeper的吞吐量随着读写比的变化是Zookeeper 3.2版本运行在双2 Ghz Xeon 和 2个 SATA 15K RPM驱动其的吞吐量图。其中一个驱动器用作ZooKeeper日志专用设备。快照被写入操作系统驱动器。写请求为1K写,读请求为1K读。“Servers”表示ZooKeeper集群的大小,即组成该服务的服务器数量。大约使用了30个其他服务器来模拟客户机。ZooKeeper集群被配置为leaders不允许被其他客户端连接。

注意

在3.2版本中,读写表现比以前的3.1版本提高约2倍。

基准测试也表明它是可靠的存在错误的可靠性 演示部署如何响应各种故障。图中标记的事件如下所示

  1. 失败和恢复follower
  2. 失败和回复其他follower
  3. leader失败
  4. 2个followers的失败与恢复
  5. 其他leader的失败

可靠性

为了显示系统随着时间推移在注入故障的行为,我们运行了由7台机器组成的ZooKeeper服务。
,我们以也跑过相同情况的基准测试,但这次我们将写入百分比保持在持续30%,这是我们预期工作负载的保守比率。

随着时间变化的故障表现

这张图表中有一些重要的观察结果。首先,如果follwers失败并迅速恢复,那么尽管失败了,ZooKeeper 仍然能够维持高吞吐量。但也许更重要的是,leader选举算法允许系统足够快地恢复以防止吞吐量大幅下降。根据我们的观察,ZooKeeper 只需要不到200毫秒就能选出一个新的领导者。第三,随着追随者恢复,ZooKeeper 一旦开始处理请求,就能够再次提高吞吐量。

ZooKeeper项目

ZooKeeper 已[成功地应用](successfully used于许多工业领域。它被雅虎用作 yahoo! Message Broker 的协调和故障恢复服务,yahoo! Message Broker 是一个高度可扩展的发布-订阅系统,管理数以千计的复制和数据传输主题。它被雅虎抓取程序的抓取服务使用,在那里它也管理故障恢复。许多雅虎广告系统也使用 ZooKeeper 来实现可靠的服务。

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


若文章有误,或你有什么见解,欢迎留言指正和交流。
原创不易,若有所帮助,欢迎点赞、收藏。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值