Zookeeper分布式锁原理
节点类型
Zookeeper数据结构就像树,由节点构成,节点叫做Znode
Znode分为四种类型:
1.持久化节点(PERSISTENT)
默认的节点类型,客户端与zk断开连接后,节点依然存在
2.持久化顺序节点(PERSISTENT——SEQUENTIAL)
在创建节点时zk根据创建的时间顺序对节点进行编号
3.临时节点(EPHEMERAL)
当创建节点的客户端与zk断开连接后,临时节点会被删除
断开连接
临时顺序节点
临时顺序节点结合和临时节点和顺序节点的特点:在创建节点时,Zookeeper 根据创建的时间顺序给该节点名称进行编号;当创建节点的客户端与 Zookeeper 断开连接后,临时节点会被删除。
Zookeeper分布式锁原理
zookeeper分布式锁运用了临时顺序节点的特点
获取锁:
1.在 Zookeeper 当中创建一个持久节点 ParentLock。当第一个客户端想要获得锁时,需要在 ParentLock 这个节点下面创建一个临时顺序节点 LockA。
2.ClientA 查找 ParentLock 下面所有的临时顺序节点并排序,判断自己所创建的节点 LockA 是不是顺序最靠前的一个。如果是第一个节点,则成功获得锁。
3.这时候,如果再有一个客户端 ClientB 前来获取锁,则在 ParentLock 下载再创建一个临时顺序节点 LockB。
4.ClientB 查找 ParentLock 下面所有的临时顺序节点并排序,判断自己所创建的节点 LockB 是不是顺序最靠前的一个,结果不是,ClientB 向排序仅比它靠前的节点 LockA 注册 Watcher,用于监听 Lock1A节点是否存在。这意味着 Client2B抢锁失败,进入了等待状态。
5.这时候,如果又有一个客户端 ClientC前来获取锁,则在 ParentLock 下载再创建一个临时顺序节点 LockC。
6.ClientC 查找 ParentLock 下面所有的临时顺序节点并排序,判断自己所创建的节点 LockC 是不是顺序最靠前的一个,结果同样发现节点 LockC并不是最小的。
于是,ClientC向排序仅比它靠前的节点 LockB注册 Watcher,用于监听 LockB节点是否存在。这意味着 ClientC同样抢锁失败,进入了等待状态。
这样一来,ClientA 得到了锁,ClientB监听了 LockA,ClientC监听了 LockB,形成了一个等待队列,
释放锁:
任务完成,客户端显示释放
当任务完成时,ClientA 会显示调用删除节点 LockA 的指令。
任务执行过程中,客户端崩溃
获得锁的 ClientA 在任务执行过程中,如果崩溃,则会断开与 Zookeeper 服务端的链接。根据临时节点的特性,相关联的节点 LockA 会随之自动删除。
由于 ClientB 一直监听着 LockA的存在状态,当 LockA节点被删除,ClientB会立刻收到通知。这时候 ClientB 会再次查询 ParentLock 下面的所有节点,确认自己创建的节点 LockB 是不是目前最小的节点。如果是最小,则 ClientB 顺理成章获得了锁。
ClientC也是同理