# 🌨Zookeeper 数据模型
ZooKeeper 是一个树形目录服务,其数据模型和 Unix 的文件系统目录树很类似,拥有一个层次化结构。
这里面的每一个节点都被称为: ZNode,每个节点上都会保存自己的数据和节点信息。
节点可以拥有子节点,同时也允许少量(1MB)数据存储在该节点之下。
节点可以分为四大类:
- PERSISTENT 持久化节点
- EPHEMERAL 临时节点 :-e
- PERSISTENT_SEQUENTIAL 持久化顺序节点 :-s
- EPHEMERAL_SEQUENTIAL 临时顺序节点 :-es
# 🌨Zookeeper 常用命令
# ☃️服务端常用命令
启动 ZooKeeper 服务
./zkServer.sh start |
查看 ZooKeeper 服务状态
./zkServer.sh status |
停止 ZooKeeper 服务
./zkServer.sh stop |
重启 ZooKeeper 服务
./zkServer.sh restart |
# ☃️客户端常用命令
连接 ZooKeeper 服务端
./zkCli.sh –server ip:port |
断开连接
quit |
查看命令帮助
help |
显示指定目录下节点
ls 目录 |
创建节点
create /节点path value |
获取节点值
get /节点path |
设置节点值
set /节点path value |
删除单个节点
delete /节点path |
删除带有子节点的节点
deleteall /节点path |
创建临时节点
create -e /节点path value |
创建顺序节点
create -s /节点path value |
查询节点详细信息
ls –s /节点path |
czxid:节点被创建的事务 ID ctime: 创建时间 mzxid: 最后一次被更新的事务 ID mtime: 修改时间 pzxid:子节点列表最后一次被更新的事务 IDcversion:子节点的版本号
dataversion:数据版本号 aclversion:权限版本号 ephemeralOwner:用于临时节点,代表临时节点的事务 ID,如果为持久节点则为 0 dataLength:节点存储的数据的长度 numChildren:当前节点的子节点个数
# 🌨Curator API 常用操作
建立连接
添加节点
删除节点
修改节点
查询节点
Watch 事件监听
分布式锁实现
# 🌨ZooKeeper 分布式锁原理
核心思想:当客户端要获取锁,则创建节点,使用完锁,则删除该节点。
- 客户端获取锁时,在 lock 节点下创建临时顺序节点。
- 然后获取 lock 下面的所有子节点,客户端获取到所有的子节点之后,如果发现自己创建的子节点序号最小,那么就认为该客户端获取到了锁。使用完锁后,将该节点删除。
- 如果发现自己创建的节点并非 lock 所有子节点中最小的,说明自己还没有获取到锁,此时客户端需要找到比自己小的那个节点,同时对其注册事件监听器,监听删除事件。
- 如果发现比自己小的那个节点被删除,则客户端的 Watcher 会收到相应通知,此时再次判断自己创建的节点 是否是 lock 子节点中序号最小的,如果是则获取到了锁, 如果不是则重复以上步骤继续获取到比自己小的一个节点 并注册监听。
# 🌨Curator 分布式锁 API
在 Curator 中有五种锁方案:
- InterProcessSemaphoreMutex:分布式排它锁(非可重入锁)
- InterProcessMutex:分布式可重入排它锁
- InterProcessReadWriteLock:分布式读写锁
- InterProcessMultiLock:将多个锁作为单个实体管理的容器
- InterProcessSemaphoreV2:共享信号量