Zookeeper分布式锁安全吗

Zookeeper分布式锁安全吗

Martin和Antirez争论点

在之前的文章讨论基于Redis的RedLock分布式锁中,有提到剑桥分布式专家Martin指出,RedLock安全性并不高,并且其中有一个假设场景如下

假设存在多个实例A、B、C、D、E,同时存在客户端1和2有如下场景

  • 客户端1请求实例A、B、C、D、E获取锁成功。
  • 客户端1开始操作共享资源,这时发生GC网络暂停,stop-the-world。
  • 在GC期间客户端1持有的所有实例上的锁过期。
  • 客户端2向实例A、B、C、D、E请求获取锁,成功。
  • 客户端2操作共享资源,这时客户端1从GC中恢复,客户端1无法感知锁已经过期,也操作共享资源导致冲突

这个假设Redis之父Antirez指出在获取锁后发生的NPC(N:网络延迟、P:进程暂停、C:时钟跳跃)问题RedLock无法处理,但这不仅仅是RedLock的问题,其余分布式锁也有这个问题,如Zookeeper。

Zookeeper是否安全呢

上面的场景与我们理解的如果需要构建更加安全的分布式锁,首要参考的就是Zookeeper思想有冲突,那么我们应该如何抉择呢,下面参考Zookeeper的作者之一Flavio Junqueira写的一篇博客Note on fencing and distributed locks

原文链接:https://fpj.systems/2016/02/10/note-on-fencing-and-distributed-locks/

Zookeeper构建分布式锁的步骤

Flavio Junqueira指出构建的一种方式,步骤如下

  • 客户端尝试创建一个znode节点如/lock,第一个客户端创建成功后相当于拿到了锁,后续的客户端再去创建/lock因为已经存在那么创建会失败。
  • 持有锁的客户端在访问共享资源后,将znode节点删除,那么其它客户端可以继续创建znode节点。
  • znode的节点应该是临时的,这样才能保证如果客户端突然崩溃,这个客户端持有的znode节点才会被删除,保证锁的释放。

这样看起来非常完美,因为没有Redis那种设置自动过期时间,可能因为时钟跳跃导致锁提前过期的情况,但真是这样吗,我们先来思考一个问题,客户端突然崩溃zookeeper如何能快速感知到呢?

Zookeeper心跳检测

每个客户端都会和Zookeeper之间维护一个Session,这个Session依赖心跳维护,如果Zookeeper在规定时间内未收到客户端心跳回复,那么将认为客户端失去链接,这时就会将这个Session创建的所有临时节点删除。

Zookeeper的安全问题

正是因为Zookeeper存在心跳检测这个问题,那么可能出现以下场景。

  • 客户端1连接Zookeeper后创建一个znode临时节点/lock成功。
  • 客户端1进入长时间的GC,进程暂停。
  • 客户端1连接到Zookeeper的session长时间未收到心跳回复,并且超过过期时间,自动删除创建的临时节点/lock。
  • 客户端2连接Zookeeper后同样创建znode临时节点/lock成功。
  • 客户端2开始操作共享资源,这时客户端1恢复同样操作共享资源,冲突产生。

这个场景就和上面分布式专家Martin提出的场景类似,在获取锁后发生NPC问题,这是单纯依靠分布式锁无法处理。

ZooKeeper的watch机制

ZooKeeper虽然单纯依赖自己无法解决获取锁后的NPC安全性问题,但是其watch特性,将分布式锁变地像一个单机锁实现。

当客户端试图创建一个临时节点/lock时,如果发现节点已经创建,这时客户端可以不立即失败,客户端可以进入一个阻塞等待状态,等待当/lock节点被删除后,Zookeeper通过watch机制通知给客户端,这样的方式就好像JAVA中获取单机锁一样方便。

Zookeeper和Redis对比

Zookeeper和Redis都能实现分布式锁,优势如下

  • 在客户端和Zookeeper连接正常的情况下,客户端可以持有锁任意时长,这可以确保客户端在持有锁后操作共享资源并不会因为业务操作过长而导致锁过期,可以解决Redis过期时间到底设置多久的难题。
  • Zookeeper支持的Watch机制,可以让Zookeeper实现的分布式锁,使用起来更加灵活,像使用本地锁一样。

