要判断 zookeeper 节点是持久的还是临时的方法很简单,大致主要有三种方式,一是通过 zookeeper 安装时自带的客户端命令查看、二是可以通过 zookeeper 的可视化工具查看,如 zk-web,三是可以通过 zookeeper jar 包提供的 api 编写相应的代码。
首先要明确两个概念,一是 zookeeper 持久节点是指该数据节点被创建后,就会一直存在于 zookeeper 服务器上,直到有删除操作来主动删除这个节点,二是 zookeeper 临时节点是指节点的生命周期和客户端会话绑定在一起,客户端会话失效,则这个节点就会被自动清除。
zookeeper 的节点类型
zookeeper 中每个节点目录都称之为 znode,和文件系统一样,我们可以自由地增加、修改、删除 znode,也可以在一个 znode 下增加、修改、删除子 znode,唯一的不同在于 znode 是可以存储数据的。
zookeeper 的 znode 有4种类型:
-
PERSISTENT - 持久化目录节点
即使在客户端与 zookeeper 断开连接时,也不会自动删除该目录节点。
-
PERSISTENT_SEQUENTIAL - 持久化目录节点 及 顺序编号目录节点
即使在客户端与 zookeeper 断开连接时,也不会自动删除该目录节点;同时顺序自动编号目录节点,这种目录节点编号会根据当前已近存在的节点数自动加1。
-
EPHEMERAL - 临时目录节点
在客户端与 zookeeper 断开连接时,会自动删除该目录节点。
-
EPHEMERAL_SEQUENTIAL - 临时目录节点 及 顺序编号目录节点
在客户端与 zookeeper 断开连接时,会自动删除该目录节点。该节点在创建时,zookeeper 会顺序自动编号目录节点。
判断方法
通过 zk 客户端命令查看
进入 zookeeper 安装目录的 bin 目录里,有 zk 的客户端脚本 zkCli 或 zkCli.sh,通过其脚本可执行相关 zk 操作,具体如下:
登陆 zookeeper
zkCli -server 127.0.0.1:2181
分别创建一个持久节点和临时节点
[zk: 127.0.0.1:2181(CONNECTED) 0] create /demo-persistent "" Created /demo-persistent [zk: 127.0.0.1:2181(CONNECTED) 1] create -e /demo-ephemeral "" Created /demo-ephemeral
查看目录节点
[zk: 127.0.0.1:2181(CONNECTED) 2] ls / [demo-persistent, demo-ephemeral]
通过 get 命令查看相应节点的 Node Stat 信息
[zk: 127.0.0.1:2181(CONNECTED) 3] get /demo-persistent cZxid = 0x242d ctime = Wed Jul 17 01:36:22 CST 2019 mZxid = 0x242d mtime = Wed Jul 17 01:36:22 CST 2019 pZxid = 0x242d cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 0 numChildren = 0 [zk: 127.0.0.1:2181(CONNECTED) 4] get /demo-ephemeral cZxid = 0x242e ctime = Wed Jul 17 01:36:43 CST 2019 mZxid = 0x242e mtime = Wed Jul 17 01:36:43 CST 2019 pZxid = 0x242e cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x16bfbcdc8dd0002 dataLength = 0 numChildren = 0
从上面的显示可以看出,Node Stat 信息中有一个字段是 ephemeralOwner,它表示这个节点的临时拥有者。
当 ephemeralOwner 值为0时,表明这个节点是持久节点。
当 ephemeralOwner 值不为0时,表明这个节点是临时节点,值为会话 id。
通过 zookeeper 的可视化工具查看
以 zk-web 为示例,官网地址:https://github.com/qiuxiafei/zk-web。
通过 zk-web 到指定的目录节点,可以看到 Node Stat 信息。
通过 zookeeper api 查看
以 java 为例,使用 zookeeper jar 的 api,示例如下:
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import java.io.IOException;
public class Demo {
public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
ZooKeeper zooKeeper = new ZooKeeper("127.0.0.1:2181", 5000, null);
Stat stat = new Stat();
zooKeeper.getData("/demo-persistent", false, stat);
System.out.println(stat.getEphemeralOwner());
zooKeeper.getData("/demo-ephemeral", false, stat);
System.out.println(stat.getEphemeralOwner());
}
}