数据模型
在 zookeeper 中,可以说 zookeeper 中的所有存储的数据是由 znode 组成的,节点也称为 znode,并以 key/value 形式存储数据。
整体结构类似于 linux 文件系统的模式以树形结构存储。其中根路径以 / 开头。
进入 zookeeper 安装的 bin 目录,通过sh zkCli.sh打开命令行终端
./zkCli.sh -server localhost:2181
执行 “ls /” 命令显示:
ls /
在默认情况下 根目录 / 下只有zookeeper一个节点,我们也可以手动的加节点
![在这里插入图片描述](https://img-blog.csdnimg.cn/b9f3058db20b4a9fbfe94d81e55f1bf2.png
可以通过get命令来查看节点的值
get /test
其中第一行显示的 abc 是该节点的 value 值。
Znode的组成部分
Znode 的data(数据)
get /test
Znode的acl(权限)
getAcl /路径
getAcl /test
Znode的stat(元数据)
stat /节点路径
stat /test
- cZxid 创建节点时的事务ID
- ctime 创建节点时的时间
- mZxid 最后修改节点时的事务ID
- mtime 最后修改节点时的时间
- pZxid 表示该节点的子节点列表最后一次修改的事务ID,添加子节点或删除子节点就会影响子节点列表,但是修改子节点的数据内容则不影响该ID(注意,只有子节点列表变更了才会变更pzxid,子节点内容变更不会影响pzxid)
- cversion 子节点版本号,子节点每次修改版本号加1
- dataversion 数据版本号,数据每次修改该版本号加1
- aclversion 权限版本号,权限每次修改该版本号加1
- ephemeralOwner 创建该临时节点的会话的sessionID。(如果该节点是持久节点,那么这个属性值为0)
- dataLength 该节点的数据长度
- numChildren 该节点拥有子节点的数量(只统计直接子节点的数量)
了解上面状态属性值,我们对 /test 节点做一次修改,执行命令 set /test ccc ,如下图所示:
$ set /test ccc
对比上面结果,可以看到 mZxid、mtime、dataVersion 都发生了变化。
Zonde的child(子节点)
ls /节点路径
ls /test 获取test节点的子节点
Znode节点类型
在3.6.2版本中
-
PERSISTENT:持久化节点,在会话结束后依然存在,不会随客户端的断开而自动删除,默认类型
-
PERSISTENT_SEQUENTIAL:持久序号节点,创建出的节点,根据创建先后顺序,会在节点后带一个数值,znode的名字将被附加一个单调递增的数字,越往后数值越大,适用于分布式锁的应用场景
-
EPHEMERAL:临时节点,当客户端断开时自动删除,通过这个特性,zk可以实现服务注册与发现的效果
-
EPHEMERAL_SEQUENTIAL:带序号的临时节点,znode的名字将被附加一个单调递增的数字
-
CONTAINER(3.5.3版本新增):Container容器节点,当容器中没有任何子节点,该容器节点会被zk定期删除(60s)
-
PERSISTENT_WITH_TTL:zookeeper的扩展类型,如果znode在给定的TTL内没有被修改,它将在没有子节点时被删除。要想使用该类型,必须在zookeeper的bin/zkService.sh中的启动zookeeper的java环境中设置环境变量zookeeper.extendedTypesEnabled=true(具体做法在下边),否则KeeperErrorCode = Unimplemented for /**。
-
PERSISTENT_SEQUENTIAL_WITH_TTL:同上,是不过是带序号的