ZooKeeper节点类型与分布式锁
1,zookeeper节点类型。
1)是否持久
image.png
persistent
:持久节点。需要主动删除
ephemeral
: 瞬时节点。与客户端session结束,自动删除; 不能有子节点
2)是否有序
persistent_sequential
: 持久有序节点。
eg: create -s /zk/n6_ n6
Created /zk/n6_0000000006
ephemeral_sequential
: 瞬时有序节点。
eg:create -e -s /zk/temp/t4 t4
Created /zk/temp/t40000000003
3)CreateMode节点数据类型
4)zk数据存储结构
image.png
5)命令介绍
ls命令
: 列出Zookeeper指定节点下,下一级的所有子节点。
get命令
: 获取指定节点的数据内容和属性信息。
set命令
:set path data [version] 设置节点的数据和版本
create命令
:create [-s] [-e] path data acl 创建一个新节点。
delete命令
:删除节点。
2,zk watch
1)通过3个读调用可以设置watches。
We can set watches with the three calls that read the state of ZooKeeper
exists, getData, and getChildren
2)Created event:Enabled with a call to exists.
Deleted event:Enabled with a call to exists, getData, and getChildren.
Changed event:Enabled with a call to exists and getData.
Child event:Enabled with a call to getChildren.
3,瞬时有序节点实现分布式锁
1)znode 可以被监控。
节点数据修改、子节点变化、节点删除等。
一旦变化可以通知设置监控的客户端。
通过这个特性可以实现的功能包括配置的集中管理,集群管理,分布式锁等等。
2)分布式锁步骤。
注:zk设置watcher的操作和读操作是原子的。读取子节点列表同时设置监听器
1. 父节点持久节点/lock
2. 所有客户端在/lock下创建 瞬时有序节点/lock/seq-0000000000、/lock/seq-0000000001、依次类推
3. 获取/lock下所有子节点getChildren("/lock")方法,判断自己是否为最小的。是:获取锁; 否:监听自己前一位子节点的删除消息(调用exist()方法,同时注册事件监听。 ),获得通知后重复该步骤。
4. 执行代码。完成后释放锁。
4)使用zookeeper + curator,完成分布式锁。