ZooKeeper节点类型与分布式锁

1,zookeeper节点类型。

1)是否持久
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节点数据类型

image.png

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)apache开源curator使用zookeeper实现了分布式锁。
5)未解决问题:
客户端A加锁成功,此时发生GC过长,Zookeeper检测不到心跳,自动删除了临时节点。客户端B加锁成功,则可能出现同时操作共享资源的情况。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容