Zookeeper简介

 

 

ZooKeeper:是对分布式应用来说的一种分布协同服务

ZooKeeper是一个对分布式应用来说的分布式的,开源的协同服务。ZooKeeper暴漏一些简单的函数,分布式应用可以基于这些简单的函数来构建更高级的服务,例如:同步,配置维护,组,命名等等。ZooKeeper运行在Java环境中。

协同服务很难实现,很容易产生错误,例如:race condition和deadlock。ZooKeeper的动力是为了减少分布式应用实现协同服务的责任。

设计目标

  • ZooKeeper是简单。Zookeeper通过一个共享的层级命名空间使分布式应用协同工作,这个共享的层级命名空间类似于一个标准的文件系统。命名空间由znodes组成,znodes类似于文件和目录。但是不像标准的文件系统,标准的文件系统主要用于存储,而ZooKeeper数据保存在内存中,所以ZooKeeper具有高吞吐量和低延迟。

    ZooKeeper在3个方面做了优化:高性能,高可用性,严格的顺序访问。ZooKeeper的高性能是可以使用在大的分布式系统上,ZooKeeper的高可用性是可以单节点故障,ZooKeeper的严格顺序是复杂的同步函数可以在客户端实现。
  • Zookeeper是可复制的。像它协同的分布式应用一样,ZooKeeper在一些hosts上是可复制的,叫做ensemble。

    组成ZooKeeper服务的servers必须相互知道,他们维护一个内存的状态镜像和一个持久化的transaction logs和snapshots。只要大部分servers可用,ZooKeeper就可以使用。

    客户端连接到一个ZooKeeper server。客户端维护一个TCP连接,通过这个TCP连接sends request, get responses, gets watch events, send heart beats。如果连接server的TCP连接断开,客户端将会连接到不同的server。
  • ZooKeeper是有序的。ZooKeeper用数字来记录每一次的改变,来映射ZooKeeper transactions的顺序。接下来的操作将会使用这个顺序来实现更高级的接口。例如,同步函数。
  • ZooKeeper是非常快的。ZooKeeper尤其对读来说是相当快的。ZooKeeper应用可以运行在成千上万台机器上。当读比写更频繁时,性能会更好。读写比例大概是10:1

数据模型和层级命名空间

 ZooKeeper的命名空间类似于一个标准的文件系统。在ZooKeeper命名空间中的每个node由路径来标识。

Nodes和ephemeral nodes

不像标准的文件系统,在ZooKeeper命名空间中的每个node会有data和children关联它。(ZooKeeper主要用来存储协同数据:状态信息,配置信息,位置信息等等,所以存在每个node的数据是相当小的,从byte到kilobyte的范围)

Znodes管理一个结构,包含数据改变的版本号,ACL改变的版本号和一个时间戳。是为了使缓存有效和协同的修改。当znode的数据改变时,版本号会增加。例如,当客户端获取数据时,也将会获取数据的版本号。

在命名空间中的每个znode的数据读写都是原子性的。读将会得到那个znode的所有数据,写将会替换所有的数据。每个node有ACL(Access Control List),这样用来限制权限。

ZooKeeper也会有一个ephemeral nodes的概念。当创建znode的session是active的时候,这些znodes是存在的。当session结束时,这些znode将会删除。当你想要实现[tbd]的时候,Ephemeral nodes是非常有用的。

Conditional updates and watches

ZooKeeper支持watches的概念,客户端会在znode上设置一个watch,当znode修改的时候,一个watch将会触发和删除。当一个watch触发的时候,客户端将会一个packet,说znode已经修改了。如果客户端和Zookeeper servers的一个server已经断开,那么客户端将会收到一个本地的通知。

Guarantees

ZooKeeper是非常快和简单的。它的作用是为了构建更加复杂的服务而作为基石,例如,同步。它也提供一些保证

  • 顺序的一致性。来自客户端的修改会是发送的顺序
  • 原子性。修改要么成功,要么失败,并不会产生部分结果
  • 单个的系统镜像。客户端将会看到相同的服务视图。不管怎样连接到那个server。
  • 可靠性。只要修改发生,将会持久化到那一刻。直到客户端再次修改它
  • 时效性。在一定的时间范围内,保证客户端与服务器是最新的状态

Simple API

ZooKeeper设计的目的是为了提供简单的编程接口。因此,它仅仅提供这些操作:

create:在一个location中创建一个node

delete:删除一个node

exists:检测一个node是否存在在一个location

get data:从一个node中读取数据

set data:写数据到一个node上

get children:获取一个node的所有children

sync:等待数据传播

Implementation

ZooKeeper Components显示高级的ZooKeeper服务组件。除了request processor之外。组成ZooKeeper服务的每个servers都会有每个组件的copy。

replicated database是一个内存数据库,包含完整的数据结构。修改将会记录到磁盘上,为了可恢复。当进行写操作的时候,在应用到内存数据库之前,也会序列化到磁盘上的。

客户端只会连接到一个server用来提交请求。读请求来自于每个服务数据库的本次复制,而修改服务状态的请求,写请求由一个agreement protocol来处理。

由于agreement protocol,来自客户端的所有写请求将会跳转到单的server,这个server叫做leader。剩下的其他ZooKeeper servers叫做followers。

ZooKeeper使用一个原子性的消息协议。因为消息层是原子性的。ZooKeeper保证本地的复制并不会偏移。当leader收到一个写请求时,它会计算系统的状态是什么。

Uses

ZooKeeper的编程接口相当简单。使用这些接口,你可以实现更高级的操作,例如:synchronizations primitives,group membership, ownership等等。

 

下节探索:ZooKeeper Performance and Reliability参考url:https://zookeeper.apache.org/doc/trunk/zookeeperOver.html

 

posted @ 2017-02-04 15:16  峰峰仔  阅读(182)  评论(0编辑  收藏  举报