zookeeper介绍

The Zookeeper data modelhtml

  Zookeeper有一个树形的namespace,就像分布式文件系统同样,惟一区别就是这个namespace包括其子节点能够有关联的数据。就像文件系统容许有文件或者文件夹同样。节点的路径一般用绝对的,带/分隔的字符串表示。任何字符串均可以被使用除了下面所列举的内容:node

  ·The null character (\u0000) cannot be part of a path name. (This causes problems with the C binding.)git

  ·The following characters can't be used because they don't display well, or render in confusing ways: \u0001 - \u0019 and \u007F - \u009F.数据库

  ·The following characters are not allowed: \ud800 -uF8FFF, \uFFF0-uFFFF, \uXFFFE - \uXFFFF (where X is a digit 1 - E), \uF0000 - \uFFFFF.apache

  ·The "." character can be used as part of another name, but "." and ".." cannot alone be used to indicate a node along a path, because ZooKeeper doesn't use relative paths. The following would be invalid: "/a/b/./c" or "/a/b/../c".编程

  ·The token "zookeeper" is reserved.缓存

Znodes

  Zookeeper中全部的node都是指znode,znode维护了一个状态结构,包括data change,acl change,时间戳,version,version对应的时间戳,帮助zookeeper验证缓存,协助更新。Znode的data发生change,version增长。当客户端查找data也会同时接收到data的version。当客户端更新或者删除某一version的data时,也必须提供data的version。当data和version不匹配,则这次操做失败(失败后的处理可被重写)安全

Znodes是主要的编程入口,下面是几个有价值的内容:网络

Watchessession

  客户端能够在znodes上设置watches,改变znode的触发watch的机制和清楚watch。当一个watch触发,zookeeper会发送一个消息给客户端。相关链接为

http://zookeeper.apache.org/doc/r3.4.6/zookeeperProgrammers.html#ch_zkWatches

Data Access

  在每一个znode的namespace下,数据被自动的读和写。读操做能够获取znode全部相关的data bytes,写操做会替换全部的data。每一个node都有一个access contril list(ACL)来制约谁有使用权。

Zookeeper不是被设计成一个通用的数据库或者很大的对象存储。推荐用作管理协调性的data。Data的来源能够是in the form of configuration,status information,rendezvous,etc.由于这些东西比较小,以kb计量。Zookeeper的client和server确保znodes的data小于1M,而且data平均应该小于1M。大量数据会在网络和存储上消耗时间,从而影响性能。大量数据应该被存在hdfs上,zookeeper上存的是数据的路径等配置。

Ephemeral Node

  Zookeeper也有临时node的概念,这些znodes只会在session活着的时候存在。所以ephemeral node也不容许有子节点。

Sequence Nodes – Unique Naming

  当你create一个node同时你能够要求zookeeper在path后面增长一个单调增长的计数,这个计数是惟一的。计数是10位数大小。超过2147483647会溢出

 

 

Time in Zookeeper

 

Zxid

 

  每一个对zookeeper state的change都会有一个印记,zxid(zookeeper transaction id),zxid说明了zookeeper全部版本的change,zxid越小,发生的越早

 

Version number

 

  每一个对node的change都会对node的一个version number增长。

 

有三个version,分别是version(number of changes to the data of a znode),cversion(number of changes to the children of a znode),aversion(number of changes to the ACL of a znode)

 

Ticks

 

  当使用多servers的zookeeper,servers用ticks定义关于时间的事件,例如status uploads,session timeout,connection timeout between peers.

 

Real time

 

  Zookeeper不适用实时时间或者时钟,而是在stat structure里加时间戳。

 

Zookeeeper stat structure

Stat structure由如下组成

cxid

  形成zxid变化的znode建立

mzxid

  在这个znode中最后被修改的zxid

ctime

  这个znode被建立的毫秒级时间戳

mtime

  这个znode最后被修改的时间

version

  这个node的change次数

cversion

  这个znode的子节点的change次数

aversion

  这个znode的ACL的change次数

ephemeralOwner

  若是这个znode是Ephemeral node,则为session id,不然就是0

dataLength

  这个znode的data fields的长度

numChildren

  这个znode的子节点数量

 

Zookeeper session

  一个zookeeper的client经过用语言绑定create handle创建一个和zookeeper service相连的session。一旦建立,handle开始是connection状态,客户端的库尝试链接zookeeper servers的其中一个,直到状态切换成connected。通常的操做只有connection和connected两个状态。如何有一格不可被恢复的错误发生,好比session到期或者权限校验失败,或者application 已经关闭了handle,handle会把状态却换成closed。下图说明了zookeeper的client的状态转换。

     

  Zookeeper的client会在设置的servers中任意挑选一个链接,若是链接失败了,client会尝试用另外一个servers去链接,直到链接创建。

当client从zookeeper service中得到handle,zookeeper会建立一个zookeeper session,用一个64位数表示,并分配给client。当client链接到不一样的zookeeper servers,在链接握手中会带入session id。在有安全措施的状况下,server会为session id建立一个全部zookeeper server都承认的password。这个password在client创建session的过程当中会和session id一块儿发送给client。当client从新和新的servers创建链接的时候,须要把session id和password一块儿发送servers。

 

Zookeeper Watches

全部的读操做,例如getData(),getChildren(),exits(),都有一个设置watch的选项。Zookeeper的watch的定义是,one-time trigger,当dataq发生change发送给设置watch的client,下面是三个关键点:

One-time trigger

  当client设置了watch,例如getData(“/znode”,true),以后这个data被change了,那watch会接收到一次事件,若是这个data再次被change,则watch不会再接收到事件,除非client再设置getData(“/znode”,true)

Sent to the client

  Change事件会发送给client,可是不必定在修改或者初始化change返回成功代码以前到达。Watches都是被异步发送给watcher。Zookeeper提供了一个顺序保证:client不会知道一个watch的change直到client第一次知道watch事件。保证了不一样client看到的东西的顺序都是一致性的

The data for which the watch was set

  Zookeeper维护了两种watches,data watches和child watches。getData(),exists()是用来设置data watches,getChildren()是用来设置child watches。

只有一种状况下,watch会丢失:一个还没存在的znode在disconnected状态下的建立和删除。

 

参考资料:

//官网的介绍

http://zookeeper.apache.org/doc/r3.4.6/zookeeperProgrammers.html#ch_zkSessions

 

PS

下方是我我的订阅号,会一直更新各种技术文章,欢迎关注  :)

相关文章
相关标签/搜索