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-。
常见问题与排错#
-
临时节点未自动删除
- 排查:会话是否真正断开、是否存在长连接。
bash # 查看客户端会话(需开启 4lw) echo ruok | nc 127.0.0.1 2181 echo cons | nc 127.0.0.1 2181
- 处理:确认客户端关闭或超时配置tickTime、sessionTimeout。 -
顺序号不连续
- 说明:顺序号保证单调递增,不保证连续;是正常现象。 -
创建临时节点失败
- 可能原因:父节点不存在或权限不足。
bash create /services "" # 先创建父节点
练习#
- 创建
/conf/db持久节点,写入mysql=8.0,验证断开重连后仍存在。 - 创建 3 个临时顺序节点
/locks/lock-,观察编号排序并模拟“最小号获锁”。 - 手动删除最小号节点,验证下一个顺序节点成为“锁拥有者”。