【转载】zookeeper数据模型

[转载请注明做者和原文连接,  若有谬误, 欢迎在评论中指正. ] node

ZooKeeper的数据结构, 与普通的文件系统极为相似. 见下图:git

图片引用自developerworksgithub

图中的每一个节点称为一个znode. 每一个znode由3部分组成:session

  • stat. 此为状态信息, 描述该znode的版本, 权限等信息.
  • data. 与该znode关联的数据.
  • children. 该znode下的子节点.

ZooKeeper命令

在深刻znode的各个部分以前, 首先须要熟悉一些经常使用的ZooKeeper命令.数据结构

链接serverspa

Bash代码   收藏代码
  1. bin/zkCli.sh -server 10.1.39.43:4180  

列出指定node的子node命令行

Bash代码   收藏代码
  1. [zk: 10.1.39.43:4180(CONNECTED) 9] ls /  
  2. [hello, filesync, zookeeper, xing, server, group, log]  
  3. [zk: 10.1.39.43:4180(CONNECTED) 10] ls /hello  
  4. []  

建立znode节点, 并指定关联数据code

Bash代码   收藏代码
  1. create /hello world  

建立节点/hello, 并将字符串"world"关联到该节点中.server

获取znode的数据和状态信息blog

Bash代码   收藏代码
  1. [zk: 10.1.39.43:4180(CONNECTED) 7] get /hello  
  2. world  
  3. cZxid = 0x10000042c  
  4. ctime = Fri May 17 17:57:33 CST 2013  
  5. mZxid = 0x10000042c  
  6. mtime = Fri May 17 17:57:33 CST 2013  
  7. pZxid = 0x10000042c  
  8. cversion = 0  
  9. dataVersion = 0  
  10. aclVersion = 0  
  11. ephemeralOwner = 0x0  
  12. dataLength = 5  
  13. numChildren = 0  

删除znode

Bash代码   收藏代码
  1. [zk: localhost:4180(CONNECTED) 13] delete /xing/item0000000001  
  2. [zk: localhost:4180(CONNECTED) 14] delete /xing                 
  3. 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节点.

Bash代码   收藏代码
  1. [zk: localhost:4180(CONNECTED) 4] create -e /xing/ei world     
  2. Created /xing/ei  

sequence. 严格的说, sequence并不是节点类型中的一种. sequence节点既能够是ephemeral的, 也能够是persistent的. 建立sequence节点时, ZooKeeper server会在指定的节点名称后加上一个数字序列, 该数字序列是递增的. 所以能够屡次建立相同的sequence节点, 而获得不一样的节点. 使用-s参数指定建立sequence节点.

Bash代码   收藏代码
  1. [zk: localhost:4180(CONNECTED) 0] create -s /xing/item world  
  2. Created /xing/item0000000001  
  3. [zk: localhost:4180(CONNECTED) 1] create -s /xing/item world  
  4. Created /xing/item0000000002  
  5. [zk: localhost:4180(CONNECTED) 2] create -s /xing/item world  
  6. Created /xing/item0000000003  
  7. [zk: localhost:4180(CONNECTED) 3] create -s /xing/item world  
  8. Created /xing/item0000000004  

 

watch

watch的意思是监听感兴趣的事件. 在命令行中, 如下几个命令能够指定是否监听相应的事件.

ls命令. ls命令的第一个参数指定znode, 第二个参数若是为true, 则说明监听该znode的子节点的增减, 以及该znode自己的删除事件.

Bash代码   收藏代码
  1. [zk: localhost:4180(CONNECTED) 21] ls /xing true  
  2. []  
  3. [zk: localhost:4180(CONNECTED) 22] create /xing/item item000  
  4.   
  5. WATCHER::  
  6.   
  7. WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/xing  
  8. Created /xing/item  

get命令. get命令的第一个参数指定znode, 第二个参数若是为true, 则说明监听该znode的更新和删除事件.

Bash代码   收藏代码
  1. [zk: localhost:4180(CONNECTED) 39] get /xing true  
  2. world  
  3. cZxid = 0x100000066  
  4. ctime = Fri May 17 22:30:01 CST 2013  
  5. mZxid = 0x100000066  
  6. mtime = Fri May 17 22:30:01 CST 2013  
  7. pZxid = 0x100000066  
  8. cversion = 0  
  9. dataVersion = 0  
  10. aclVersion = 0  
  11. ephemeralOwner = 0x0  
  12. dataLength = 5  
  13. numChildren = 0  
  14. [zk: localhost:4180(CONNECTED) 40] create /xing/item item000  
  15. Created /xing/item  
  16. [zk: localhost:4180(CONNECTED) 41] rmr /xing  
  17.   
  18. WATCHER::  
  19.   
  20. WatchedEvent state:SyncConnected type:NodeDeleted path:/xing  

stat命令. stat命令用于获取znode的状态信息. 第一个参数指定znode, 若是第二个参数为true, 则监听该node的更新和删除事件.

相关文章
相关标签/搜索