15.1 ZooKeeper简介

ZooKeeper是一个为分布式应用所设计的开源协调服务。它可以为用户提供同步、配置管理、分组和命名等服务。用户可以使用ZooKeeper提供的接口方便地实现一致性、组管理、leader选举及某些协议。ZooKeeper意欲提供一个易于编程的环境,所以它的文件系统使用了我们所熟悉的目录树结构。ZooKeeper是使用Java编写的,但是它支持Java和C两种编程语言接口。

众所周知,协调服务非常容易出错,而且很难从故障中恢复,例如,协调服务很容易处于竞态以至于出现死锁。ZooKeeper的设计目的是为了减轻分布式应用程序所承担的协调任务。

15.1.1 ZooKeeper的设计目标

众所周知,分布式环境下的程序和活动为了达到协调一致的目的,通常具有某些共同的特点,例如,简单性、有序性等。ZooKeeper不但在这些目标的实现上有自身的特点,并且具有其独特的优势。下面我们将简述ZooKeeper的设计目标。

(1)简单化

ZooKeeper允许分布式的进程通过共享体系的命名空间来进行协调,这个命名空间的组织与标准的文件系统非常相似,它是由一些数据寄存器组成的。用ZooKeeper的语法来说,这些寄存器应称为Znode,它们和文件及目录非常相似。典型的文件系统是基于存储设备的,然而,ZooKeeper的数据却是存放在内存当中的,这就意味着ZooKeeper可以达到一个高的吞吐量,并且低延迟。ZooKeeper的实现非常重视高性能、高可靠性,以及严格的有序访问。

ZooKeeper性能上的特点决定了它能够用在大型的、分布式的系统当中。从可靠性方面来说,它并不会因为一个节点的错误而崩溃。除此之外,它严格的序列访问控制意味着复杂的控制原语可以应用在客户端上。

(2)健壮性

组成ZooKeeper服务的服务器必须互相知道其他服务器的存在。它们维护着一个处于内存中的状态镜像,以及一个位于存储器中的交换日志和快照。只要大部分的服务器可用,那么ZooKeeper服务就可用。

如果客户端连接到单个ZooKeeper服务器上,那么这个客户端就管理着一个TCP连接,并且通过这个TCP连接来发送请求、获得响应、获取检测事件,以及发送心跳。如果连接到服务器上的TCP连接断开,客户端将连接到其他的服务器上。

(3)有序性

ZooKeeper可以为每一次更新操作赋予一个版本号,并且此版本号是全局有序的,不存在重复的情况。ZooKeeper所提供的很多服务也是基于此有序性的特点来完成。

(4)速度优势

它在读取主要负载时尤其快。ZooKeeper应用程序在上千台机器的节点上运行。另外,需要注意的是ZooKeeper有这样一个特点:当读工作比写工作更多的时候,它执行的性能会更好。

除此之外,ZooKeeper还具有原子性、单系统镜像、可靠性的及时效性等特点。