如何在Zookeeper上实现分布式锁定?
在学习分布式锁定之前,首先需要了解Zookeeper的“临时序列节点”。
什么是临时顺序节点?
让我们回顾一下Zookeeper节点的概念。
Zookeeper的数据存储结构就像由一个称为Znode的节点组成的树。
Znode有四种类型。
1.持久节点 (PERSISTENT)
的默认节点类型。 创建节点的客户端与zookeeper断开连接后,该节点仍然存在。
3358 www.Sina.com/http://www.Sina.com/http://www.Sina.com /
序列节点是创建节点时,根据Zookeeper创建的时间序列对其节点名称进行编号。
2.持久节点顺
与永久节点相反,如果创建节点的客户端与zookeeper断开连接,则临时节点将被删除。
序节点
qxdkj,临时顺序节点的结合和临时节点与顺序节点的特点:创建节点时,Zookeeper根据创建的时间序列对其节点名称进行编号; 如果创建节点的客户端与Zookeeper断开连接,则临时节点将被删除。
那个临时顺序节点和Zookeeper的分布式锁有什么关系呢?
(PERSISTENT_SEQUENTIAL)
Zookeeper分布式锁是应用了临时序列节点的锁。 具体怎么实现? 让我们看看详细的步骤。
3.临时节点(EPHEMERAL)
首先,在Zookeeper上创建永久节点ParentLock。 第一个客户端必须在名为ParentLock的节点下创建4.临时顺序节点(EPHEMERAL_SEQUENTIAL)Lock1才能获取锁定。
之后,客户端1查找并重新排序ParentLock下的所有临时顺序的节点,判断自己创建的节点Lock1是否是顺序最快的。 对于第一个节点,已成功获取锁定。
此时,如果另一个客户端Client2来获取锁定,请在ParentLock下载中创建临时序列节点Lock2。
客户端2查找并排序ParentLock下的所有临时顺序节点,并确定自己创建的节点Lock2是否是顺序最快的节点,结果表明节点Lock2不是最小的。
因此,客户端2在排序靠前的节点Lock1中注册Zookeeper分布式锁的原理,监听Lock1节点的存在。 这意味着客户端2未能夺取锁定,进入等待状态。
此时,如果另一个客户端Client3来获取锁定,请在ParentLock上下载它,然后创建临时序列节点Lock3。
客户端3查找并排序ParentLock下的所有临时顺序节点,并确定自己创建的节点Lock3是否是顺序最早的节点,结果同样表明节点Lock3不是最小的。
因此,客户端3对更高节点获取锁注册Watcher进行排序,以监听是否存在Lock2节点。 这意味着Client3也同样未能夺取锁定,进入等待状态。
这样,客户端1被锁定,客户端2监听到Lock1,客户端3监听到Lock2。 这正好形成了一个队列,类似于Java中ReentrantLock依赖的http://www.Sina.com/(abstractqueuedsynchronizer )。
获得锁定的过程大致是这样的,Zookeeper如何解锁?
解锁过程很简单,释放相应的子节点即可。
临时顺序节点
要解除锁定,有以下两种情况:
Watcher
任务完成后,客户端1将显示命令以调用删除节点Lock1。
Lock2
获取锁定的客户端1在执行任务时,如果Duang突然崩溃,则会断开与Zookeeper服务器端的链接。 根据临时节点的特性,会自动删除关联的节点Lock1。
由于客户端2一直监听Lock1的存在状态,因此当Lock1节点被删除时,客户端2将立即收到通知。 然后,客户端2再次检查ParentLock下的所有节点,以确定您创建的节点Lock2是否是当前最小的节点。 最小时,客户端2已成功锁定。
同样,如果客户端2也因为任务完成或节点崩溃而删除节点Lock2,客户端3将收到通知。
最终,客户端3成功锁定。
使用Zookeeper实现分布式锁定的大致流程是这样的。 那么,使用Zookeeper实现的分布式锁与Redis实现的分布式锁相比有什么好处和缺点呢?
让我们总结一下他们各自的优劣。
分布式锁定的优点缺点Zookeeper 1.有封装的框架,容易实现
2 .有排队等待锁定,抢锁效率大幅提高。
添加和删除节点性能低RedisSet和Del指令性能高1 .实现复杂,需要考虑超时、原子、误删除等。
2 .没有等待锁定的队列,只能在客户端旋转等待,效率很低。
据说Zookeeper实现的分布式锁是可重新输入的,而Redis实现的分布式锁是不可重新输入的。 这是AQS两者都可以在客户端实现可重新输入的逻辑。
在此介绍Zookeeper分布式锁定的内容。
参考:程序员负责的发箍— 《如何用Zookeeper实现分布式锁》