Zookeeper详解(三):Zookeeper中的Znod

发布时间:2020-03-02 06:53:58 作者:linuxjavachen
来源:网络 阅读:36938

数据模型

ZK拥有一个命名空间就像一个精简的文件系统,不同的是它的命名空间中的每个节点拥有它自己或者它下面子节点相关联的数据。ZK中必须使用绝对路径也就是使用“/”开头。

Znode:

ZK目录树中每个节点对应一个Znode。每个Znode维护这一个属性,当前版本、数据版本、建立时间和修改时间等,看下图:

Zookeeper详解(三):Zookeeper中的Znod

ZK就是使用这些属性来实现特殊功能的。当一个客户端要对某个节点进行修改时,必须提供该数据的版本号,当节点数据发生变化是其版本号就会增加。如下图:

Zookeeper详解(三):Zookeeper中的Znod

Znode具有如下特性:

节点类型:ZK中有几种节点类型,节点类型在节点创建的时候就被确定且不可改变

创建顺序节点

create -s /NODE_NAME DATA    # -e参数为创建临时节点,如果不带参数则创建持久节点

Zookeeper详解(三):Zookeeper中的Znod

ZK中的时间和版本号:

ZXID:ZK节点状态改变会导致该节点收到一个zxid格式的时间戳,这个时间戳是全局有序的,每次更新都会产生一个新的。如果zxid1的值小于zxid2,那么说明zxid2发生的改变在zxid1之后。zxid是一个唯一的事务ID,具有递增性,一个znode的建立或者更新都会产生一个新的zxid值,具体时间有3个cZxid(节点创建时间)、mZxid(该节点修改时间,与子节点无关)、pZxid(该节点的子节点的最后一次创建或者修改时间,孙子节点无关)

version:对节点的每次操作都会使节点的版本号增加,有三个版本号dataversion(数据版本号)、cversion(子节点版本号)、aclversion(节点所拥有的ACL版本号)

Zookeeper详解(三):Zookeeper中的Znod

cZxid
创建节点时的事务ID
ctime
创建节点时的时间
mZxid
最后修改节点时的事务ID
mtime
最后修改节点时的时间
pZxid
表示该节点的子节点列表最后一次修改的事务ID,添加子节点或删除子节点就会影响子节点列表,但是修改子节点的数据内容则不影响该ID
cversion
子节点版本号,子节点每次修改版本号加1
dataversion
数据版本号,数据每次修改该版本号加1
aclversion
权限版本号,权限每次修改该版本号加1
dataLength
该节点的数据长度
numChildren
该节点拥有子节点的数量


版本号的作用

Zookeeper里面的版本号和我们理解的版本号不同,它表示的是对数据节点的内容、子节点列表或者ACL信息的修改次数。节点创建时dataversion、aclversion,cversion都为0,每次修改响应内容其对应的版本号加1。

这个版本号的用途就和分布式场景的一个锁概念有关。比如演出售票中的一个座位,显然每个场次中的每个座位都只有一个,不可能卖出2次。如果A下单的时候显示可售,他想买,那么为了保证他可以下单成功,此时别人就不能买。这时候就需要有一种机制来保证同一时刻只能有一个人去修改该座位的库存。这就用到了锁。锁有悲观锁和乐观锁。

Zookeeper中的版本号就是乐观锁,你修改节点数据之前会读取这个数据并记录该数据版本号,当你需要更新时会携带这个版本号去提交,如果你此时携带的版本号(就是你上次读取出来的)和当前节点的版本号相同则说明该数据没有被修改过,那么你的提交就会成功,如果提交失败说明该数据在你读取之后和提交之前这段时间内被修改了。

这里通过set命令并携带版本号提交更新,版本号相同更新就会成功。

Zookeeper详解(三):Zookeeper中的Znod

如果你再次更新并使用之前的版本号那么就会失败。

Zookeeper详解(三):Zookeeper中的Znod


推荐阅读:
  1. 三、zookeeper集群的应用场景
  2. Zookeeper详解(二):Zookeeper安装和运行

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

zookeeper数据模型 znode 节点数据

上一篇:大数据基础问答

下一篇:13.函数的类型和基本使用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》