Zookeeper的分布式锁的实现方式
这篇文章主要讲解了"Zookeeper的分布式锁的实现方式",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Zookeeper的分布式锁的实现方式"吧!
1. 背景
最近在学习 Zookeeper,在刚开始接触 Zookeeper 的时候,完全不知道 Zookeeper 有什么用。且很多资料都是将 Zookeeper 描述成一个"类 Unix/Linux 文件系统"的中间件,导致我很难将类 Unix/Linux 文件系统的 Zookeeper 和分布式应用联系在一起。后来在粗读了《ZooKeeper 分布式过程协同技术详解》和《从Paxos到Zookeeper 分布式一致性原理与实践》两本书,并动手写了一些 CURD demo 后,初步对 Zookeeper 有了一定的了解。不过比较肤浅,为了进一步加深对 Zookeeper 的认识,我利用空闲时间编写了本篇文章对应的 demo - 基于 Zookeeper 的分布式锁实现。通过编写这个分布式锁 demo,使我对 Zookeeper 的 watcher 机制、Zookeeper 的用途等有了更进一步的认识。不过我所编写的分布式锁还是比较简陋的,实现的也不够优美,仅仅是个练习,仅供参考使用。好了,题外话就说到这里,接下来我们就来聊聊基于 Zookeeper 的分布式锁实现。
2. 独占锁和读写锁的实现
在本章,我将分别说明独占锁和读写锁详细的实现过程,并配以相应的流程图帮助大家了解实现的过程。这里先说说独占锁的实现。
2.1 独占锁的实现
独占锁又称排它锁,从字面意思上很容易理解他们的用途。即如果某个操作 O1 对访问资源 R1 的过程加锁,在操作 O1 结束对资源 R1 访问前,其他操作不允许访问资源 R1。以上算是对独占锁的简单定义了,那么这段定义在 Zookeeper 的"类 Unix/Linux 文件系统"的结构中是怎样实现的呢?在锁答案前,我们先看张图:
图1 独占锁的 Zookeeper 节点结构
如上图,对于独占锁,我们可以将资源 R1 看做是 lock 节点,操作 O1 访问资源 R1 看做创建 lock 节点,释放资源 R1 看做删除 lock 节点。这样我们就将独占锁的定义对应于具体的 Zookeeper 节点结构,通过创建 lock 节点获取锁,删除节点释放锁。详细的过程如下:
多个客户端竞争创建 lock 临时节点 其中某个客户端成功创建 lock 节点,其他客户端对 lock 节点设置 watcher 持有锁的客户端删除 lock 节点或该客户端崩溃,由 Zookeeper 删除 lock 节点 其他客户端获得 lock 节点被删除的通知 重复上述4个步骤,直至无客户端在等待获取锁了
2.2 读写锁的实现
自己创建的节点序号排在所有其他子节点前面 自己创建的节点前面无写锁节点
读写锁的第一种实现
所有客户端创建自己的锁节点 从 Zookeeper 端获取 /share_lock 下所有的子节点,并对 /share_lock 节点设置 watcher 判断自己创建的锁节点是否可以获取锁,如果可以,持有锁。 否则继续等待
持有锁的客户端删除自己的锁节点,其他客户端收到 /share_lock 子节点变动的通知 重复步骤2、3、4,直至无客户端在等待获取锁了
读写锁的第二种实现
所有客户端创建自己的锁节点 从 Zookeeper 端获取 /share_lock 下所有的子节点 判断自己创建的锁节点是否可以获取锁,如果可以,持有锁。 否则对自己关心的锁节点设置 watcher
持有锁的客户端删除自己的锁节点,某个客户端收到该节点被删除的通知,并获取锁 重复步骤4,直至无客户端在等待获取锁了
感谢各位的阅读,以上就是"Zookeeper的分布式锁的实现方式"的内容了,经过本文的学习后,相信大家对Zookeeper的分布式锁的实现方式这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!