当前位置: 首页 > 知识库问答 >
问题:

分布式锁 - 如何理解Redis RedLock的潜在失败场景与Zookeeper的锁一致性保障?

齐锐进
2024-08-11

redis有红锁机制
zookeeper有ZAB协议。
两者都是必须超过一半的节点响应成功才算成功
那为什么基于redlock还是有可能会加锁失败?而zookeeper则认为可以保证一定能一致呢?
比如网上常举例的,redis有A B C D E五个节点,现在A B C 写入了一个锁,然后C还没来得及持久化就重启,或者C突然不可用被踢出,又新加了一个节点F。客户端2在D E F上加了同一把锁成功。

那zookeeper就没有上述问题吗?
再者,它加锁加的是一个临时有序节点,那如果这个节点自己崩溃了呢?客户端认为获取到了这把锁,然后这个节点自己崩溃了,那客户端2是不是就可以加锁了?

共有2个答案

江超英
2024-08-11

Martin 和 antirez 两位大佬就 RedLock 是否安全在很多年前展开过一次讨论,那次讨论很有名,网上也有大把的解读。

非要说一个结论的话就是:所有带超时机制的分布式锁,都无法在某个节点取得锁之后完美解决 NPC 问题。因此 Zookeeper 同样也不是百分百安全的。

P.S. NPC 即 Network Delay, Process Pause, Clock Drift 三个分布式问题的首字母缩写。

楚浩然
2024-08-11

Redis RedLock 的潜在失败场景

Redis RedLock 的设计目标是在分布式系统中提供一种相对可靠的锁机制,但它并不保证绝对的一致性,这主要源于 Redis 的几个特性:

  1. 网络分区和节点故障:在 Redis RedLock 的实现中,如果客户端成功地在多个 Redis 节点上设置了锁,但随后一些节点(如示例中的 C)在锁信息被持久化之前失败或重启,这可能导致锁的状态不一致。新的节点(如 F)加入后,如果它不了解之前锁的状态,就可能允许新的客户端(如客户端 2)获取到锁,尽管该锁可能仍被其他客户端持有。
  2. 时钟偏移:Redis RedLock 依赖于时间戳来判断锁是否过期,如果系统间存在时钟偏移,可能导致锁提前释放或延迟释放。
  3. 持久化问题:Redis 支持多种持久化策略(如 RDB 快照和 AOF 日志),但这些策略并不保证每次写操作都立即持久化到磁盘,因此节点故障可能导致最近的数据丢失。

Zookeeper 的锁一致性保障

相比之下,Zookeeper 通过其 ZAB(ZooKeeper Atomic Broadcast)协议提供了更强的一致性保障:

  1. 全局顺序:ZAB 协议保证了所有写操作的全局顺序性,这意味着在 Zookeeper 中创建或删除节点的操作会按照全局顺序执行,从而避免了锁状态的不一致。
  2. 持久性:Zookeeper 的数据存储在磁盘上,并且每个写操作都会同步到磁盘,确保了数据的持久性。即使 Zookeeper 节点崩溃,重启后也能从磁盘恢复最新的数据状态。
  3. 临时有序节点:在 Zookeeper 中,锁通常通过创建临时有序节点来实现。这些节点在客户端会话结束时会自动删除。如果客户端崩溃,其会话将超时,Zookeeper 会自动删除该客户端创建的临时节点,从而释放锁。此时,其他客户端可以安全地获取锁。

Zookeeper 的崩溃恢复

对于 Zookeeper 节点崩溃的情况,由于它使用了临时有序节点,并且这些节点与客户端会话绑定,因此当客户端崩溃时,其会话会超时,导致临时节点被删除。这确保了即使客户端崩溃,锁也能被正确释放,其他客户端可以安全地获取锁。

