设为首页 收藏本站
查看: 961|回复: 0

[经验分享] 基于redis和zookeeper的分布式锁实现方式

[复制链接]

尚未签到

发表于 2019-1-8 13:55:22 | 显示全部楼层 |阅读模式
  先来说说什么是分布式锁,简单来说,分布式锁就是在分布式并发场景中,能够实现多节点的代码同步的一种机制。从实现角度来看,主要有两种方式:基于redis的方式和基于zookeeper的方式,下面分别简单介绍下这两种方式:
  一、基于redis的分布式锁实现

  1.获取锁
  redis是一种key-value形式的NOSQL数据库,常用于作服务器的缓存。从redis v2.6.12开始,set命令开始变成如下格式:
  SET key value [EX seconds] [PX milliseconds] [NX|XX]
  除key和value外,EX是超时时间,NX表示只有在key不存在的时候才会设置key的值,而XX表示在key存在的时间才会设置key的值。NX机制就是基于redis分布式锁的核心。能够解决以下问题:
  1)节点1获取key,并且设置超时时间后,还没来得及释放就挂掉了——这里EX超时时间会发挥作用,超时后自动释放锁。
  2)刚获取到锁,还没来得及设置超时时间就挂了——这里设置key和设置超时时间是原子操作,如果出现这种情况,会返回0,即获取不到锁。

2.释放锁

  为了解决非原子操作带来的问题,常采用lua脚本实现。lua脚本的操作会被认为是原子性的,类似于事务。伪代码如下:
  二、基于zookeeper的分布式锁实现
  zookeeper是一种分布式协调服务,其中每个节点称为znode,并有自己独立的路径。 znode有四种类型:
  持久节点:默认的节点类型。创建节点的客户端与zookeeper断开连接后,该节点依旧存在 。
  持久节点顺序节点:所谓顺序节点,就是在创建节点时,Zookeeper根据创建的时间顺序给该节点名称进行编号:
  临时节点:和持久节点相反,当创建节点的客户端与zookeeper断开连接后,临时节点会被删除:
  临时顺序节点:结合和临时节点和顺序节点的特点:在创建节点时,Zookeeper根据创建的时间顺序给该节点名称进行编号;当创建节点的客户端与zookeeper断开连接后,临时节点会被删除。
  下面看看是怎样基于上面的四类节点实现分布式锁的。
  1.获取锁
  1)在Zookeeper当中创建一个持久节,当第一个客户端Client1想要获得锁时,需要在这个节点下面创建一个临时顺序节点。
  2)Client1查找持久节点下面所有的临时顺序节点并排序,判断自己所创建的节点是不是顺序最靠前的一个。如果是第一个节点,则成功获得锁。
  3)如果再有一个客户端 Client2 前来获取锁,则在持久节点下面再创建一个临时顺序节点Lock2。
  4)Client2查找持久节点下面所有的临时顺序节点并排序,判断自己所创建的节点Lock2是不是顺序最靠前的一个,结果发现节点Lock2并不是最小的。
  于是,Client2向排序仅比它靠前的节点Lock1注册Watcher,用于监听Lock1节点是否存在。这意味着Client2抢锁失败,进入了等待状态。
  5)如果又有一个客户端Client3前来获取锁,则在持久节点下载再创建一个临时顺序节点Lock3。
  Client3查找持久节点下面所有的临时顺序节点并排序,判断自己所创建的节点Lock3是不是顺序最靠前的一个,结果同样发现节点Lock3并不是最小的。
  于是,Client3向排序仅比它靠前的节点Lock2注册Watcher,用于监听Lock2节点是否存在。这意味着Client3同样抢锁失败,进入了等待状态。
  2.释放锁
  释放锁就比较简单了,因为前面创建的临时顺序节点,所以在出现下面两种情况时,都会自动释放锁:
  1)任务完成后,Client会释放锁。
  2)任务没完成,Client就崩溃了,也会自动释放锁。
  喜欢小编轻轻点个关注吧!




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-660827-1-1.html 上篇帖子: ELK最流行架构的搭建filebeat+kafka+zookeeper+ELK 下篇帖子: 服务化改造11选5网站开发实践(一)| Dubbo + ZooKeeper
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表