劣势

  • Zookeeper与客户端如果长期没有心跳那么锁将自动释放。
  • 性能不如Redis。

总结

分布式锁可以由多种方式实现,但是看完分布式专家Martin和Redis作者的讨论后,在极端情况分布式锁并不是完全安全的,Zookeeper也不能例外,所以这也就是分布式锁都面临着NPC三座大山的考验,如果我们放在关键业务处理时并不能完全依靠分布式锁,还需要有类似Martin提出的fecing token防护令牌兜底。

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
(0)
用户投稿
上一篇 2022年6月13日
下一篇 2022年6月13日

相关推荐

  • 罗马诺:拜仁即将对德里赫特开新报价,尤文要价9000万~1亿欧之间

    直播吧7月16日讯 罗马诺消息,拜仁在出售莱万之后,已经开始着手下一笔转会操作。拜仁即将对德里赫特进行新的正式报价,尤文要价在9000万欧——1亿欧之间。 此外,拜仁还会继续追逐莱…

    2022年7月18日
  • 《霍格沃茨之遗》新场景展示:占卜教室刻画超细致

    今日,《霍格沃茨之遗》官方公布了该作全新场景片段,再次展示了魔法学院的北塔部分,一起来看看吧! 视频欣赏: 官方在简介中写到:“接下来我们要参观的是霍格沃茨北塔某地,这个地方只有一…

    2022年8月6日
  • 王者荣耀中那些惊人的操作 这样的bug您玩过几个呢?

    小伙伴们,你们还记得曾经的反向大招姜子牙,达摩一脚把大龙踢出龙坑,最让人惊讶的竟然是他,小霸王孙策。 姜子牙这个英雄非常特殊,既可以作为一个法师,也可以作为辅助,有甚者竟然开发边路…

    2022年6月30日
  • 国产游戏 隐秘的角落试玩版上线 你看我还有机会吗?

    作者:小黑盒——黑盒音乐电台 国产游戏《隐秘的角落》试玩版现已上线Steam 由游戏工作室Aluba Studio开发与发行,发售日期待定 游戏由同名国产剧集改编,加入了一些剧集中…

    2022年7月31日
  • 每日一语4/21

    已经发生的事再指责已无意义,已经走过的路再走只会觉得熟悉

    2022年4月29日
  • 使用自己的 Apple ID 有哪些方便?

    和单纯用 iPhone 、 iPad 等产品比起来,Apple ID 在很多叔叔阿姨心目中可能还略显神秘。 因为记不住密码、嫌麻烦或者不会设置等原因,有些叔叔阿姨并没有在设备上注册…

    2022年7月30日
  • 突破100万亿位!如果圆周率被算完,人类世界会发生什么?

    大家在学生时代一定都学过圆周率,在一些题目也常见与圆相关的计算。小小的圆圈,可以说隐藏了不少的奥秘,圆周率的背后更是充满了不少故事。 6月8日 谷歌云发布了一项消息:计算机学家Em…

    2022年6月21日
  • 乘坐电梯的注意事项

    随着建筑的发展,楼层越修越高,然而楼梯肯定不会是上下出行的方式,所以电梯的出现使人们的生活更加方便,但是其的危险性肯定是存在的,接下来就为大家介绍一下乘坐电梯的注意事项 方法 1、…

    2022年5月16日
  • 单身男生不怕愁,国产女机器人,网友:比娶媳妇好多了

    我们国家是一个男女比例失衡的国家,男性人口要比女性人口的数量多出三千多万,大家不要以为这只是一组数字,其实这代表着背后的三千多万个家庭。 (此处已添加小程序,请到今日头条客户端查看…

    2022年8月22日
  • 北京晚报评论:游客安全岂能“步步惊心”

    近日,多个网红游乐项目发生高空坠落事件。7月22日,天津市九山顶景区“步步惊心”项目在运营时,一名游客从玻璃吊桥上坠落,经抢救无效死亡;同一天,湖北恩施一名10岁小游客也是在“步步…

    2022年8月7日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息