ZooKeeper 教程

ZooKeeper 使用

ZooKeeper 高级教程

ZooKeeper 笔记

original icon
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.knowledgedict.com/tutorial/zookeeper-note-identify-persistent-ephemeral.html

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

ZooKeeper 笔记 ZooKeeper 笔记


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

}
zookeeper 节点类型从持久化层面只有 2 种,分为持久节点(persistence znode)和临时节点(ephemeral zn ...
elasticsearch 查看当前集群中的 master 节点是哪个需要使用 _cat 监控命令,具体如下。 ...
ZooKeeper 实践中相关的笔记。 ...
Redis提供了两种不同的持久化方法来将数据存储到硬盘里面。 ...
针对如上问题,先说结论,java 调用方法时,参数传递的是值。也就是说,方法得到的是所有参数值的一个拷贝,特别是,方法不能修改传递给它的任何 ...