ZooKeeper 分布式锁实现原理

Posted 贝塔、

tags:

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

原理

进程需要访问共享数据时, 就在"/locks"节点下创建一个sequence类型的子节点, 称为thisPath. 当thisPath在所有子节点中最小时, 说明该进程获得了锁. 进程获得锁之后, 就可以访问共享资源了. 访问完成后, 需要将thisPath删除. 锁由新的最小的子节点获得.

进程如何知道thisPath是所有子节点中最小的呢? 可以在创建的时候, 通过getChildren方法获取子节点列表, 然后在列表中找到排名比thisPath前1位的节点, 称为waitPath, 然后在waitPath上注册监听, 当waitPath被删除后, 进程获得通知, 此时说明该进程获得了锁.

lock操作过程:

1、创建一个永久性节点,作锁的根目录

2、当要获取一个锁时,在锁目录下创建一个临时有序列的节点

3、检查锁目录的子节点是否有序列比它小,若有则监听比它小的上一个节点,当前锁处于等待状态

4、当等待时间超过Zookeeper session的连接时间(sessionTimeout)时,当前session过期,Zookeeper自动删除此session创建的临时节点,等待状态结束,获取锁失败

5、当监听器触发时,等待状态结束,获得锁

unlock操作过程:

将自己id对应的节点删除即可,对应的下一个排队的节点就可以收到Watcher事件,从而被唤醒得到锁后退出;

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

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

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

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

ZooKeeper 分布式锁实现原理

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

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