ZooKeeper分布式锁的实现原理

zookeeper的应用:分布式应用配置管理,统一命名服务,状态同步服务,集群管理.

Curator开源框架对Zookeeper分布式锁的实现.

举个栗子:zookeeper里面有一把锁,这个锁就是Zookeeper上的一个节点,然后,两个客户端都要来获取这个锁:

假设客户端A抢先了一步,对Zookeeper发起了加分布式锁的请求,这个加锁请求是用到了Zookeeper中的一个特殊概念:"临时顺序节点".

简单来说,就是直接在"my_lock"这个锁节点下,创建一个顺序节点,这个顺序节点有zk内部自行维护的一个节点序号。

比如说,第一个客户端来搞一个顺序节点,zk内部会给起个名字叫做:xxx-000001。然后第二个客户端来搞一个顺序节点,zk可能会起个名字叫做:xxx-000002。大家注意一下,最后一个数字都是依次递增的,从1开始逐次递增。zk会维护这个顺序。

客户端A都加完锁了,客户端B过来想要加锁了,这个时候他会干一样的事儿:先是在"my_lock"这个锁节点下创建一个临时顺序节点;

由于客户端B不是第一个节点,客户端B就会同归Zookeeper的Api,对他的上一个顺序节点加一个监听器.

当客户端A执行完成之后,会进行释放锁操作,同时对Zookeeper中自己的顺序节点进行删除.而客户端B的监听器感知到了上一个节点被删除,此时就会通知客户端B重新尝试去获取锁,这是B发现自己是顺序节点里面的第一个了,就进行加锁操作.

ZooKeeper分布式锁的实现原理