07 | 分布式锁:关键重地,非请勿入
聂鹏程
该思维导图由 AI 生成,仅供参考
你好,我是聂鹏程。今天,我来继续带你打卡分布式核心技术。
不知道你有没有发现一个细节,在之前介绍的算法中,我主要讲了如何协调多个进程获取权限和根据权限有序访问共享资源,“获得访问权限的进程可以访问共享资源,其他进程必须等待拥有该权限的进程释放权限”。但是,我并没有介绍在访问共享资源时,这个权限是如何设置或产生的,以及设置或产生这个权限的工作原理是什么。
那么,在本讲,我就将带你一起打卡分布式锁,去学习分布式锁是如何解决这个问题的。
为什么要使用分布锁?
首先,我先带你认识一下什么是锁。
在单机系统中,经常会有多个线程访问同一种资源的情况,我们把这样的资源叫做共享资源,或者叫做临界资源。为了维护线程操作的有效性和正确性,我们需要某种机制来减少低效率的操作,避免同时对相同数据进行不一样的操作,维护数据的一致性,防止数据丢失。也就是说,我们需要一种互斥机制,按照某种规则对多个线程进行排队,依次、互不干扰地访问共享资源。
这个机制指的是,为了实现分布式互斥,在某个地方做个标记,这个标记每个线程都能看到,到标记不存在时可以设置该标记,当标记被设置后,其他线程只能等待拥有该标记的线程执行完成,并释放该标记后,才能去设置该标记和访问共享资源。这里的标记,就是我们常说的锁。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
分布式锁是分布式系统中保证共享资源互斥访问的重要机制。本文介绍了基于数据库、缓存和ZooKeeper三种主流实现方式,并以电商售卖吹风机的场景为例,生动阐述了它们的具体应用过程。基于缓存的实现方式通过Redis的setnx函数维护进程访问共享资源的先后顺序,性能更好且使用方便,但存在超时时间控制不靠谱的问题。基于ZooKeeper的实现方式通过临时顺序节点解决了单点故障和不可重入等问题,但实现较复杂且性能不如基于缓存的方式。总的来说,ZooKeeper是最简单的选择,具备较高的可靠性和封装好的框架。此外,文章还提到了解决分布式锁的羊群效应问题的具体方法。总结来说,为了确保分布式锁的可用性,设计时应考虑互斥性、锁失效机制、可重入性和高可用的获取锁和释放锁的功能。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《分布式技术原理与算法解析》,新⼈⾸单¥59
《分布式技术原理与算法解析》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(55)
- 最新
- 精选
- Eternal学完3-7节我自己总结了一下个人的理解: 分布式协调与同步的场景中需要解决一些通用问题 1.分布式系统中,多个节点都需要访问一个临界资源,但是同一时刻只能有一个节点可以访问,为了解决这个问题就是要通过分布式互斥来实现,老师说的有你没我,有我没你;分布式锁就是实现分布式互斥的一种实现方式 2.分布式系统中,多个节点需要同时写一份相同的数据,怎么保证数据写的是一致的呢?需要一个节点来协调,这个协调节点叫做leader,它是怎么产生的呢?是通过选举产生的,这就是分布式选举; 3.分布式系统中,多个节点达成某一项共识可以通过选举(投票)的方式实现,选举不简单是少数服从多数,还有一些拓展:投票的时候考虑优先级,考虑权重,考虑代理等 4.分布式系统中除了互斥,达成共识还有协同作战:分布式事务,多个节点同时做一件事,要么全成功,要么全失败;本来单机事务是通过数据库(Mysql)的多版本MVCC实现的,现在在分布式环境中,每个节点都有数据库,不能实现分布式事务了,现在需要通过程序来模拟实现单机事务的特性ACID。考虑实际情况,XA协议下的2阶段和3阶段提交都不能很好的满足需求,衍生出了新的理论(BASE)来实现
作者回复: 总结得很到位,加油!
2019-10-26329 - Dale分布式互斥是在分布式系统中存在多个节点共享某个资源或临界区,任何时刻只允许一个进程访问资源或执行临界区,而分布式锁正好是解决分布式互斥的一种方法。
作者回复: 总结得很到位,加油!
2019-10-0913 - 冬风向左吹1、分布式互斥:在一个分布式系统中,控制集群中的节点互斥的访问共享资源,算法有:集中式算法、民主协商算法(分布式算法)、民主协商算法 2、分布式锁:实现分布式互斥需要用到分布式锁。 基于数据库的分布式锁; 基于缓存的分布式锁; 基于zookeeper的分布式锁 3、分布式选举:对于一个分布式集群来说,需要对集群节点进程调度、管理,需要通过分布式选举选出leader节点。选举算法有: 长者为大:bully算法 民主投票:Raft算法 具有优先级的民主投票:ZAB算法 4、分布式共识:分布式系统中多个节点之间,彼此对某个状态达成一致结果的过程。常用的算法有: PoW(工作量证明:比特币) PoS(权益证明:以太坊) DPos(委托权益证明:比特股) 5、分布式事务:XA 是一个分布式事务协议,规定了事务管理器和资源管理器接口。事务管理器即类似于使用集中式算法对资源进行协调 二阶段提交方法(2PC):强一致性 三阶段提交方法(3PC):强一致性 基于分布式消息的最终一致性方案
作者回复: 赞👍,加油
2020-04-1211 - xfan最后一段有些问题 应改为若本进程为写请求,则向比自己序号小的最后一个请求节点注册监听事件,因为写和写之间也是互斥的。
编辑回复: 这个问题已经修正,非常感谢你的反馈~
2019-10-146 - piboye如果客户端和zk的链接突然断开,但业务又在调用api的等待中,这个时候很难说锁避免了临界资源被并发访问吧
作者回复: 你这里说的业务又在调用api的等待中,这里的api具体是指哪个的api?通常来说,客户端和zk端链,zk会检测到该客户端断开,一定时间后,该客户端所创建的临时节点会被删除,然后按照正常流程使能下一个服务。
2020-05-0641 - Jackey读请求watch比它小的写请求,写请求是不是应该watch比它小的请求(无论读写)?不然会有冲突的吧?不知道理解对不对
编辑回复: 这个问题已经修正,非常感谢你的反馈~
2019-10-1321 - 次郎老师,我有个问题,分布式锁,比如a拿到了锁执行时间超过了超时时间,那么b就可以拿到锁了,这个时候a提交数据,不就造成锁失效的问题了么?
作者回复: b拿到锁之后,a就无法提交数据了
2020-06-09 - 开心小毛若其他进程已对临界资源进行写入,则当前进程则无论读写都必须阻塞。不知老师是否同意。
作者回复: 若其他进程对临界资源已加锁,且未释放,其他进程均需等待锁释放。
2019-10-14 - miracle1 .redis 不用通过超时来释放锁,DEL操作可以直接释放不用等到超时 2. redis 官方已经明确说明不推荐 setnx 来实现分布式锁了(https://redis.io/commands/setnx) 官方给出了 the Redlock algorithm 各语言的实现版本是来实现分布式锁的机制,比如JAVA的实现版本(https://github.com/redisson/redisson) 所以从可靠性来讲并不比zk的方案差2019-10-31848
- 忆水寒分布式锁是实现互斥的一种手段。2019-10-07114
收起评论