RedLock分布式锁

2019-02-17  本文已影响0人  芒果菠萝蛋炒饭

什么是RedLock?


RedLock的实现

核心思想: 同时使用多个Redis Master来冗余,且这些节点都是完全的独立的,也不需要对这些节点之间的数据进行同步。

实现方法:

假设我们有N个Redis节点,N应该是一个大于2的奇数

获取锁

  1. 取得当前时间
  2. 依次获取N个节点的Redis锁
  3. 再次获取当前时间,计算获取锁的时间
  4. 如果获取到的锁的数量大于 (N/2 + 1)个,且获取锁的时间小于锁的有效时间(lock validity time)就认为获取到了一个有效的锁。
    锁自动释放时间 = 最初的锁释放时间 - 之前获取锁所消耗的时间。
    如果获取锁的数量小于 (N/2 + 1),或者在锁的有效时间(lock validity time)内没有获取到足够的说,就认为获取锁失败。这个时候需要向所有节点发送释放锁的消息。
  5. 获取锁成功,访问资源

释放锁

需要注意的问题

  1. 重试获取锁的间隔时间应当是一个随机范围而非一个固定时间。这样可以防止,多客户端同时一起向Redis集群发送获取锁的操作,避免同时竞争。同时获取相同数量锁的情况。

  2. 如果某master节点故障之后,回复的时间间隔应当大于锁的有效时间(延迟重启)。

    假设有A,B,C三个Redis节点。

    • 客户端foo获取到了A、B两个锁。
    • 这个时候B宕机,所有内存的数据丢失。
    • B节点恢复。
    • 这个时候客户端bar重新获取锁,获取到B,C两个节点。

    此时又有两个客户端获取到锁了。

    如果恢复的时间将大于锁的有效时间,就可以避免以上情况发生。


RedLock的不足

我们为什么需要锁?

  1. 提升效率,用锁来保证一个任务没有必要被执行两次。比如耗费资源很多的计算
  2. 保证正确性,使用锁来保证任务按照正常的步骤执行,防止两个节点同时操作一份数据,造成文件冲突,数据丢失。

第一种原因,我们对锁是有一定宽容度的,就算发生了两个节点同时工作,对系统的影响也仅仅是多付出了一些计算的成本,没什么额外的影响。这个时候 使用单点的 Redis 就能很好的解决问题,没有必要使用RedLock,维护那么多的Redis实例,提升系统的维护成本。

第二种原因,对正确性有着严格要求的(比如订单,或者消费),就算使用了 RedLock 算法仍然不能保证锁的正确性。

为什么第二种原因 RedLock 不能保证正确性?

总结:

上一篇 下一篇

猜你喜欢

热点阅读