[转载请注明做者和原文连接, 若有谬误, 欢迎在评论中指正. ] node
ZooKeeper的数据结构, 与普通的文件系统极为相似. 见下图:git
图片引用自developerworksgithub
图中的每一个节点称为一个znode. 每一个znode由3部分组成:session
- stat. 此为状态信息, 描述该znode的版本, 权限等信息.
- data. 与该znode关联的数据.
- children. 该znode下的子节点.
ZooKeeper命令
在深刻znode的各个部分以前, 首先须要熟悉一些经常使用的ZooKeeper命令.数据结构
链接serverspa
- bin/zkCli.sh -server 10.1.39.43:4180
列出指定node的子node命令行
- [zk: 10.1.39.43:4180(CONNECTED) 9] ls /
- [hello, filesync, zookeeper, xing, server, group, log]
- [zk: 10.1.39.43:4180(CONNECTED) 10] ls /hello
- []
建立znode节点, 并指定关联数据code
- create /hello world
建立节点/hello, 并将字符串"world"关联到该节点中.server
获取znode的数据和状态信息blog
- [zk: 10.1.39.43:4180(CONNECTED) 7] get /hello
- world
- cZxid = 0x10000042c
- ctime = Fri May 17 17:57:33 CST 2013
- mZxid = 0x10000042c
- mtime = Fri May 17 17:57:33 CST 2013
- pZxid = 0x10000042c
- cversion = 0
- dataVersion = 0
- aclVersion = 0
- ephemeralOwner = 0x0
- dataLength = 5
- numChildren = 0
删除znode
- [zk: localhost:4180(CONNECTED) 13] delete /xing/item0000000001
- [zk: localhost:4180(CONNECTED) 14] delete /xing
- Node not empty: /xing
使用delete命令能够删除指定znode. 当该znode拥有子znode时, 必须先删除其全部子znode, 不然操做将失败. rmr命令可用于代替delete命令, rmr是一个递归删除命令, 若是发生指定节点拥有子节点时, rmr命令会首先删除子节点.
znode节点的状态信息
使用get命令获取指定节点的数据时, 同时也将返回该节点的状态信息, 称为Stat. 其包含以下字段:
- czxid. 节点建立时的zxid.
- mzxid. 节点最新一次更新发生时的zxid.
- ctime. 节点建立时的时间戳.
- mtime. 节点最新一次更新发生时的时间戳.
- dataVersion. 节点数据的更新次数.
- cversion. 其子节点的更新次数.
- aclVersion. 节点ACL(受权信息)的更新次数.
- ephemeralOwner. 若是该节点为ephemeral节点, ephemeralOwner值表示与该节点绑定的session id. 若是该节点不是ephemeral节点, ephemeralOwner值为0. 至于什么是ephemeral节点, 请看后面的讲述.
- dataLength. 节点数据的字节数.
- numChildren. 子节点个数.
zxid
znode节点的状态信息中包含czxid和mzxid, 那么什么是zxid呢?
ZooKeeper状态的每一次改变, 都对应着一个递增的Transaction id
, 该id称为zxid. 因为zxid的递增性质, 若是zxid1小于zxid2, 那么zxid1确定先于zxid2发生. 建立任意节点, 或者更新任意节点的数据, 或者删除任意节点, 都会致使Zookeeper状态发生改变, 从而致使zxid的值增长.
session
在client和server通讯以前, 首先须要创建链接, 该链接称为session. 链接创建后, 若是发生链接超时, 受权失败, 或者显式关闭链接, 链接便处于CLOSED状态, 此时session结束.
节点类型
讲述节点状态的ephemeralOwner字段时, 提到过有的节点是ephemeral节点, 而有的并非. 那么节点都具备哪些类型呢? 每种类型的节点又具备哪些特色呢?persistent
. persistent节点不和特定的session绑定, 不会随着建立该节点的session的结束而消失, 而是一直存在, 除非该节点被显式删除.ephemeral
. ephemeral节点是临时性的, 若是建立该节点的session结束了, 该节点就会被自动删除. ephemeral节点不能拥有子节点. 虽然ephemeral节点与建立它的session绑定, 但只要该该节点没有被删除, 其余session就能够读写该节点中关联的数据. 使用-e参数指定建立ephemeral节点.
- [zk: localhost:4180(CONNECTED) 4] create -e /xing/ei world
- Created /xing/ei
sequence
. 严格的说, sequence并不是节点类型中的一种. sequence节点既能够是ephemeral的, 也能够是persistent的. 建立sequence节点时, ZooKeeper server会在指定的节点名称后加上一个数字序列, 该数字序列是递增的. 所以能够屡次建立相同的sequence节点, 而获得不一样的节点. 使用-s参数指定建立sequence节点.
- [zk: localhost:4180(CONNECTED) 0] create -s /xing/item world
- Created /xing/item0000000001
- [zk: localhost:4180(CONNECTED) 1] create -s /xing/item world
- Created /xing/item0000000002
- [zk: localhost:4180(CONNECTED) 2] create -s /xing/item world
- Created /xing/item0000000003
- [zk: localhost:4180(CONNECTED) 3] create -s /xing/item world
- Created /xing/item0000000004
watch
watch的意思是监听感兴趣的事件. 在命令行中, 如下几个命令能够指定是否监听相应的事件.
ls命令. ls命令的第一个参数指定znode, 第二个参数若是为true, 则说明监听该znode的子节点的增减, 以及该znode自己的删除事件.
- [zk: localhost:4180(CONNECTED) 21] ls /xing true
- []
- [zk: localhost:4180(CONNECTED) 22] create /xing/item item000
- WATCHER::
- WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/xing
- Created /xing/item
get命令. get命令的第一个参数指定znode, 第二个参数若是为true, 则说明监听该znode的更新和删除事件.
- [zk: localhost:4180(CONNECTED) 39] get /xing true
- world
- cZxid = 0x100000066
- ctime = Fri May 17 22:30:01 CST 2013
- mZxid = 0x100000066
- mtime = Fri May 17 22:30:01 CST 2013
- pZxid = 0x100000066
- cversion = 0
- dataVersion = 0
- aclVersion = 0
- ephemeralOwner = 0x0
- dataLength = 5
- numChildren = 0
- [zk: localhost:4180(CONNECTED) 40] create /xing/item item000
- Created /xing/item
- [zk: localhost:4180(CONNECTED) 41] rmr /xing
- WATCHER::
- WatchedEvent state:SyncConnected type:NodeDeleted path:/xing
stat命令. stat命令用于获取znode的状态信息. 第一个参数指定znode, 若是第二个参数为true, 则监听该node的更新和删除事件.