分布式技术原理与算法解析
聂鹏程
智载云帆CTO,前华为分布式Lab资深技术专家
立即订阅
5969 人已学习
课程目录
已更新 36 讲 / 共 34 讲
0/4登录后,你可以任选4讲全文学习。
课前必读 (3讲)
开篇词 | 四纵四横,带你透彻理解分布式技术
免费
01 | 分布式缘何而起:从单兵,到游击队,到集团军
02 | 分布式系统的指标:啥是分布式的三围
第一站:分布式协调与同步 (6讲)
03 | 分布式互斥:有你没我,有我没你
04 | 分布式选举:国不可一日无君
05 | 分布式共识:存异求同
06 | 分布式事务:All or nothing
07 | 分布式锁:关键重地,非请勿入
08 | 分布式技术是如何引爆人工智能的?
第二站:分布式资源管理与负载调度 (6讲)
09 | 分布式体系结构之集中式结构:一人在上,万人在下
10 | 分布式体系结构之非集中式结构:众生平等
11 | 分布式调度架构之单体调度:物质文明、精神文明一手抓
12 | 分布式调度架构之两层调度:物质文明、精神文明两手抓
13 | 分布式调度架构之共享状态调度:物质文明、精神文明多手协商抓
14 | 答疑篇:分布式事务与分布式锁相关问题
第三站:分布式计算技术 (4讲)
15 | 分布式计算模式之MR:一门同流合污的艺术
16 | 分布式计算模式之Stream:一门背锅的艺术
17 | 分布式计算模式之Actor:一门甩锅的艺术
18 | 分布式计算模式之流水线:你方唱罢我登场
第四站:分布式通信技术 (4讲)
19 | 分布式通信之远程调用:我是你的千里眼
20 | 分布式通信之发布订阅:送货上门
21 | 分布式通信之消息队列:货物自取
22 | 答疑篇:分布式体系架构与分布式计算相关问题
第五站:分布式数据存储 (5讲)
23 | CAP理论:这顶帽子我不想要
24 | 分布式数据存储系统之三要素:顾客、导购与货架
25 | 数据分布方式之哈希与一致性哈希:“掐指一算”与“掐指两算”的事
26 | 分布式数据复制技术:分身有术
27 | 分布式数据之缓存技术:“身手钥钱”随身带
特别放送 (3讲)
特别放送 | 分布式下的一致性杂谈
特别放送 | 徐志强:学习这件事儿,不到长城非好汉
特别放送 | 那些你不能错过的分布式系统论文
第六站:分布式高可靠 (5讲)
28 | 分布式高可靠之负载均衡:不患寡,而患不均
29 | 分布式高可靠之流量控制:大禹治水,在疏不在堵
30 | 分布式高可用之故障隔离:当断不断,反受其乱
31 | 分布式高可用之故障恢复:知错能改,善莫大焉
32 | 答疑篇:如何判断并解决网络分区问题?
分布式技术原理与算法解析
登录|注册

07 | 分布式锁:关键重地,非请勿入

聂鹏程 2019-10-07
你好,我是聂鹏程。今天,我来继续带你打卡分布式核心技术。
我在第 3 篇文章中,与你一起学习了分布式互斥,领悟了其“有你没我,有我没你”的精髓,为你解释了同一临界资源同一时刻只能被一个程序访问的问题,并介绍了解决分布式互斥的算法。
不知道你有没有发现一个细节,在之前介绍的算法中,我主要讲了如何协调多个进程获取权限和根据权限有序访问共享资源,“获得访问权限的进程可以访问共享资源,其他进程必须等待拥有该权限的进程释放权限”。但是,我并没有介绍在访问共享资源时,这个权限是如何设置或产生的,以及设置或产生这个权限的工作原理是什么。
那么,在本讲,我就将带你一起打卡分布式锁,去学习分布式锁是如何解决这个问题的。

为什么要使用分布锁?

