Zookeeper(5)Zookeeper的ZNode是什么?

139 阅读3分钟

ZNode 是 Zookeeper 数据模型的基本单元,类似于文件系统中的文件或目录。每个 ZNode 都有一个路径,可以存储数据,并且可以有子节点。ZNode 的路径是唯一的,类似于文件系统中的绝对路径。

ZNode 的基本特性

  1. 路径:每个 ZNode 都有唯一的路径,路径以斜杠(/)分隔。
  2. 数据:每个 ZNode 可以存储一个小数据块(通常小于 1MB)。
  3. 状态信息:每个 ZNode 都有一个状态信息(Stat),包含节点的元数据,如版本号、创建时间、修改时间等。
  4. 类型:ZNode 有四种类型:持久节点、临时节点、持久顺序节点和临时顺序节点。
  5. 权限:ZNode 支持访问控制列表(ACL),定义了谁可以对节点进行操作。

代码示例

以下代码示例展示了如何使用 Zookeeper 创建和操作 ZNode,并获取 ZNode 的状态信息。

1. 添加 Maven 依赖

pom.xml 中添加 Zookeeper 客户端的依赖:

<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.6.3</version>
</dependency>

2. 创建 Zookeeper 客户端

import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;

public class ZookeeperClient {
    private static final String ZK_ADDRESS = "localhost:2181";
    private static final int SESSION_TIMEOUT = 3000;

    private ZooKeeper zooKeeper;

    public void connect() throws Exception {
        zooKeeper = new ZooKeeper(ZK_ADDRESS, SESSION_TIMEOUT, new Watcher() {
            @Override
            public void process(WatchedEvent event) {
                System.out.println("Event received: " + event);
            }
        });
    }

    public void close() throws InterruptedException {
        if (zooKeeper != null) {
            zooKeeper.close();
        }
    }

    public ZooKeeper getZooKeeper() {
        return zooKeeper;
    }
}

3. 创建和操作 ZNode

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;

public class ZookeeperZNodeExample {
    private static final String ZNODE_PATH = "/example_znode";

    public static void main(String[] args) throws Exception {
        ZookeeperClient client = new ZookeeperClient();
        client.connect();
        ZooKeeper zooKeeper = client.getZooKeeper();

        // 创建持久 ZNode
        if (zooKeeper.exists(ZNODE_PATH, false) == null) {
            String createdPath = zooKeeper.create(ZNODE_PATH, "initial_data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            System.out.println("Created ZNode path: " + createdPath);
        }

        // 获取 ZNode 数据和状态信息
        Stat stat = new Stat();
        byte[] data = zooKeeper.getData(ZNODE_PATH, false, stat);
        System.out.println("Data of ZNode " + ZNODE_PATH + ": " + new String(data));
        printStat(stat);

        // 更新 ZNode 数据
        stat = zooKeeper.setData(ZNODE_PATH, "updated_data".getBytes(), stat.getVersion());
        System.out.println("Updated ZNode " + ZNODE_PATH + " with version: " + stat.getVersion());

        // 读取更新后的数据和状态信息
        data = zooKeeper.getData(ZNODE_PATH, false, stat);
        System.out.println("Data of ZNode " + ZNODE_PATH + " after update: " + new String(data));
        printStat(stat);

        // 删除 ZNode
        zooKeeper.delete(ZNODE_PATH, stat.getVersion());
        System.out.println("Deleted ZNode " + ZNODE_PATH);

        client.close();
    }

    private static void printStat(Stat stat) {
        System.out.println("ZNode stat:");
        System.out.println("  czxid: " + stat.getCzxid());
        System.out.println("  mzxid: " + stat.getMzxid());
        System.out.println("  ctime: " + stat.getCtime());
        System.out.println("  mtime: " + stat.getMtime());
        System.out.println("  version: " + stat.getVersion());
        System.out.println("  cversion: " + stat.getCversion());
        System.out.println("  aversion: " + stat.getAversion());
        System.out.println("  ephemeralOwner: " + stat.getEphemeralOwner());
        System.out.println("  dataLength: " + stat.getDataLength());
        System.out.println("  numChildren: " + stat.getNumChildren());
        System.out.println("  pzxid: " + stat.getPzxid());
    }
}

详细解释

  1. 创建 ZNode

    • 使用 create 方法创建一个持久 ZNode。
    • CreateMode.PERSISTENT 指定节点类型为持久节点。
  2. 获取 ZNode 数据和状态信息

    • 使用 getData 方法获取 ZNode 的数据和状态信息。
    • Stat 对象包含 ZNode 的元数据,如版本号、创建时间、修改时间等。
  3. 更新 ZNode 数据

    • 使用 setData 方法更新 ZNode 的数据。
    • 更新时需要指定节点的版本号,以保证数据一致性。
  4. 删除 ZNode

    • 使用 delete 方法删除 ZNode。
    • 删除时需要指定节点的版本号,以保证数据一致性。
  5. 打印 ZNode 状态信息

    • printStat 方法打印 Stat 对象中的元数据。

ZNode 的状态信息(Stat)

Stat 对象包含了 ZNode 的元数据,以下是 Stat 的主要属性:

  1. czxid:创建事务 ID。
  2. mzxid:最后修改事务 ID。
  3. ctime:创建时间。
  4. mtime:最后修改时间。
  5. version:数据版本号。
  6. cversion:子节点版本号。
  7. aversion:ACL 版本号。
  8. ephemeralOwner:如果是临时节点,表示节点所有者的会话 ID。
  9. dataLength:节点数据的长度。
  10. numChildren:子节点数量。
  11. pzxid:最后修改子节点的事务 ID。

总结

ZNode 是 Zookeeper 数据模型的基本单元,类似于文件系统中的文件或目录。每个 ZNode 都有一个唯一的路径,可以存储数据,并且可以有子节点。ZNode 的状态信息(Stat)包含节点的元数据,如版本号、创建时间、修改时间等。通过上述代码示例,可以看到如何创建和操作 ZNode,并获取 ZNode 的状态信息。了解 ZNode 的特性和操作,有助于在实际应用中灵活使用 Zookeeper。