三千鸦杀,Redis分布式锁进化史,金炳万的丛林法则

频道:今日头条 日期: 浏览:304
作者:点我达技能
来历:http://tech.dianwoda.com/2018/04/11/redisfen-bu-shi-suo-jin-hua-shi/

近两年来微效劳变得越来越抢手,越来越多的运用布置在分布式环境中,在分布式环境中,数据一致性是一向以来需求重视而且去处理的问题,分布式锁也就成为了一种广泛运用的技能,常用的分布式完结办法为Redis,Zookeeper,其间根据Redis的分布式锁的运用愈加广泛。

可是在工作和网络上看到过各个版别的Redis分三千鸦杀,Redis分布式锁进化史,金炳万的森林规律布式锁完结,每种完结都有一些不谨慎的当地,甚至有或许是过错的完结,包含在代码中,假如不能正确的运用分布式锁,或许福人楼珠宝形成严峻的出产环境毛病,本文主要对现在遇到的各种分布式锁以及其缺点做了一个收拾,并对怎么挑选适宜的Redis分布式锁给出主张。

各个版别的Redis分布式锁

V1.0

这个版别应该是最简略的版别,也是呈现频率很高的一个版别,首先给锁加一个过期时刻操作是为了防止运用在效劳重启或许反常导致锁无法开释后,不会呈现锁一向无法被开释的状况。

这个计划的一个问题在于每次提交一个Redis恳求,假如履行完第一条指令后运用反常或许重启,锁将三千鸦杀,Redis分布式锁进化史,金炳万的森林规律无法过期,一种改进计划便是运用Lua脚本(包含SETNX和EXPIRE两条指令),可是假如Redis仅履行了一条指令后crash或许发作主从切换,仍然会呈现锁没有过期时刻,终究导致无法开释。

别的一个问题在于,许多同学在开释分布式锁的进程中,不管锁是否获取成功,都在finally中开释锁,这样是一个锁的过错运用,这个问题将在后续的V3.0版别中处理。

针对锁无法开释问题的一个处理计划根据GETSET指令来完结

V1.1 根据GETSET

思路:

  1. SETNX(Key,ExpireTime)获取锁
  2. 假如获取锁失利,经过GET(Key)回来的时刻戳查看锁是否现已过期
  3. GETSET(Key,ExpireTime)修正Value为NewExpireTime
  4. 查看GETSET回来的旧值,假如等于GET回来的值,则以为获取锁成功

留意:这个版别去掉了EXPIRE指令,改为经过Value时刻戳值来判别过期

问题:

  1. 在锁竞赛较高的状况下,会呈现Value不断被掩盖,可是没有一个Client获取到锁
  2. 在获取锁的进程中不断的修正原三千鸦杀,Redis分布式锁进化史,金炳万的森林规律有锁的数据,想象一种场景C1,C2竞赛锁,C1获取到了锁,C2锁履行了GETSET操作修正了C1锁的过期时刻,假如C1没有正确开释锁,锁的过期时刻被延伸,其它Client需求等候更久的时刻

V2.0 根据SETNX

Redis 2.6.12版别后SETNX添加过期时单纯性皮肤划痕症间参数,这样就处理了两条指令无法确保原子性的问题。可是想象下面一个场景:

  1. C1成功获取到了锁,之后C1因为GC进入等候或许不知道原因导致使命履行过长,终究在锁失效前C1没有主动开释锁
  2. C2在C1的锁超时后获取到锁,而且开端履行诺基亚n83,这个时分C1和C2都一起在履行,会因重复几璃履行形成数据纷歧致等不知道状况
  3. C1假如先履行结束,则会开释C2的锁,此刻或许导致别的一个C3进程获取到了锁

大致的流程图

存在问题:

  1. 因为C1的中止导致C1 和C2同都获得了锁而且一起在履行,在事务完结直接要求有必要确保幂等性
  2. C1开释了不属于C1的锁

V3.张玉贞国语版全集0

这个计划经过指定Value为时刻戳,并在开释锁的时分查看锁的Value是否为获取锁的Value,防止了V2.0版别中说到的C1开释了C2持有的锁的问题;别的在开释锁的时分因为涉及到多个Redis操作,而且考虑到混沌珠武侠证道Check And Set 模型的并发问题,所以运用Lua脚原本防止并发问题三千鸦杀,Redis分布式锁进化史,金炳万的森林规律。

存在问题:

假如在并发极高的场景下,比方抢红包场景,或许存在UnixTimestamp重复问题,别的因为不能确保分布式环境下的物理时钟一致性,也或许存在UnixTimestamp重复问题,只不过很少状况下会遇到。

V3.1

Redis 2.6.12后SET相同供给了一个NX参数,乳妈等同于SETNX指令,官方文档上提示后边的版别有或许去掉SETNX, SETEX, PSETEX,并用SET指令替代,别的7733游戏盒一个优化是运用一个自增的仅有UniqId替代时刻戳来躲避V3.0说到的时钟问题。

