分布式管中窥豹之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内部原理>

Zookeeper学习

zook主要有哪些功能

打怪升级之小白的大数据之旅(五十四)<Zookeeper概述与部署>

Redis实现分布式锁与Zookeeper实现分布式锁区别

Zookeeper