ZooKeeper核心概念与架构
理解数据模型和集群架构是使用ZooKeeper的基础。
数据模型与节点结构
层级命名空间:
Java
/ <- 根节点
/app <- 应用节点
/app/config <- 配置节点
/app/services <- 服务节点
ZNode节点特性:
| 特性 | 说明 |
|---|---|
| 路径 | 绝对路径,如/app/config |
| 数据 | 可存储少量数据(默认1MB) |
| 子节点 | 可包含子节点 |
| ACL | 访问权限控制 |
| 时间戳 | 创建和修改时间 |
路径命名规范:
- 必须以
/开头 - 节点名称不能包含
/ - 支持多级路径
- 相对路径不支持
节点类型:
| 类型 | 说明 |
|---|---|
| 持久节点 | 永久存在,除非主动删除 |
| 临时节点 | 会话结束自动删除 |
| 顺序节点 | 自动添加序号后缀 |
提示:节点数据不宜过大,建议存储配置或元数据。
版本号与状态信息
版本号类型:
| 版本号 | 说明 | 作用 |
|---|---|---|
| dataVersion | 数据版本 | 数据每次修改递增 |
| cversion | 子节点版本 | 子节点变化递增 |
| aversion | ACL版本 | ACL变化递增 |
乐观锁机制:
Bash
// 更新时指定版本号,防止并发冲突
zk.setData("/config", newData, expectedVersion);
// 版本不匹配抛出BadVersionException
状态信息字段:
| 字段 | 说明 |
|---|---|
| czxid | 创建事务ID |
| mzxid | 最后修改事务ID |
| ctime | 创建时间 |
| mtime | 修改时间 |
| ephemeralOwner | 临时节点所属会话 |
查看状态:
text
# 命令行获取状态
get -s /app/config
# 输出包含版本号和状态信息
dataVersion = 5
cversion = 2
czxid = 0x100000001
注意:版本号机制实现乐观锁,更新需指定版本。
集群角色与架构
三种角色:
| 角色 | 职责 | 特点 |
|---|---|---|
| Leader | 处理写请求、发起投票 | 集群核心 |
| Follower | 处理读请求、参与投票 | 主力成员 |
| Observer | 处理读请求、不参与投票 | 扩展读能力 |
集群架构:
text
Leader
↙ ↘
Follower Follower
↓ ↓
Observer Observer(可选)
Leader职责:
- 处理所有写请求
- 发起提议并等待过半确认
- 管理集群状态和选举
Follower职责:
- 处理读请求
- 转发写请求给Leader
- 参Leader选举投票
- 同步Leader数据
Observer特点:
- 不参与选举投票
- 不影响写请求性能
- 可跨地域部署
- 扩展读能力
提示:Observer适合跨地域部署,降低网络延迟影响。
要点总结
- 层级命名空间类似文件系统,路径以
/开头 - 版本号实现乐观锁,更新需指定expectedVersion
- Leader处理写请求和选举,Follower处理读请求和投票
- Observer扩展读能力,不参与投票
- 节点数据不宜超过1MB
📝 发现内容有误?点击此处直接编辑