ZooKeeper 教程

ZooKeeper 使用

ZooKeeper 高级教程

ZooKeeper 笔记

如何判定 zookeeper 指定节点是持久的还是临时的?

ZooKeeper 笔记 ZooKeeper 笔记


在实际的开发中,我们经常想要知道当前的 zookeeper 节点是持久的还是临时的;首先要明确两个概念,一是 zookeeper 持久节点是指该数据节点被创建后,就会一直存在于 zookeeper 服务器上,直到有删除操作来主动删除这个节点,二是 zookeeper 临时节点是指节点的生命周期和客户端会话绑定在一起,客户端会话失效,则这个节点就会被自动清除。那要判断节点是持久的还是临时的方法很简单,大致主要有三种方式,一是通过 zookeeper 安装时自带的客户端命令查看、二是可以通过 zookeeper 的可视化工具查看,如 zk-web(github:https://github.com/qiuxiafei/zk-web),三是可以通过 zookeeper jar 包提供的 api 编写相应的代码。

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());
        
    }

}