分布式锁原理与实战三:ZooKeeper分布式锁的原理

这篇具有很好参考价值的文章主要介绍了分布式锁原理与实战三:ZooKeeper分布式锁的原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        

目录

ZooKeeper分布式锁的原理

ZooKeeper的每一个节点,都是一个天然的顺序发号器。

ZooKeeper节点的递增有序性,可以确保锁的公平

ZooKeeper的节点监听机制,可以保障占有锁的传递有序而且高效

ZooKeeper的节点监听机制,能避免羊群效应

分布式锁的抢占过程

客户端A发起一个加锁请求

客户端B过来排队

客户端B开启监听客户端A

客户端B抢锁成功

 

      

 


理解了经典的公平可重入锁的原理后,再来看在分布式场景下的公平可重入锁的原理。通过前面的分析,基本可以判定:ZooKeeper 的临时顺序节点,天生就有一副实现分布式锁的胚子。为什么呢?

ZooKeeper分布式锁的原理

ZooKeeper的每一个节点,都是一个天然的顺序发号器。

        在每一个节点下面创建临时顺序节点(EPHEMERAL_SEQUENTIAL )类型,新的子节点后面,会加上一个次序编号,而这个生成的次序编号,是上一个生成的次序编号加一。
        例如,有一个用于发号的节点 “/test/lock”  为父亲节点,可以在这个父节点下面创建相同前缀的临时顺序子节点,假定相同的前缀为 “/test/lock/seq-” 。第一个创建的子节点基本上应该为  /test/lock/seq-0000000000,下一个节点则为/test/lock/seq-0000000001,依次类推 分布式锁原理与实战三:ZooKeeper分布式锁的原理

ZooKeeper节点的递增有序性,可以确保锁的公平

        一个ZooKeeper   分布式锁,首先需要创建一个父节点,尽量是持久节点( PERSISTENT 类型),然后每个要获得锁的线程,都在这个节点下创建个临时顺序节点。由于ZK 节点,是按照创建的次序,依次递增的。
        为了确保公平,可以简单的规定:编号最小的那个节点,表示获得了锁。所以,每个线程在尝试占用锁之前,首先判断自己是排号是不是当前最小,如果是,则获取锁。

ZooKeeper的节点监听机制,可以保障占有锁的传递有序而且高效

        每个线程抢占锁之前,先尝试创建自己的 ZNode 。同样,释放锁的时候,就需要删除创建的 Znode 。创建成功后,如果不是排号最小的节点,就处于等待通知的状态。等谁的通知呢?不需要其他人,只需要等前一个 Znode 的通知就可以了。前一个 Znode  删除的时候,会触发  Znode  事件,当前节点能监听到删除事件,就是轮到了自己占有锁的时候。第一个通知第二个、第二个通知第三个,击鼓传花似的依次向后。
        ZooKeeper 的节点监听机制,能够非常完美地实现这种击鼓传花似的信息传递。具体的方法是,每一个等通知的Znode 节点,只需要监听( linsten )或者监视( watch )排号在自己前面那个,而且紧挨在自己前面的那个节点,就能收到其删除事件了。
        只要上一个节点被删除了,就进行再一次判断,看看自己是不是序号最小的那个节点,如果是,自己就获得锁。
        另外,ZooKeeper  的内部优越的机制,能保证由于网络异常或者其他原因,集群中占用锁的客户端失联时,锁能够被有效释放。一旦占用 Znode  锁的客户端与  ZooKeeper  集群服务器失去联系,这个临时 Znode 也将自动删除。排在它后面的那个节点,也能收到删除事件,从而获得锁。正是由于这个原因,在创建取号节点的时候,尽量创建临时 znode 节点。

ZooKeeper的节点监听机制,能避免羊群效应

        ZooKeeper 这种首尾相接,后面监听前面的方式,可以避免羊群效应。所谓羊群效应就是一个节点挂掉,所有节点都去监听,然后做出反应,这样会给服务器带来巨大压力,所以有了临时顺序节点,当一个节点挂掉,只有它后面的那一个节点才做出反应。   

分布式锁的抢占过程

        接下来我们一起来看看,多客户端获取及释放zk 分布式锁的整个流程及背后的原理。
        首先大家看看下面的图,如果现在有两个客户端一起要争抢zk上的一把分布式锁,会是个什么场景? 分布式锁原理与实战三:ZooKeeper分布式锁的原理
        如果大家对zk 还不太了解的话,建议先自行百度一下,简单了解点基本概念,比如 zk 有哪些节点类型等等。
        参见上图。zk 里有一把锁,这个锁就是 zk 上的一个节点。然后呢,两个客户端都要来获取这个锁,具体是怎么来获取呢?
        咱们就假设客户端A 抢先一步,对 zk 发起了加分布式锁的请求,这个加锁请求是用到了 zk 中的一个特殊的概念,叫做“ 临时顺序节点
        简单来说,就是直接在"my_lock" 这个锁节点下,创建一个顺序节点,这个顺序节点有 zk 内部自行维护的一个节点序号。

