ZooKeeper实现分布式锁

什么是分布式锁

在单体的应用开发场景中涉及并发同步的时候,大家往往采用Synchronized(同步)或者其他同一个JVM内Lock机制来解决多线程间的同步问题。在分布式集群工作的开发场景中,就需要一种更加高级的锁机制来处理跨机器的进程之间的数据同步问题,这种跨机器的锁就是分布式锁。

目前分布式锁,比较成熟、主流的方案:

(1)基于数据库的分布式锁。db操作性能较差,并且有锁表的风险,一般不考虑。

(2)基于Redis的分布式锁。适用于并发量很大、性能要求很高而可靠性问题可以通过其他方案去弥补的场景。

(3)基于ZooKeeper的分布式锁。适用于高可靠(高可用),而并发量不是太高的场景。

基于Redis实现分布式锁可以参考对应的文章。

传送门:https://blog.csdn.net/u010355502/article/details/132241180

基于数据的设计思路:

利用数据库唯一索引的排它性。大概步骤如下:

向数据库表插入一条数据,字段对应唯一索引

如果插入成功,表示获取到了锁

继续执行同步业务逻辑;

释放锁,即删除插入的唯一索引记录;

如果插入失败,需要等待获取锁

轮循插入唯一索引记录,插入成功表示获取到了锁,继续执行同步业务逻辑完后释放锁;

如何防止死锁?

如果获取锁的客户端宕机,导致加锁记录没有被删除,那么其它的客户端就永远获取不到锁了,此时就产生了死锁。可以在加锁时带上一个过期时间插入到记录中,比如30秒,另起一个分布式定时任务定期检查过期时间,如果过期了就删除掉对应的记录(解锁)。在客户端加锁时也起一个异步任务,如果检查到当前加锁业务逻辑还没执行完,则更新数据库锁记录的过期时间(锁续期),比如10秒。如此以来,就解决了数据库实现锁带来的死锁问题。(其实借鉴的就是redisson实现分布式锁的原理~)

大部分分布式环境下redis基本就是标配,而且锁性能比数据库高多了,所以基本不会用到数据实现分布式锁。

ZooKeeper实现分布式锁

设计思路一

大概流程如下:

客户端尝试获取锁

创建临时节点/lock

是否创建成功

成功则获取到了锁

执行同步逻辑

执行完后释放锁

失败则等待,监听该/lock节点

直到收到节点被删除的通知,然后再次尝试获取锁,重试第一步

上面的思路有个问题,即羊群效应:当锁被释放后,所有的其他客户端都会收到锁被释放的通知,但是最终只有一个客户端能竞争到锁,其他的客户端竞争锁请求都是无效的,消耗性能,这个就是羊群效应。

设计思路二

使用临时顺序ZNode来表示获取锁的请求,创建最小后缀数字ZNode的用户成功拿到锁。公平锁的实现。

在实际的开发中,如果需要使用到分布式锁,不建议去自己"重复造轮子",而建议直接使用Curator客户端中的各种官方实现的分布式锁,例如其中的InterProcessMutex可重入锁。

Curator客户端分布式锁

如何使用

curator是zk的客户端,实现了zk的分布式锁,具体如何使用,请参考如下文章。

传送门:https://blog.csdn.net/u010355502/article/details/132316237

优缺点

  • 优点

ZooKeeper分布式锁(如InterProcessMutex),具备高可用、可重入、阻塞锁特性,可解决失效死锁问题,使用起来也较为简单。

  • 缺点

因为需要频繁地创建和删除节点,性能上不如Redis。

在高性能、高并发的应用场景下,不建议使用ZooKeeper的分布式锁。而由于ZooKeeper的高可用性,因此在并发量不是太高的应用场景中,还是推荐使用ZooKeeper的分布式锁。

相关推荐
qq_124987075317 分钟前
基于Hadoop的信贷风险评估的数据可视化分析与预测系统的设计与实现(源码+论文+部署+安装)
大数据·人工智能·hadoop·分布式·信息可视化·毕业设计·计算机毕业设计
Coder_Boy_3 小时前
基于Spring AI的分布式在线考试系统-事件处理架构实现方案
人工智能·spring boot·分布式·spring
袁煦丞 cpolar内网穿透实验室4 小时前
远程调试内网 Kafka 不再求运维!cpolar 内网穿透实验室第 791 个成功挑战
运维·分布式·kafka·远程工作·内网穿透·cpolar
人间打气筒(Ada)4 小时前
GlusterFS实现KVM高可用及热迁移
分布式·虚拟化·kvm·高可用·glusterfs·热迁移
xu_yule4 小时前
Redis存储(15)Redis的应用_分布式锁_Lua脚本/Redlock算法
数据库·redis·分布式
難釋懷8 小时前
分布式锁的原子性问题
分布式
ai_xiaogui9 小时前
【开源前瞻】从“咸鱼”到“超级个体”:谈谈 Panelai 分布式子服务器管理系统的设计架构与 UI 演进
服务器·分布式·架构·分布式架构·panelai·开源面板·ai工具开发
凯子坚持 c10 小时前
如何基于 CANN 原生能力,构建一个支持 QoS 感知的 LLM 推理调度器
分布式
飞升不如收破烂~10 小时前
Redis 分布式锁+接口幂等性使用+当下流行的限流方案「落地实操」+用户连续点击两下按钮的解决方案自用总结
数据库·redis·分布式