温馨提示×

ZooKeeper的持久化节点如何操作

小樊
42
2025-12-10 15:18:58
栏目: 大数据

ZooKeeper 持久化节点操作指南

一 概念与特点

  • 持久化节点 Persistent:默认创建的节点类型,创建后不会随会话结束而删除,需要显式删除。
  • 持久有序节点 Persistent Sequential:在节点名后自动追加自增序号,用于排序、队列等场景。
  • 与之对比:临时节点 Ephemeral 会在会话过期/关闭时自动删除,且不能创建子节点
  • 常用命令前缀:create [-s] [-e] path data(不带 -e 即为持久节点;带 -s 为有序)。

二 Shell 常用操作

  • 连接客户端
    • 启动服务:zkServer.sh start(集群可用 status 查看状态)
    • 连接:zkCli.sh -server <host:2181>
  • 创建
    • 持久节点:create /app "hello"
    • 持久有序节点:create -s /app/seq "item"(生成如 /app/seq0000000001
  • 读取
    • 查看数据:get /app
    • 查看元数据:get -s /app(含 cZxid、ctime、mZxid、mtime、dataVersion、cversion、numChildren 等)
    • 查看子节点:ls /app;递归查看:ls -R /app
  • 更新
    • 普通更新:set /app "world"
    • 乐观锁更新:set /app "world" <version>(使用 get -s 获取当前 dataVersion)
  • 删除
    • 删除单个节点:delete /app/seq0000000001
    • 递归删除:deleteall /app(新版中 rmr 已被弃用,建议使用 deleteall
  • 监听
    • 子节点变化:ls -w /app
    • 节点数据变化:get -w /app
  • 退出:quit
    以上命令均为 zkCli 常用语法,含创建、查看、更新、删除与监听等核心操作。

三 Java API 示例

  • 依赖(Maven)
    • groupId:org.apache.zookeeper,artifactId:zookeeper,version:3.6.3(可按需调整)
  • 创建持久节点
    • 代码示例:
      • zk.create("/myNode", "My data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
  • 读取与更新
    • 读取:zk.getData("/myNode", false, stat)
    • 更新(带版本控制):zk.setData("/myNode", "updated".getBytes(), stat.getVersion());
  • 说明
    • 持久节点使用 CreateMode.PERSISTENT;临时节点使用 CreateMode.EPHEMERAL
    • 更新时的 version 来自 existsgetData 返回的 Stat,用于实现乐观锁。

四 注意事项

  • 临时节点不能创建子节点,否则会报错 “Ephemerals cannot have children”。
  • 删除非空节点需先删除子节点,或使用 deleteall 递归删除。
  • 使用 set path data [version] 时,若指定了 version,需与服务器当前 dataVersion 一致,否则更新失败(乐观锁)。
  • 观察子节点变化可用 ls -w,观察数据变化可用 get -w;事件触发一次后即失效,需要重新注册。
  • 在 zkCli 中,ls2 已被弃用,建议使用 ls -s path 查看详细信息。

0