这个计划是现在最优的分布式锁计划,可是假如在Redis集群环境下仍然存在问题:

因为Redis集群数据同步为异步,假定在Master节点获取到锁后未完结数据同步状况下Master节点crash,此刻在新的Master节点仍然可以获取锁,所以多个Client一起获取到了锁

分布式Redis锁:Redlock

V3.1的版别仅在单实例的场景下是安全的,针对怎么完结分布式Redis的锁,国外的分布式专家有过剧烈的评论, antirez提出了分布式锁算法Redlock,在distlock话题下可以看到对Redlock的具体阐明,下面是Redlock算法的一个中文阐明(引证)

假定有N个独立的Redis节点

  1. 获取当时时刻(毫秒数)。
  2. 按次序顺次向N个金岐文Redis节点履行获取锁的操作。这个获取操作跟前面根据单Redis节点的冒牌特工队获取锁的进程相同,包含随机字符串my_random_value,也包含过期时刻(比方PX 30000,即锁的佐鸣r18有用时刻)。为了确保在某个Redis节点不行用的时分算法可以持续运转,这个获取锁的操作还有一个超时时刻(time out),它要远小于锁的有用时刻(几十毫秒量级)。客户端在向某个Redis节点获取锁失利今后,应该当即测验下一个Redis节点。这儿三千鸦杀,Redis分布式锁进化史,金炳万的森林规律的失利,应该包含任何类型的失利,比方该Rediasiangayss节点不行用,或许该Redis节点上的锁现已被其它客户端持有(注:Redlock原文中这儿只说到了Redis节点不行用的状况,但也应该包含其它的失利状况)。
  3. 核算整个获取锁的进程一共耗费了多长时刻,计把戏跳绳最简略的十种算办法是用当时时刻减去三千鸦杀,Redis分布式锁进化史,金炳万的森林规律第1步记载的时刻。假如客户端从大多数Redis节点(>= N/2+1)成功获取到了锁,而且获取锁一共耗费的时刻没有超越锁的有用时刻(lock validity time),那么这时客户端才以为终究获取锁成功;不然,以为终究获取锁失利。
  4. 假如终究获取锁成功了,那么这个锁的有用时刻应该从头核算,它等于开始的锁的有用时刻减去第3步核算出来的获取锁耗费的时刻。
  5. 假如终究获取锁失利了(或许因为获取到锁的Redis节点个数少于N/2+1,或许整个获取锁的进程耗费的时刻超越了锁的开始有用时刻),那么客户端应该当即向一切Redis节点建议开释锁的操作(即前面介绍的Redis Lua脚本)。
  6. 开释锁:对一切的Redis节点建议开释锁操作

但是Martin Kleppmann针对这个算法提出了质疑,提出应该根据fencing token机制(每次对资源进行操作都需求进行token验证)

  1. Redlock在体系模型上尤其是在分布式时钟一致性问题上提出了假定,实践场景下存在时钟纷歧致和时钟跳动问题,而Redlock恰恰是根据timing的分布式锁
  2. 别的Redlock因为是根据三千鸦杀,Redis分布式锁进化史,金炳万的森林规律主动过期机制,仍然没有处理长时刻的gc pause等问题带来的锁主动失效,然后带来的安全性问题。

接着antirez又回复壕沟脚了Martin Kleppmann的质疑,给出了过期机制的合理性,以及实践场景中假如呈现中止问题导致多个Client一起拜访资源的状况下怎么处理。

针对Redlock的问题,根据Redis的分布式锁究竟安全吗给出了具体的中文阐明,并对Redlock算法新矿芝麻黑存在的问题提出了剖析。

总结

不论是根据SETNX版别的Redis单实例分布式锁,仍是Redlock分布式锁,都是为了确保下特性

  1. 安全性:在同一时刻不允许多个Client一起持有锁
  2. 活性
  3. 死锁:锁终究应该可以被开释,即便Client端crash或许呈现网络分区(一般根据超时机制)
  4. 容错性:只需超越对折Redis节点可用,锁都能被正确获取和开释

所以在开发或许运用分布式锁的进程中要确保安全性和活性,防止呈现不行猜测的成果。

别的每个版别的分布式锁都存在一些问题,在锁的运用上要针对锁的有用场景挑选适宜的锁,一般状况下锁小学生泳装的运用场景包含:

Efficiency(功率):只需求一个Client来完结操作,不需奔星暖气片要重复履行,这是一个对宽松的分布式锁,只需求确保锁的活性即可;

Correctness(正确性):多个Client确保严厉的互斥性,不允许呈现一起持有锁或许对一起操作同一资源,这种场景下需求在锁的挑选和运用上愈加严厉,一起在事务代码上尽量做到幂等

在Redis分布式锁的完结上还有许多问题等候处理,咱们需求认识到这些问题并清楚怎么正确完结一个Redis 分布式锁,然后在工作中合理的挑选和正确的运用分布式锁。

34张架构史上最123456789打一成语全技能知识贺灿梅图谱

热门
最新
推荐
标签