基于Redis分布式锁的实现

以下翻译自redis官网.

基于redis的分布式锁

当多个进程需要以互斥的方式来操作共享数据的时候,分布式锁在这样的环境中非常有用。

有很多博客和库都描述了如何使用Redis实现一个DLM(分布式锁管理),但是每个库都用了不同方法,而且与稍微复杂的设计实现相比,很多使用简单的方法并不能保证高可用。

本篇文章尝试提供一种基于redis实现分布式锁的标准算法。我们提出的这种算法教着RedLock,我们相信这种实现比那种简单的更为安全。我们希望社区能够分析它,提供反馈,并且能够用它来作为基本实现,或者更复杂的设计。

安全性和可用性保证

我们把设计模型归结为三种属性,这些属性是使用分布式锁所必须的最少的要求。

安全属性:互斥。在任意的时刻,只能有一个客户端拿到锁。

活性A:无死锁。最终总是能获取到锁,即使获取到锁的客户端崩溃。

活性B:容错。只要大部分redis节点活着,客户端就能够获取和释放锁。

为什么基于容错的实现是不够的?

要理解我们想要提高什么,我们先来分析一下当前大部分基于redis的分布式锁处于一种什么样的状态。

用redis来锁住一个资源的最简单的方法是在一个实例上创建一个key。这个key通常创建的时候就会指定存活时间,所以最终锁是会释放的。当客户端需要释放锁的时候,也可以del这个key。表面上这样很不错,但是有一个问题:在我们的架构中,这会是个单点故障。如果master宕了之后会发生什么?好吧,让我们增加一个slave!并使用它如果master不可用。很不幸这样不可行。这样做我们不能达到互斥的安全属性,因为redis是异步复制的。

很显然使用这种方式有一个很明显的竞争状态:

客户端A在master上获取到锁。

master在写这个key到slave上之前崩溃。

salve被选举为master。

客户端B这时候就可以获取到这把锁,这样A,B同时拥有锁,这样就违反了第一条属性。

有时候在这样的现象可以容忍的时候,你可以使用这种master,slave异步复制的方案。否则,我们建议你采用下面文档里的方法来实现分布式锁。

The Redlock algorithm

In the distributed version of the algorithm we assume we have N Redis masters. Those nodes are totally independent, so we don’t use replication or any other implicit coordination system. We already described how to acquire and release the lock safely in a single instance. We take for granted that the algorithm will use this method to acquire and release the lock in a single instance. In our examples we set N=5, which is a reasonable value, so we need to run 5 Redis masters on different computers or virtual machines in order to ensure that they’ll fail in a mostly independent way.

In order to acquire the lock, the client performs the following operations:

It gets the current time in milliseconds.

It tries to acquire the lock in all the N instances sequentially, using the same key name and random value in all the instances. During step 2, when setting the lock in each instance, the client uses a timeout which is small compared to the total lock auto-release time in order to acquire it. For example if the auto-release time is 10 seconds, the timeout could be in the ~ 5-50 milliseconds range. This prevents the client from remaining blocked for a long time trying to talk with a Redis node which is down: if an instance is not available, we should try to talk with the next instance ASAP.

The client computes how much time elapsed in order to acquire the lock, by subtracting from the current time the timestamp obtained in step 1. If and only if the client was able to acquire the lock in the majority of the instances (at least 3), and the total time elapsed to acquire the lock is less than lock validity time, the lock is considered to be acquired.

If the lock was acquired, its validity time is considered to be the initial validity time minus the time elapsed, as computed in step 3.

If the client failed to acquire the lock for some reason (either it was not able to lock N/2+1 instances or the validity time is negative), it will try to unlock all the instances (even the instances it believed it was not able to lock).

Redlock (红锁算法)

在这个算法的分布式版本中我们假定有N个redis masters。这些节点之间互相独立。所以我们不需要复制,或者间接使用其他协调系统。我们已经描述过怎么安全的获取和释放锁在单实例中。我们确信在单实例中,可以使用这种方法来获取和释放锁。在我们的例子中,我们设置N=5,一个比较合理的值,我们需要把这5个redis master部署在不同的电脑或者虚拟机上,为了保证他们之间挂掉没有联系。

为了获取锁,客户端需要执行下列的操作:

获取当前的毫秒值。

尝试顺序的从所有实例上获取锁。使用一样的key和随机value。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,165评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,720评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,849评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,245评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,596评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,747评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,977评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,708评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,448评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,657评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,141评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,493评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,153评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,890评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,799评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,685评论 2 272