客户端A发起一个加锁请求

        比如说,第一个客户端来搞一个顺序节点,zk 内部会给起个名字叫做: xxx-000001 。然后第二个客户端来搞一个顺序节点,zk 可能会起个名字叫做: xxx-000002 。大家注意一下,最后一个数字都是依次递增的,从1 开始逐次递增。 zk 会维护这个顺序。
        所以这个时候,假如说客户端A 先发起请求,就会搞出来一个顺序节点,大家看下面的图,Curator框架大概会弄成如下的样子: 分布式锁原理与实战三:ZooKeeper分布式锁的原理
        大家看,客户端A 发起一个加锁请求,先会在你要加锁的 node 下搞一个临时顺序节点,这一大坨长长的名字都是Curator 框架自己生成出来的。
        然后,那个最后一个数字是"1" 。大家注意一下,因为客户端 A 是第一个发起请求的,所以给他搞出来的顺序节点的序号是"1"
        接着客户端A 创建完一个顺序节点。还没完,他会查一下"my_lock"这个锁节点下的所有子节点,并且这些子节点是按照序号排序的,这个时候他大概会拿到这么一个集合: 分布式锁原理与实战三:ZooKeeper分布式锁的原理
        接着客户端A 会走一个关键性的判断,就是说:唉!兄弟,这个集合里,我创建的那个顺序节点,是不是排在第一个啊?
        如果是的话,那我就可以加锁了啊!因为明明我就是第一个来创建顺序节点的人,所以我就是第一个尝试加分布式锁的人啊!
        bingo!加锁成功!大家看下面的图,再来直观的感受一下整个过程。 分布式锁原理与实战三:ZooKeeper分布式锁的原理

客户端B过来排队

        接着假如说,客户端A 都加完锁了,客户端 B过来想要加锁了,这个时候他会干一样的事儿:先是在"my_lock"这个锁节点下创建一个临时顺序节点,此时名字会变成类似于: 分布式锁原理与实战三:ZooKeeper分布式锁的原理

        大家看看下面的图:  分布式锁原理与实战三:ZooKeeper分布式锁的原理

        客户端B 因为是第二个来创建顺序节点的,所以 zk 内部会维护序号为 "2"
        接着客户端B 会走加锁判断逻辑,查询"my_lock"锁节点下的所有子节点,按序号顺序排列,此时他看到的类似于: 分布式锁原理与实战三:ZooKeeper分布式锁的原理
        同时检查自己创建的顺序节点,是不是集合中的第一个?
        明显不是啊,此时第一个是客户端A 创建的那个顺序节点,序号为 "01" 的那个。所以加锁失败!

客户端B开启监听客户端A

        加锁失败了以后,客户端B 就会通过 ZK API 对他的顺序节点的上一个顺序节点加一个监听器。 zk 天然就可以实现对某个节点的监听。
        如果大家还不知道zk 的基本用法,可以百度查阅,非常的简单。客户端B的顺序节点是: 分布式锁原理与实战三:ZooKeeper分布式锁的原理

        他的上一个顺序节点,不就是下面这个吗? 分布式锁原理与实战三:ZooKeeper分布式锁的原理

        即客户端A 创建的那个顺序节点!
        所以,客户端B会对下面这个节点加一个监听器,监听这个节点是否被删除等变化!大家看下面的图。 分布式锁原理与实战三:ZooKeeper分布式锁的原理

  分布式锁原理与实战三:ZooKeeper分布式锁的原理

        接着,客户端A 加锁之后,可能处理了一些代码逻辑,然后就会释放锁。那么,释放锁是个什么过程呢?
        其实很简单,就是把自己在zk里创建的那个顺序节点,也就是将下面这个节点给删除。 分布式锁原理与实战三:ZooKeeper分布式锁的原理
        删除了那个节点之后,zk 会负责通知监听这个节点的监听器,也就是客户端 B 之前加的那个监听器,说:兄弟,你监听的那个节点被删除了,有人释放了锁。
分布式锁原理与实战三:ZooKeeper分布式锁的原理

        此时客户端B的监听器感知到了上一个顺序节点被删除,也就是排在他之前的某个客户端释放了锁。 

客户端B抢锁成功

        此时,就会通知客户端B重新尝试去获取锁,也就是获取"my_lock"节点下的子节点集合,此时为:分布式锁原理与实战三:ZooKeeper分布式锁的原理文章来源地址https://www.toymoban.com/news/detail-474988.html

        集合里此时只有客户端B 创建的唯一的一个顺序节点了!
        然后呢,客户端B 判断自己居然是集合中的第一个顺序节点,bingo!可以加锁了!直接完成加锁,运行后续的业务代码即可,运行完了之后再次释放锁。 分布式锁原理与实战三:ZooKeeper分布式锁的原理

      

