概述
zookeeper的数据节点可以视为是树状结构,树中的各个节点被称之为znode,一个znode可以拥有多个节点,使用节点的路径来定位某个znode。
znode兼具文件和目录两种身份,既能像文件一样维护着数据、元信息、ACL、时间戳等数据,又可以像目录已经作为路径的标识的一部分。
znode的组成部分
- 节点的数据:节点path,以及对应的节点数据。
- 节点的子节点children
- 节点的状态state:用来描述当前节点的创建、修改记录、包括cZxid、ctime等
- cZxid:数据节点创建时的事务id
- ctime:数据节点创建时的时间
- mZxid:数据节点最后一次更新时的事务id
- mtime:数据节点最后一次更新时的时间
- pZxid:数据节点的子节点最后一次修改时的事务id
- cversion:子节点的更改次数
- dataVersion:当前节点数据修改次数
- aclVersion:节点的ACL修改次数(当前节点对应的权限列表修改次数)
- ephemeralOwner:如果当前节点是临时节点,则表示创建该节点会话的SessionID,如果当前节点是持久节点,则该属性为0。
- dataLength:数据内容的长度(字节为单位)
- numChildren:数据节点当前的子节点个数
节点类型
zookeeper有两种节点类型,节点类型在创建的时候即被确定,并且不能修改。
- 临时节点(Znode):该节点的生命周期依赖于创建他们的会话,一旦session结束,临时节点将会被清除,虽然每个Znode都会绑定到一个客户端session,但他们对所有客户端还是可见的,需要注意的是临时节点不允许有自己的子节点。
- 持久化节点:此类型的节点声明周期不依赖于会话,并且有在客户端显示的执行删除操作的时候,他们才能被清除。
数据操作
新增节点
create [-s] [-e] [-c] [-t ttl] path [data] [acl]
两个重要的参数 -s 和 -e。
- -s:有序节点
- -e:临时节点
所以zookeeper的节点分为,有序的持久化节点、无序的持久化节点、有序的临时节点、无序的临时节点。
创建一般节点(无序、持久节点)
创建有序节点
有序节点会在节点名称后面追加一个序号。
更新节点
set [-s] [-v version] path data
修改节点的值
每次修改数据之后,当前节点的数据版本号dataVersion会自增1。
修改节点的值的时候,可以带上版本号,只有版本号与当前节点的数据版本号一致的时候才能修改成功。相当于乐观锁的机制,在多线程操作数据的情况下可以防止出现ABA问题。
删除节点
delete [-v version] path
可以加上版本号进行删除。
当删除的节点下存在子节点的时候,删除当前节点将会失败。需要使用deleteall删除,3.7版本之前是rmr命令。
查看节点信息
get [-s] [-w] path
- -s:现实节点的详细信息
- -w:添加监听器,在当前节点发生变化后,会向当前会话对应的客户端发出通知。
stat [-w] path
stat只返回节点的信息,不返回节点的数据。
节点信息的改变:
- cZxid:数据节点创建时的事务id
- ctime:数据节点创建时的时间
- mZxid:数据节点最后一次更新时的事务id
- 没有改变之前(初始值)和cZxid一致,在节点发生过任何一次修改之后将会改变。
- mtime:数据节点最后一次更新时的时间
- 没有改变之前(初始值)和ctime一致,在节点发生过任何一次修改之后将会改变。
- pZxid:数据节点的子节点最后一次修改时的事务id
- 每一次当前节点的子节点时发生改变(创建或者修改),与最新创建或者修改时子节点的pZxid一致。
- cversion:子节点的更改次数
- dataVersion:当前节点数据修改次数
- aclVersion:节点的ACL修改次数(当前节点对应的权限列表修改次数)
- ephemeralOwner:如果当前节点是临时节点,则表示创建该节点会话的SessionID,如果当前节点是持久节点,则该属性为0。
- dataLength:数据内容的长度(字节为单位)
- numChildren:数据节点当前的子节点个数
查看节点列表
ls [-s] [-w] [-R] path
使用如下:
查询某个节点下的子节点,但是不会返回孙子节点。
-s参数返回子节点的信息(旧版本使用ls2命令):
-R参数返回当前节点以及其下所有节点的列表,包括当前节点本身: