(一)Zookeeper简介

Apache ZooKeeper致力于开发和维护开源服务器,以实现高度可靠的分布式协调。

ZooKeeper是一种集中服务,提供配置信息维护、命名、分布式同步、组服务等功能。所有这些类型的服务都以某种形式被分布式应用程序使用。每次实现时,都需要做大量的工作来修复不可避免的bug和竞争条件。由于实现这类服务的困难,应用程序最初通常对它们精打细计算,这使得它们在出现更改时变得脆弱,难以管理。即使操作正确,这些服务的不同实现在部署应用程序时也会导致管理复杂性。

ZooKeeper:因为协调分布式系统就是一个动物园
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的等级名称空间如下:
在这里插入图片描述

节点和临时节点

与标准文件系统不同,ZooKeeper名称空间中的每个节点都可以拥有与其关联的数据以及子节点。这就像文件系统允许文件同时也是目录一样。(ZooKeeper被设计用来存储协调数据:状态信息、配置信息、位置信息等,所以存储在每个节点上的数据通常很小,在字节到千字节的范围内。)我们使用术语znode来明确我们谈论的是ZooKeeper数据节点。

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

存储在名称空间中每个znode上的数据是自动读写的。读操作获取与znode关联的所有数据字节,写操作替换所有数据。每个节点都有一个访问控制列表(Access Control List, ACL)来限制谁可以做什么。

ZooKeeper也有临时节点的概念。只要创建znode的会话是活动的,这些znode就会存在。当会话结束时,删除znode。

条件更新和观察

ZooKeeper支持观察者的概念。客户端可以在znode上设置一个监视。当znode改变时一个监视就会触发并移除。当监听被触发时,客户端接收到一个包,该包表示znode已经更改。如果客户端与其中一个ZooKeeper服务器之间的连接中断,客户端将收到一个本地通知。

3.6.0新改变:客户端还可以在znode上设置永久的、递归的监视,这些监视在被触发时不会被删除,并递归地触发注册znode以及任何子znode上的更改。

保障

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

  • 连续一致性——来自客户端的更新将按照发送的顺序应用。
  • 原子性——更新成功或失败。没有部分结果。
  • 单一系统映像——无论客户端连接到哪个服务器,它都将看到相同的服务视图。也就是说,即使客户端故障转移到具有相同会话的不同服务器,客户端也不会看到系统的旧视图。
  • 可靠性——一旦应用了更新,它将从那时起持续存在,直到客户端覆盖更新。
  • 及时性——保证系统的客户端视图在一定时间范围内是最新的。

简单API

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

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

实现

ZooKeeper服务的高级组件为“ZooKeeper Components”。除了请求处理器之外,组成ZooKeeper服务的每个服务器都复制每个组件的自己的副本。
在这里插入图片描述
复制的数据库是包含整个数据树的内存数据库。更新被记录到磁盘以实现可恢复性,写入操作在应用到内存数据库之前被序列化到磁盘。

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

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

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

使用

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

性能

ZooKeeper的设计是高性能的。但真的是这样吗?ZooKeeper的开发团队在Yahoo!研究表明确实如此。(根据读写比率的变化,请参见ZooKeeper吞吐量。)在读的数量超过写的应用程序中,它的性能尤其高,因为写涉及同步所有服务器的状态。(对于协调服务来说,读取的数量通常超过写入的数量。)
在这里插入图片描述
随着读写比率的变化,ZooKeeper的吞吐量是ZooKeeper 3.2版本运行在双2Ghz Xeon和两个SATA 15K RPM驱动器上的吞吐量图。其中一个驱动器用作ZooKeeper日志专用设备。快照被写入操作系统驱动器。写请求为1K写,读请求为1K读。“Servers”表示ZooKeeper集群的大小,即组成该服务的服务器数量。大约使用了30个其他服务器来模拟客户机。ZooKeeper集成被配置为不允许来自客户端的连接。
注:在3.2版本中,r/w性能比之前的3.1版本提高了约2倍。

基准测试也表明它是可靠的。存在错误时的可靠性显示了部署如何响应各种故障。图中标注的事件如下:
1、跟随者的故障和恢复
2、另一个跟随者的失败和恢复
3、领导者的失败
4、两个跟随者的失败和恢复
5、另一位领导者的失败

可靠性

为了显示系统在注入故障时的行为,我们运行了一个由7台机器组成的ZooKeeper服务。我们运行了与之前相同的饱和基准测试,但这次我们将写入百分比保持在30%,这是我们预期工作负载的保守比率。
在这里插入图片描述
从这个图表中有一些重要的观察结果。首先,如果追随者失败并快速恢复,那么ZooKeeper能够维持高吞吐量,尽管失败。但也许更重要的是,leader选举算法允许系统快速恢复,以防止吞吐量大幅下降。在我们的观察中,ZooKeeper只需要不到200ms的时间就可以选出一个新的leader。第三,随着追随者恢复,一旦他们开始处理请求,ZooKeeper能够再次提高吞吐量。

ZooKeeper 项目

ZooKeeper已经成功应用于许多工业领域。它被用在雅虎!作为雅虎的协调和故障恢复服务!Message Broker是一个高度可伸缩的发布-订阅系统,管理数千个用于复制和数据传递的主题。它被雅虎的抓取服务使用!爬虫,它也管理故障恢复。一些雅虎!广告系统也使用ZooKeeper来实现可靠的服务。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逆天至尊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值