分布式管中窥豹之zookeeper小白学习zookeeper的节点属性
Posted dabingguozi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分布式管中窥豹之zookeeper小白学习zookeeper的节点属性相关的知识,希望对你有一定的参考价值。
欢迎来到分布式管中窥豹之zookeeper小白学习系列,本系列会记录zookeeper以及分布式系统学习过程中的一些操作和细节,大饼果子非科班出身,如有错误,欢迎指出
在了解节点结构之后,我们深入探究一下节点的一些属性
1. 临时与持久
znode按照生命周期划分属性可分为临时节点(ephemeral)和持久节点(persistent),临时节点在客户端崩溃或关闭连接时节点自动清除,而持久节点需要显式的进行删除
我们来尝试一下
[zk: localhost:2181(CONNECTED) 0] create -e /dabingguozi "test ephemeral" Created /dabingguozi [zk: localhost:2181(CONNECTED) 1] ls / [dabingguozi, zookeeper] [zk: localhost:2181(CONNECTED) 2] get /dabingguozi test ephemeral cZxid = 0x4f ctime = Fri Jan 25 17:15:11 SRET 2019 mZxid = 0x4f mtime = Fri Jan 25 17:15:11 SRET 2019 pZxid = 0x4f cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x1002a0766180010 dataLength = 14 numChildren = 0
这里的-e就是表示创建的节点是临时节点,我们可以看到,ephemeralOwner的值不再是我们之前看到的0x0而是0x1002a0766180010(当然,你的值和我的可能是不一样的)
所以现在我们要断开客户端,看看节点是否还在
[zk: localhost:2181(CONNECTED) 3] quit Quitting... 2019-01-25 17:19:30,095 [myid:] - INFO [main:[email protected]] - Session: 0x1002a0766180010 closed 2019-01-25 17:19:30,098 [myid:] - INFO [main-EventThread:[email protected]] - EventThread shut down for session: 0x1002a0766180010 $./bin/zkCli.sh ...... 2019-01-25 17:19:33,716 [myid:] - INFO [main-SendThread(localhost:2181):[email protected]] - Session establishment complete on server localhost/0:0:0:0:0:0:0:1:2181, sessionid = 0x1002a0766180011, negotiated timeout = 30000 WATCHER:: WatchedEvent state:SyncConnected type:None path:null [zk: localhost:2181(CONNECTED) 0] ls / [zookeeper]
我们重点看最后两行,根下的节点列表里已经不再有dabingguozi了,dabingguozi这个临时节点已经删除
持久化的节点的创建比较简单,可以尝试一下操作
[zk: localhost:2181(CONNECTED) 1] create /dabingguozi "" Created /dabingguozi [zk: localhost:2181(CONNECTED) 2] ls / [dabingguozi, zookeeper] [zk: localhost:2181(CONNECTED) 3] delete /dabingguozi [zk: localhost:2181(CONNECTED) 4] ls / [zookeeper]
以上就是关于临时节点和持久节点的内容
2. 数据版本
我们清除所有之前的节点,重新开始,再次创建dabingguozi节点,并修改
[zk: localhost:2181(CONNECTED) 0] create /dabingguozi "" Created /dabingguozi [zk: localhost:2181(CONNECTED) 1] get /dabingguozi cZxid = 0x60 ctime = Fri Jan 25 17:30:33 SRET 2019 mZxid = 0x60 mtime = Fri Jan 25 17:30:33 SRET 2019 pZxid = 0x60 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 0 numChildren = 0
[zk: localhost:2181(CONNECTED) 2] set /dabingguozi "hello"
cZxid = 0x60
ctime = Fri Jan 25 17:30:33 SRET 2019
mZxid = 0x61
mtime = Fri Jan 25 17:31:52 SRET 2019
pZxid = 0x60
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
我们注意到了一个值,dataVersion,字面意思就是数据的版本,那么问题来了,dataVersion有什么用呢?
废话的讲,数据版本就是用来管理数据的版本的,也就是说,你可以在更新,删除的时候指定要操作的当前版本是多少,这样就可以保证执行的顺序,比如我们这样
[zk: localhost:2181(CONNECTED) 3] set /dabingguozi "hello1" 1 cZxid = 0x60 ctime = Fri Jan 25 17:30:33 SRET 2019 mZxid = 0x62 mtime = Fri Jan 25 17:33:27 SRET 2019 pZxid = 0x60 cversion = 0 dataVersion = 2 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 6 numChildren = 0
数据版本就增加了
但我们在执行一次
[zk: localhost:2181(CONNECTED) 4] set /dabingguozi "hello1" 1 version No is not valid : /dabingguozi
zookeeper就不允许我们更新了,这里最后的数字就是指定的版本号,如果当前的版本号并不是请求的版本号,那么这次的更新就不会成功,所以一个客户端因为种种原因,拿到的版本号落后了,那么他的更新可能会造成数据的错误,而zookeeper的数据版本机制保证了这样的客户端的更新会失败,从而保证了数据的准确
所以想要更新dabingguozi可以这样
[zk: localhost:2181(CONNECTED) 5] set /dabingguozi "hello2" 2 cZxid = 0x60 ctime = Fri Jan 25 17:30:33 SRET 2019 mZxid = 0x64 mtime = Fri Jan 25 17:41:36 SRET 2019 pZxid = 0x60 cversion = 0 dataVersion = 3 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 6 numChildren = 0
3. 监视和通知
节点的监视不能完全的算是属性,但算是节点的一种特殊功能,可以选择
- 监听一个节点数值的变化:get *** watch
- 监听一个节点的状态的变化:stat *** watch
- 监听一个节点的目录结构的变化:ls *** watch
注意节点的监视是一次性的,一旦通知被触发,此次监视的生命周期就已经结束了,如果需要继续监视,可以再次设置监视点
现在我们清除全部从前的数据,并在根目录下创建一个znode叫做dabingguozi
尝试一下监控节点数值变化
[zk: localhost:2181(CONNECTED) 0] get /dabingguozi watch cZxid = 0x89 ctime = Mon Jan 28 10:37:18 SRET 2019 mZxid = 0x89 mtime = Mon Jan 28 10:37:18 SRET 2019 pZxid = 0x92 cversion = 3 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 0 numChildren = 1 [zk: localhost:2181(CONNECTED) 1] set /dabingguozi "value1" WATCHER:: WatchedEvent state:SyncConnected type:NodeDataChanged path:/dabingguozi cZxid = 0x89 ctime = Mon Jan 28 10:37:18 SRET 2019 mZxid = 0x95 mtime = Mon Jan 28 10:41:46 SRET 2019 pZxid = 0x92 cversion = 3 dataVersion = 1 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 6 numChildren = 1 [zk: localhost:2181(CONNECTED) 2] get /dabingguozi watch value1 cZxid = 0x89 ctime = Mon Jan 28 10:37:18 SRET 2019 mZxid = 0x95 mtime = Mon Jan 28 10:41:46 SRET 2019 pZxid = 0x92 cversion = 3 dataVersion = 1 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 6 numChildren = 1 [zk: localhost:2181(CONNECTED) 3] delete /dabingguozi/watch_test [zk: localhost:2181(CONNECTED) 4] delete /dabingguozi WATCHER:: WatchedEvent state:SyncConnected type:NodeDeleted path:/dabingguozi
我们可以看到对dabingguozi的修改和删除都触发了watcher
get,stat和ls的监控触发条件总结如下
get | stat | ls | |
创建 | 否 | 是 | 否 |
修改值 | 是 | 是 | 否 |
删除 | 是 | 是 | 是 |
创建子节点 | 否 | 否 | 是 |
修改子节点值 | 否 | 否 | 否 |
删除子节点 | 否 | 否 | 是 |
以上就是一些节点的属性啦
管中窥豹,可见一斑
下一篇我们使用仲裁模式去启动一下zookeeper,从zookeeper仲裁模式浅尝一下分布式一致性算法
以上是关于分布式管中窥豹之zookeeper小白学习zookeeper的节点属性的主要内容,如果未能解决你的问题,请参考以下文章
打怪升级之小白的大数据之旅(五十六)<Zookeeper内部原理>