到了这里,关于分布式锁原理与实战三:ZooKeeper分布式锁的原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Zookeeper 和 Redis 哪种更好? 为什么使用分布式锁? 1. 利用 Redis 提供的 第二种,基于 ZK 实现分布式锁的落地方案 对于 redis 的分布式锁而言,它有以下缺点:

    关于这个问题,我们 可以从 3 个方面来说: 为什么使用分布式锁? 使用分布式锁的目的,是为了保证同一时间只有一个 JVM 进程可以对共享资源进行操作。 根据锁的用途可以细分为以下两类: 允许多个客户端操作共享资源,我们称为共享锁 这种锁的一般是对共享资源具有

    2024年01月16日
    浏览(38)
  • 从原理到实践,分析 Redisson 分布式锁的实现方案(二)

            上篇讲解了如何用 Redis 实现分布式锁的方案,它提供了简单的原语来实现基于Redis的分布式锁。然而,Redis作为分布式锁的实现方式也存在一些缺点。本文将引入Redisson来实现分布式锁。         Redisson是一个基于Redis的分布式Java框架。它提供了丰富的功能和工

    2024年02月15日
    浏览(34)
  • 分布式锁实现方案-基于zookeeper的分布式锁实现(原理与代码)

    目录 一、基于zookeeper的分布式锁 1.1 基于Zookeeper实现分布式锁的原理 1.1.1 分布式锁特性说明 1.1.1.1 特点分析 1.1.1.2 本质 1.1.2 Zookeeper 分布式锁实现原理 1.1.2.1 Zookeeper临时顺序节点特性 1.1.2.2 Zookeeper满足分布式锁基本要求 1.1.2.3 Watcher机制 1.1.2.3 总结 1.2 分布式锁流程说明 1.2.1

    2024年04月24日
    浏览(32)
  • Zookeeper入门实战(5)-分布式锁

    在分布式环境中,当需要控制对某一资源的不同进程并发访问时就需要使用分布式锁;可以使用 ZooKeeper + Curator 来实现分布式锁,本文主要介绍 Curator 中分布式锁的使用,文中所使用到的软件版本:Java 1.8.0_341、Zookeeper 3.7.1、curator 5.4.0。 信号量用于控制对资源同时访问的进

    2024年02月08日
    浏览(42)
  • ZooKeeper 实战(五) Curator实现分布式锁

    1.1.分布式锁概念 分布式锁是一种用于实现分布式系统中的同步机制的技术。它允许在多个进程或线程之间实现互斥访问共享资源,以避免并发访问时的数据不一致问题。分布式锁的主要目的是在分布式系统中提供类似于全局锁的效果,以确保在任何时刻只有一个进程或线程

    2024年01月18日
    浏览(27)
  • 【ZooKeeper高手实战】ZAB协议:ZooKeeper分布式一致性的基石

    🌈🌈🌈🌈🌈🌈🌈🌈 欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术 的推送 发送 资料 可领取 深入理解 Redis 系列文章结合电商场景讲解 Redis 使用场景 、 中间件系列笔记 和 编程高频电子书 ! 文章导读地址:点击查看文章导读!

    2024年02月03日
    浏览(31)
  • ZooKeeper 分布式协调服务: 概述及原理, 安装配置, 基本操作

    作者:禅与计算机程序设计艺术 Apache Zookeeper 是 Apache Hadoop 的子项目之一,是一个开源的分布式协调服务。它负责存储和维护关于网络中各个节点的数据。Zookeeper 提供了以下功能:配置维护、域名服务、同步和共享、软/硬件负载均衡、集群管理、Master 选举等。它的架构使得

    2024年02月08日
    浏览(31)
  • (五)库存超卖案例实战——使用zookeeper分布式锁解决“超卖”问题

    本节内容使用zookeeper实现分布式锁,完成并发访问“超卖”问题的解决。相对于redis分布式锁,zookeeper能够保证足够的安全性。关于zookeeper的安装内容这里不做介绍,开始本节内容之前先自行安装好zookeeper中间键服务。这里我们利用创建zookeeper路径节点的唯一性实现分布式锁

    2024年02月06日
    浏览(29)
  • Zookeeper 实战 | Zookeeper 和Spring Cloud相结合解决分布式锁、服务注册与发现、配置管理

    专栏集锦,大佬们可以收藏以备不时之需: Spring Cloud 专栏: Python 专栏: Redis 专栏: TensorFlow 专栏: Logback 专栏: 量子计算: 量子计算 | 解密著名量子算法Shor算法和Grover算法 AI机器学习实战: AI机器学习实战 | 使用 Python 和 scikit-learn 库进行情感分析 AI机器学习 | 基于lib

    2024年02月05日
    浏览(44)
  • 分布式锁的原子性问题

    4.6 分布式锁的原子性问题 更为极端的误删逻辑说明: 线程1现在持有锁之后,在执行业务逻辑过程中,他正准备删除锁,而且已经走到了条件判断的过程中,比如他已经拿到了当前这把锁确实是属于他自己的,正准备删除锁,但是此时他的锁到期了,那么此时线程2进来,但

    2024年04月10日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包