综上所述,Redis RedLock 因其基于内存和可能存在的持久化延迟,存在锁状态不一致的风险,而 Zookeeper 通过其强一致性的设计和数据持久化机制,提供了更高的锁一致性保障。

 类似资料:
  • 本文向大家介绍Zookeeper 如何实现分布式锁?相关面试题,主要包含被问及Zookeeper 如何实现分布式锁?时的应答技巧和注意事项,需要的朋友参考一下 分布式锁的实现方式有很多种,比如 、数据库 、 等。个人认为 在实现分布式锁这方面是非常非常简单的。 上面我们已经提到过了 zk在高并发的情况下保证节点创建的全局唯一性,这玩意一看就知道能干啥了。实现互斥锁呗,又因为能在分布式的情况下,所以

  • 主要内容:一、写在前面,二、ZooKeeper分布式锁机制,三、总结一、写在前面 之前写过一篇文章:《都2022年了,出去面试连分布式锁的源码你都不会画?》,给大家说了一下Redisson这个开源框架是如何实现Redis分布式锁原理的,这篇文章再给大家聊一下ZooKeeper实现分布式锁的原理。 同理,我是直接基于比较常用的Curator这个开源框架,聊一下这个框架对ZooKeeper(以下简称zk)分布式锁的实现。 一般除了大公司是自行封装分布式锁框架之外,建议

  • 主要内容:实例分布式锁是控制分布式系统之间同步访问共享资源的一种方式。 下面介绍 zookeeper 如何实现分布式锁,讲解排他锁和共享锁两类分布式锁。 排他锁 排他锁(Exclusive Locks),又被称为写锁或独占锁,如果事务T1对数据对象O1加上排他锁,那么整个加锁期间,只允许事务T1对O1进行读取和更新操作,其他任何事务都不能进行读或写。 定义锁: 实现方式: 利用 zookeeper 的同级节点的

  • 主要内容:写在前面,ZooKeeper分布式锁机制写在前面 之前写过一篇文章(《Redis 分布式锁,没它真不行!》),给大家说了一下Redisson这个开源框架是如何实现Redis分布式锁原理的,这篇文章再给大家聊一下ZooKeeper实现分布式锁的原理。 同理,我是直接基于比较常用的Curator这个开源框架,聊一下这个框架对ZooKeeper(以下简称zk)分布式锁的实现。 一般除了大公司是自行封装分布式锁框架之外,建议大家用这些开源框架封

  • 一个挺着啤酒肚,身穿格子衫,发际线严重后移的中年男子,手拿着保温杯,胳膊夹着MacBook向你走来,看样子是架构师级别。 面试开始, 直入正题。 面试官: 你有没有参与过秒杀系统的设计? 我: 没有,我平时都是开发后台管理系统、OA办公系统、内部管理系统,从来没有开发过秒杀系统。 面试官: 嗯...,小伙子很实诚。今天就先到这里吧,后面有消息会主动联系你。 后面还可能有消息吗?你们啥时候主动联系过

  • 主要内容:一、写在前面,二、Redisson实现Redis分布式锁的底层原理一、写在前面 现在面试,一般都会聊聊分布式系统这块的东西。通常面试官都会从服务框架(Spring Cloud、Dubbo)聊起,一路聊到分布式事务、分布式锁、ZooKeeper等知识。 所以咱们这篇文章就来聊聊分布式锁这块知识,具体的来看看Redis分布式锁的实现原理。 说实话,如果在公司里落地生产环境用分布式锁的时候,一定是会用开源类库的,比如Redis分布式锁,一般就是用Redisson框架就

  • 本系统中的分布式锁设计用于Storm多个线程实例抢占Redis缓存资源时出现的事务性问题,这个事务性问题是由客户端本身业务逻辑需求产生的,无法在服务端进行有效处理,需给出一个分布式资源同步的方案,此处我们采用了分布式锁来完成这项设计。 锁是编程中非常常见的概念。在维基百科上对锁有个相当精确的定义:在计算机科学中,锁是一种在多线程环境中用于强行限制资源访问的同步机制。锁被设计用于执行一个互斥的并发控

  • 主要内容:Redis分布式锁介绍,Redis分布式锁命令在分布式系统中,当不同进程或线程一起访问共享资源时,会造成资源争抢,如果不加以控制的话,就会引发程序错乱。此时使用分布式锁能够非常有效的解决这个问题,它采用了一种互斥机制来防止线程或进程间相互干扰,从而保证了数据的一致性。 提示:如果对分布式系统这一概念不清楚,可参考百度百科《分布式系统》,简而言之,它是一种架构、一种模式。 Redis分布式锁介绍 分布式锁并非是 Redis 独有,比如 MySQ