ZooKeeper是一种用于分布式应用程序的分布式开源协调服务。它提供了一些简单的源函数,分布式应用程序能够调用这些源函数,以实现更高级别的服务,能够实现同步、配置文件维护以及分组和命名。它被设计为易于编程,并使用相似文件系统目录树结构的数据模型。它使用java实现,里面也能够调用C语言。java
ZooKeeper's Hierarchical Namespace
node
节点和临时节点
ZooKeeper中使用术语znode表示数据节点。与标准文件系统不一样,ZooKeeper命名空间中的每一个节点均可以包含与之关联的数据以及子项。就像一个容许文件也是目录的文件系统。(zookeeper的设计是用来保存协调数据,好比状态信息、配置信息、本地信息等,一般存储在一个节点上的数据都比较小,处于byte到kb之间。)算法
Znodes维护一个stat结构,其中包括数据更改,ACL更改和时间戳的版本号,以容许缓存验证和协调更新。每次znode的数据更改时,版本号会自增。例如,每当客户端检索数据时,它也接收数据的版本号。数据库
存储在命名空间中每一个znode的数据的读取和写入是原子性的。znode关联的全部数据的读取,写入替换全部的数据。每一个节点都有一个访问控制列表(ACL),限制谁能够作什么。编程
ZooKeeper也有临时节点的概念。只要建立znode的会话处于活动状态,就会存在这些znode。会话结束时,znode将被删除。当您想要实现[tbd]时,临时节点颇有用。缓存
有条件的更新和监听。
Zookeeper支持监听。Client能够设置监听指定的znode。当znode更改时,将触发并删除watch。当触发watch时,Client会收到一个数据包,说明znode已更改。若是Client与其中一个ZK服务之间的链接中断,Client将收到本地通知,这些能够用于[tbd]。服务器
担保
ZooKeeper很是快速并且很是简单。可是,因为其目标是构建更复杂的服务(如同步)的基础,所以它提供了一系列保证。这些是:分布式
简单的API
ZooKeeper的设计目标之一是提供一个很是简单的编程接口。所以,它仅支持如下操做:函数
实现原理
下图显示ZooKeeper的高级组件。
ZooKeeper Components
性能
复制数据库是包含整个数据树的内存数据库。将更新记录到磁盘以得到可恢复性,而且写入的数据在应用于内存数据库以前会序列化到磁盘。
每一个ZooKeeper服务器都为客户端服务。客户端只链接到一台服务器提交请求,读取请求由每一个服务器数据库的本地副本提供服务。更改状态的服务请求,写请求,由agreement协议处理。
做为agreement协议的一部分,来自客户端的全部写入请求都被转发到Leader服务器。其他的ZooKeeper服务器(fllowers)接收来自Leader的消息提议并赞成消息传递。消息传递层负责Leader更新失败时,同步Fllowers和Leader。
ZooKeeper使用自定义原子消息传递协议。因为消息传递层是原子的,所以ZooKeeper能够保证本地副本永远不会出现误差。当领导者收到写入请求时,它会查看写入并被应用到内存数据库时的系统状态,并在一个事务中更改状态为新状态。
性能表现
图中数据为910个Client去发请求,横轴为读请求在全部请求中的占比,纵轴为服务吞吐量。读请求和写请求的数据量都是1KB。servers表示ZK集群大小,即ZooKeeper的服务器数量。大约30个Client,其中ZooKeeper的Lwader节点不容许Client链接。
在读取数量超过写入的应用程序中,它的性能尤为高,由于写入涉及同步全部服务器的状态。
可靠性
为了在注入故障时显示系统随时间的行为,咱们运行了由7台机器组成的ZooKeeper集群服务。咱们运行与之前相同的饱和度基准,但此次咱们将写入百分比保持在恒定的30%,这是咱们预期工做量的保守比率。
在请求失败时,可以成功的响应,图中标记的错误事件以下:
①fllower的宕机和恢复
②另外一个fllower的宕机和恢复
③一个leader的宕机
④两个fllower的宕机和恢复
⑤另外一个leader的宕机
观察图中的数据能够获得,首先看fllower宕机并迅速恢复,即便fllower宕机,ZooKeeper也可以维持高吞吐量。也许更重要的是,leader选举算法容许系统足够快地恢复以防止吞吐量大幅降低。咱们能够看到,ZooKeeper选择新leader的时间不到200毫秒。随着fllower的恢复,ZooKeeper可以在新fllower开始处理请求后再次提升吞吐量。
转载请注明出处:https://www.cnblogs.com/zooqkl