基于zookeeper实现分布式锁的原理

Posted 奥特曼liu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于zookeeper实现分布式锁的原理相关的知识,希望对你有一定的参考价值。

基于zookeeper实现分布式锁的原理

顺序节点特性:

使用zookeeper的顺序节点特性,假如我们在/lock目录下创建3个节点,ZK集群会按照发起创建的顺序来创建节点,节点分别为/lock/000000000001、/lock/000000000002、/lock/000000000003,最后一位数是依次递增的,节点名由zk来完成。

临时节点特性:

临时节点由某个客户端创建,当客户端与ZK集群断开连接,则该节点自动被删除。EPHEMERAL_SEQUEBTUAL为临时顺序节点。

根据ZK中节点是否存在,可以作为分布式锁的锁状态,以此来实现一个分布式锁。

加锁流程:

1.客户端1调用create()方法创建名为“/业务ID/lock-"的临时顺序节点。

2.客户端1调用getChildren(“业务ID”)方法来获取所有已经创建的子节点。

3.客户端获取到所有子节点path之后,如果发现自己在步骤1中创建的节点是所有节点中序号最小的,就是看自己创建的序号是否排第一,如果是第一,那么就认为这个客户端1获得了锁,在它前面没有别的客户端拿到锁。

4.如果创建的节点不是所有节点中最小的,那么则监视比自己创建节点的序列号小的最大的节点,进入等待。直到下次监视的子节点变更的时候,在进行子节点的获取,判断是否获取锁。

释放锁流程

等待获取锁的客户端执行完业务流程,直接删除当前的最小的临时顺序节点(L)即可。这样监听L的删除事件的客户端,就会被通知到,尝试进行锁的获取。

总结

优点:

zookeeper天生设计定位就是分布式协调,强一致性。锁的模型健壮、简单易用、适合做分布式锁。如果获取不到锁,只需要添加一个监听器就可以了,不用一直轮询,性能消耗较小。

缺点:

代码通过Watcher机制实现,实现相对复杂。

以上是关于基于zookeeper实现分布式锁的原理的主要内容,如果未能解决你的问题,请参考以下文章

彻底讲清楚ZooKeeper分布式锁的实现原理

一文彻底理解ZooKeeper分布式锁的实现原理

七张图彻底讲清楚ZooKeeper分布式锁的实现原理石杉的架构笔记

RedisZookeeper实现分布式锁——原理与实践

分布式锁的三种实现方式及其比较

7 张图讲清楚ZooKeeper分布式锁实现原理