11.3.2 ZNode类型:持久节点、临时节点、顺序节点

ZNode 是 ZooKeeper 数据树的基本存储单元,按生命周期与命名规则分为持久节点、临时节点、顺序节点三类。理解它们的语义有助于配置管理、服务发现、分布式锁等设计。

文章图片
  • 持久节点(Persistent):会话断开后仍存在,适合保存长期配置、元信息。
  • 临时节点(Ephemeral):会话结束自动删除,适合表示在线状态、临时锁。
  • 顺序节点(Sequential):创建时自动追加递增序号,适合队列、选主、公平锁;可叠加持久/临时语义。

环境准备与安装验证(zkCli)#

以本机已安装 ZooKeeper 为前提,验证客户端可用:

# 假设 ZooKeeper 安装在 /opt/zookeeper
/opt/zookeeper/bin/zkCli.sh -server 127.0.0.1:2181

# 进入交互后查看根节点
ls /

预期输出包含默认节点如 zookeeper

持久/临时/顺序节点示例(完整可执行)#

# 1) 创建持久节点
create /conf/app "version=1.0"
get /conf/app

# 2) 创建临时节点(绑定当前会话)
create -e /services/instance-1 "10.0.0.1:8080"
ls /services

# 3) 创建持久顺序节点
create -s /queue/task- "jobA"
create -s /queue/task- "jobB"
ls /queue

# 4) 创建临时顺序节点(公平锁/选主)
create -e -s /locks/lock- "clientA"
create -e -s /locks/lock- "clientB"
ls /locks

预期现象:
- /conf/app 在断开会话后仍存在。
- /services/instance-1 断开会话后自动删除。
- /queue/task-0000000000/queue/task-0000000001 等顺序编号自动追加。
- /locks/lock-000000000x 按序号排序用于锁竞争。

断开会话验证临时节点#

# 退出客户端
quit

# 重新连接后验证
/opt/zookeeper/bin/zkCli.sh -server 127.0.0.1:2181
ls /services

若临时节点消失,说明会话绑定生效。

典型使用建议#

  • 配置中心:持久节点 /conf/app
  • 服务发现:临时节点 /services/<instance>
  • 任务队列/锁:顺序节点 /queue/task-/locks/lock-

常见问题与排错#

  1. 临时节点未自动删除
    - 排查:会话是否真正断开、是否存在长连接。
    bash # 查看客户端会话(需开启 4lw) echo ruok | nc 127.0.0.1 2181 echo cons | nc 127.0.0.1 2181
    - 处理:确认客户端关闭或超时配置 tickTimesessionTimeout

  2. 顺序号不连续
    - 说明:顺序号保证单调递增,不保证连续;是正常现象。

  3. 创建临时节点失败
    - 可能原因:父节点不存在或权限不足。
    bash create /services "" # 先创建父节点

练习#

  1. 创建 /conf/db 持久节点,写入 mysql=8.0,验证断开重连后仍存在。
  2. 创建 3 个临时顺序节点 /locks/lock-,观察编号排序并模拟“最小号获锁”。
  3. 手动删除最小号节点,验证下一个顺序节点成为“锁拥有者”。