今天我们来聊聊 ZooKeeper 中,关于节点(znode)的一些概念。
Znode有两种,分别为临时节点和持久节点。节点的类型在创建时即被确定,并且不能改变。
Znode还有一个序列化的特性,如果创建的时候指定的话,该Znode的名字后面会自动追加一个不断增加的序列号。序列号对于此节点的父节点来说是唯一的,这样便会记录每个子节点创建的先后顺序。它的格式为“%10d”(10位数字,没有数值的数位用0补充,例如“0000000001”)。
1.即像文件一样维护着数据,元信息 ACL 时间戳等数据结构。
2.又像目录一样可以作为路径标示的一部分,并可以具有子Znode,。
3.用户可以对Znode具有增删改查等操作(权限允许的情况下)。
1.读操作将获取与节点相关的所有的数据。
2.写操作也将替换点节点的所有数据。
3.另外,每一个节点都拥有自己的ACL(访问控制列表),这个列表规定了用户的权限,即限定了特定用户对目标节点可以执行的操作。
1.zookeeper虽然可以关联一些数据,但是并没有被设计为常规的数据库或者大数据存储。相反的是,它用来管理调度数据,比如分布式应用中的配置文件信息,状态信息,汇集位置等等;
2.上面的这些数据的共同特性就是他们都是很小的数据,通常以KB为大小单位。Zookeeper的服务器和客户端都设计为严格检查并限制为每个Znode的数据大小之多1M,当然常规远小于这个值。
1.如同linxu系统文件路径一样,路径必须是绝对的,因此他们必须是由斜杠字符开头。
2.路径必须是唯一的。
3.路径由Unicode字符串组成,并且有一些限制,字符串"zookeeper"用来保存管理信息,比如关键配置额信息。
下面我们一起来看一下,在ZooKeeper中,节点(znode)有几种类型?
ZooKeeper中,节点(znode)一共有四种类型种。分别是:
接下来我们来具体了解一下,每个节点的具体概念:
临时节点(EPHEMERAL):session 链接断开就没了;不能创建子节点;不能同名。
临时节点的生命周期与客户端会话绑定,一旦客户端会话失效(客户端与zookeeper 连接断开不一定会话失效),那么这个客户端创建的所有临时节点都会被移除。
临时顺序节点(EPHEMERAL_SEQUENTIAL) :session链接断开就没了;不能创建子节点;同名节点会在后面添加上序号(分布式锁使用的好处)。
基本特性同临时节点,增加了顺序属性,节点名后边会追加一个由父节点维护的自增整型数字。
持久节点(PERSISTENT):session断联、服务端重启还在;可以创建子节点,子节点可以临时也可以持久;不能同名。
除非手动删除,否则节点一直存在于 Zookeeper 上。
持久顺序节点(PERSISTENT_SEQUENTIAL):session断联、服务端重启还在;可以创建子节点,子节点可以临时也可以持久;同名节点会在后面添加上序号。
基本特性同持久节点,只是增加了顺序属性,节点名后边会追加一个由父节点维护的自增整型数字。
每个znode都包含了一系列的属性,通过命令get,可以获得节点的属性。
dataVersion
#数据版本号,每次对节点进行set操作,dataVersion的值都会增加1(即使设置的是相同的数据),可有效避免了数据更新时出现的先后顺序问题。
下图演示版本号的作用:
cversion
#子节点的版本号。当znode的子节点有变化时,cversion 的值就会增加1。
cZxid
#Znode创建的事务id。
mZxid
#Znode被修改的事务id,即每次对znode的修改都会更新mZxid。
对于zk来说,每次的变化都会产生一个唯一的事务id,zxid(ZooKeeper Transaction Id)。通过zxid,可以确定更新操作的先后顺序。例如,如果zxid1小于zxid2,说明zxid1操作先于zxid2发生,zxid对于整个zk都是唯一的,即使操作的是不同的znode。
ctime
#节点创建时的时间戳。
mtime
#节点最新一次更新发生时的时间戳。
ephemeralOwner
#如果该节点为临时节点, ephemeralOwner值表示与该节点绑定的session id. 如果不是, ephemeralOwner值为0。
在client和server通信之前,首先需要建立连接,该连接称为session。连接建立后,如果发生连接超时、授权失败,或者显式关闭连接,连接便处于CLOSED状态,此时session结束。
链接服务端:
zkCli.cmd -timeout 5000 -r -server localhost:21810
[zk: localhost:21810(CONNECTED) 15] create -e /temp 1
Created /temp
[zk: localhost:21810(CONNECTED) 16] ls /
[temp]
[zk: localhost:21810(CONNECTED) 17]
断开session链接
[zk: localhost:21810(CONNECTED) 16] ls /
[]
[zk: localhost:21810(CONNECTED) 17]
[zk: localhost:21810(CONNECTED) 17] ls /
[temp]
[zk: localhost:21810(CONNECTED) 18] create -e /temp/child 1
Ephemerals cannot have children: /temp/child
[zk: localhost:21810(CONNECTED) 19]
[zk: localhost:21810(CONNECTED) 17] ls /
[temp]
[zk: localhost:21810(CONNECTED) 19] create -e /temp 1
Node already exists: /temp
[zk: localhost:21810(CONNECTED) 20]
[zk: localhost:21810(CONNECTED) 22] create -e -s /temp2 1
Created /temp20000000011
断线重连,数据就没了
[zk: localhost:21810(CONNECTED) 0] ls /
[]
[zk: localhost:21810(CONNECTED) 1]
[zk: localhost:21810(CONNECTED) 22] create -e -s /temp2 1
Created /temp20000000011
[zk: localhost:21810(CONNECTED) 23] create -e -s /temp2/t1 1
Node does not exist: /temp2/t1
[zk: localhost:21810(CONNECTED) 24] create -e /temp2/t1 1
Node does not exist: /temp2/t1
[zk: localhost:21810(CONNECTED) 1] create -e -s /temp 1
Created /temp0000000012
[zk: localhost:21810(CONNECTED) 2] create -e -s /temp 1
Created /temp0000000013
[zk: localhost:21810(CONNECTED) 3] create -e -s /temp 1
Created /temp0000000014
[zk: localhost:21810(CONNECTED) 8] create /a 123
Created /a
[zk: localhost:21810(CONNECTED) 11] ls /
[a]
[zk: localhost:21810(CONNECTED) 12] create /a 123
Node already exists: /a
[zk: localhost:21810(CONNECTED) 13]
[zk: localhost:21810(CONNECTED) 8] create /a 123
Created /a
[zk: localhost:21810(CONNECTED) 11] ls /
[a]
session重连,服务端重启,持久节点还有
[zk: localhost:21810(CONNECTED) 1] ls /
[a]
[zk: localhost:21810(CONNECTED) 2]
[zk: localhost:21810(CONNECTED) 6] create /a/b 123
Created /a/b
[zk: localhost:21810(CONNECTED) 9] create -s /d 123
Created /d0000000017
[zk: localhost:21810(CONNECTED) 10] create -s /d 123
Created /d0000000018
[zk: localhost:21810(CONNECTED) 11]
[zk: localhost:21810(CONNECTED) 12] ls /
[d0000000017, d0000000018]
[zk: localhost:21810(CONNECTED) 1] ls /
[d0000000017, d0000000018]
[zk: localhost:21810(CONNECTED) 2]
临时子节点和持久子节点都可以
[zk: localhost:21810(CONNECTED) 4] create -e /d0000000017/t 1
Created /d0000000017/t
[zk: localhost:21810(CONNECTED) 5] create /d0000000017/t1 2
Created /d0000000017/t1
[zk: localhost:21810(CONNECTED) 6]
如果Container节点下面没有子节点,则Container节点 在未来会被Zookeeper自动清除,定时任务默认60s 检查一次。
默认禁用,只能通过系统配置 zookeeper.extendedTypesEnabled=true 开启,不稳定。
参考文章:https://blog.csdn.net/yokeyhui/article/details /128166536 https://blog.csdn.net/qq_22701869/article /details/115387249 https://blog.csdn.net/u014636209 /article/details/85411512
推荐阅读 点击标题可跳转