首先,我先带你认识一下什么是锁。
在单机多线程环境中,我们经常遇到多个线程访问同一个共享资源(这里需要注意的是:在很多地方,这种资源会称为临界资源,但在今天这篇文章中,我们统一称之为共享资源)的情况。为了维护数据的一致性,我们需要某种机制来保证只有满足某个条件的线程才能访问资源,不满足条件的线程只能等待,在下一轮竞争中重新满足条件时才能访问资源。
这个机制指的是,为了实现分布式互斥,在某个地方做个标记,这个标记每个线程都能看到,到标记不存在时可以设置该标记,当标记被设置后,其他线程只能等待拥有该标记的线程执行完成,并释放该标记后,才能去设置该标记和访问共享资源。这里的标记,就是我们常说的
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《分布式技术原理与算法解析》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(31)

  • 忆水寒
    分布式锁是实现互斥的一种手段。
    2019-10-07
    1
    6
  • Eternal
    学完3-7节我自己总结了一下个人的理解:
    分布式协调与同步的场景中需要解决一些通用问题
    1.分布式系统中,多个节点都需要访问一个临界资源,但是同一时刻只能有一个节点可以访问,为了解决这个问题就是要通过分布式互斥来实现,老师说的有你没我,有我没你;分布式锁就是实现分布式互斥的一种实现方式
    2.分布式系统中,多个节点需要同时写一份相同的数据,怎么保证数据写的是一致的呢?需要一个节点来协调,这个协调节点叫做leader,它是怎么产生的呢?是通过选举产生的,这就是分布式选举;
    3.分布式系统中,多个节点达成某一项共识可以通过选举(投票)的方式实现,选举不简单是少数服从多数,还有一些拓展:投票的时候考虑优先级,考虑权重,考虑代理等
    4.分布式系统中除了互斥,达成共识还有协同作战:分布式事务,多个节点同时做一件事,要么全成功,要么全失败;本来单机事务是通过数据库(Mysql)的多版本MVCC实现的,现在在分布式环境中,每个节点都有数据库,不能实现分布式事务了,现在需要通过程序来模拟实现单机事务的特性ACID。考虑实际情况,XA协议下的2阶段和3阶段提交都不能很好的满足需求,衍生出了新的理论(BASE)来实现


    作者回复: 总结得很到位,加油!

    2019-10-26
    5
  • Dale
    分布式互斥是在分布式系统中存在多个节点共享某个资源或临界区,任何时刻只允许一个进程访问资源或执行临界区,而分布式锁正好是解决分布式互斥的一种方法。

    作者回复: 总结得很到位,加油!

    2019-10-09
    4
  • 小咖
    这课程买的太赚了
    2019-10-26
    3
  • 任鹏斌
    老师关于redis的分布式锁还有几个问题
    1、setnx加过期时间的原子性问题(目前应该已经解决)
    2、锁的续期问题
    3、如果redis集群或者主从模式下只写入一个节点时挂掉导致锁失效

    期望老师答疑时详细说一下
    2019-10-18
    3
  • xfan
    最后一段有些问题 应改为若本进程为写请求,则向比自己序号小的最后一个请求节点注册监听事件,因为写和写之间也是互斥的。

    编辑回复: 这个问题已经修正,非常感谢你的反馈~

    2019-10-14
    3
  • 卫江
    老师,想问一个问题,通过zoomkeeper来实现分布式锁,等发生网络中断的对应的临时节点会消失来实现分布式锁的异常情况,我们知道进程挂掉会触发相应的文件引用计数减一,一般情况下会把连接关闭,但是如果是正常的网络中断引起的临时节点消失,从而其他进程获取锁,但是可能发生网络中断的进程业务并没有处理完成,这个该怎么办?
    2019-10-07
    3
  • miracle
    1 .redis 不用通过超时来释放锁,DEL操作可以直接释放不用等到超时
    2. redis 官方已经明确说明不推荐 setnx 来实现分布式锁了(https://redis.io/commands/setnx) 官方给出了 the Redlock algorithm 各语言的实现版本是来实现分布式锁的机制,比如JAVA的实现版本(https://github.com/redisson/redisson) 所以从可靠性来讲并不比zk的方案差
    2019-10-31
    1
    2
  • 开心小毛
    请老师确认一下redis是否会为一个KEY建立等待队列。我以为,Redis的分布式锁根本没有队列,收到setnx返回为0的进程会不断的重试,直到某一次的重试成为DEL命令后第一个到达的setnx从而获得锁,至于此进程在等待获得锁的众多进程中是不是第一个发出setnx的,redis并不关心。
    2019-10-13
    2
    2
  • Geek_f6f02b
    分布式锁与分布式互斥的关系是什么呢?
    我觉得分布式互斥是前提条件或者说实现目的,而分布式锁是手段或者说是实现方法。
    还有文章中有2个地方不理解。一个是那个zookeeper实现分布式锁的,写请求为什么说是要等待比自己小的读请求结束,如果是比自己小的写请求就不用等待了吗?我理解是,自己为读请求就等待比自己小的写请求结束,写请求就等待所有比自己小的所有请求结束。另一个不理解也是类似问题,就是下面那个写watch应该是等等比自己小的那个事件就结束添加watch事件吧?
    2019-10-07
    2
  • xiaobang
    分布式锁实现了分布式互斥的集中式算法?
    2019-11-07
    1
  • Li Shunduo
    redis的分布式锁如何实现排队?
    2019-10-12
    1
    1
  • 布小丫学编程
    分布式锁的锁就是分布式互斥的,各个线程通过随机算法获得这个锁。
    2019-11-26
  • 各种分布式锁各有优缺点,zookeeper也有不足,还是需要根据自己的场景选择合适的方案
    2019-11-26
  • 普通熊猫 ଘ(੭ˊ꒳​ˋ)੭✧
    关于数据库锁,有疑问请教:文中购买商品的例子,既然商品的个数是存储在数据库中的,是否应该考虑将这条商品记录的行锁作为分布式锁,使用select…for update(nowait),谁拿到行锁,谁可以修改。

    之所以这样考虑,原因是减库存过程中修改数据库行这一步是省不了的,并且很多情况下的确能找到这样一行数据库记录就是对应着它们的共享资源。既然无法省略,而且也必须是互斥访问的,不如顺便就把行锁的任务也接下来吧。

    如果考虑到接单速度不够快,可以在前面加一个mq接单。如果觉得消费速度不够快,可以在数据库中多创建几行存储商品库存。
    2019-11-03
  • kylexy_0817
    Redis的方案,是否可以直接把库存读到内存中,用incr命令进行操作会不会简单点呢?目前所有Redis版本都是基于单线程epoll实现,每个请求进来都会天然进入等待队列顺序执行,所以不会有并发问题
    2019-11-01
  • Eternal
    想到一个疑问:分布式互斥和分布式同步,有什么区别呢?单机下,可以通过信号量,锁来实现互斥同步;分布式环境下,占有锁的线程怎么同步阻塞的其它线程?阻塞的线程是同步阻塞还是异步阻塞?
    分布式环境下,竞争锁的线程是公平竞争还是非公平竞争呢?
    2019-10-26
  • Eternal
    数据库实现的分布式锁,可以算作通过集中式实现的分布式互斥。
    zk、redis实现的分布式锁,可以算作民主协商的方式实现的分布式互斥。这样理解对吗
    2019-10-26
    1
  • 阿卡牛
    锁和事务是什么关系?锁是用来实现事务的?
    2019-10-22
  • 波波安
    分布式锁是实现分布式互斥的一个方式。
    2019-10-19
收起评论
31
返回
顶部