Zookeeper 会维护一个具有层次关系的数据结构,树。Zookeeper 作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储,但是 Zookeeper 并不是用来专门存储数据的,它的作用主要是用来维护和监控你存储的数据的状态变化。每个节点能存大约1M的数据。通过监控这些数据状态的变化,从而可以达到基于数据的集群管理。
每个子目录项如 NameService 都被称作为 znode,这个 znode 是被它所在的路径唯一标识,如 Server1 这个 znode 的标识为 /NameService/Server1。
znode 可以有子节点目录,并且每个 znode 可以存储数据,注意 EPHEMERAL 类型的目录节点不能有子节点目录。
znode 是有版本的,每个 znode 中存储的数据可以有多个版本,也就是一个访问路径中可以存储多份数据。
znode 可以是临时节点,一旦创建这个 znode 的客户端与服务器失去联系,这个 znode 也将自动删除,Zookeeper 的客户端和服务器通信采用长连接方式,每个客户端和服务 器通过心跳来保持连接,这个连接状态称为 session。如果 znode 是临时节点,这个 session 失效,znode 也就删除了。
znode 的目录名可以自动编号,如 App1 已经存在,再创建的话,将会自动命名为 App2。
znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个是 Zookeeper 的核心特性,Zookeeper 的很多功能都是基于这个特性实现的。
getData,getChildren(),exists()这三个方法可以针对参数中的path设置watcher,当path对应的Node 有相应变化时,server端会给对应的设置了watcher的client 发送一个一次性的触发通知事件。客户端在收到这个触发通知事件后,可以根据自己的业务逻辑进行相应地处理。注意这个watcher的功能是一次性的,如果还想继续得到watcher通知,在处理完事件后,要重新register。
CreateMode 标识有四种形式的目录节点,分别是
* PERSISTENT:持久化目录节点,这个目录节点存储的数据不会丢失;
* PERSISTENT_SEQUENTIAL:顺序自动编号的目录节点,这种目录节点会根据当前已近存在的节点数自动加 1,然后返回给客户端已经成功创建的目录节点名;
* EPHEMERAL:临时目录节点,一旦创建这个节点的客户端与服务器端口也就是 session 超时,这种节点会被自动删除;
* EPHEMERAL_SEQUENTIAL:临时自动编号节点 。
acl访问控制列表,新建节点时需要指定,分别是
* CREATOR_ALL_ACL 这个ACL给身份验证id的所有权限
* OPEN_ACL_UNSAFE 完全开放的目录
* READ_ACL_UNSAFE 只读
stat结构 通过Stat stat = zk.exists(path, false);取得。
每一个节点的stat结构由下面的属性构成,均可以get取得,set设置:
czxid 创建这个节点时的变更对应的事务号mzxid 最后修改这个节点的变更对应的事务号
ctime 节点创建时的毫秒数
mtime 节点最后一次修改时的毫秒数
version 节点数据变更的版本号
cversion 节点的子节点变更的版本号
aversion 节点ACL变更的版本号
ephemeralOwner 创建节点的会话id(临时性节点),非临时性节点为0
dataLength 节点数据的长度
numChildren 字节点的数目