首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Zookeeper 分布式锁原理、源码及获取失败问题

Zookeeper 分布式锁原理、源码及获取失败问题

作者头像
chenchenchen
发布2019-09-02 16:36:15
发布2019-09-02 16:36:15
2K0
举报
文章被收录于专栏:chenchenchenchenchenchen

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

代码语言:txt
复制
                 本文链接:[https://blog.csdn.net/weixin\_38004638/article/details/97148292](https://blog.csdn.net/weixin_38004638/article/details/97148292) 

基于ZooKeeper的实现方式

zookeeper是一个为分布式应用提供一致性服务的软件,它内部是一个分层的文件系统目录树结构,规定统一个目录下只能有一个唯一文件名

数据模型

  • 永久节点 节点创建后,不会因为会话失效而消失
  • 临时节点 与永久节点相反,如果客户端连接失效,则立即删除节点
  • 顺序节点 与上述两个节点特性类似,如果指定创建这类节点时,zk会自动在节点名后加一个数字后缀,并且是有序的 监视器(watcher): 当创建一个节点时,可以注册一个该节点的监视器,当节点状态发生改变时,watch被触发时,ZooKeeper将会向客户端发送且仅发送一条通知,因为watch只能被触发一次

根据zookeeper的这些特性来实现分布式锁

  1. 创建一个锁目录lock
  2. 希望获得锁的线程A就在lock目录下,创建临时顺序节点
  3. 获取锁目录下所有的子节点,然后获取比自己小的兄弟节点,如果不存在,则说明当前线程顺序号最小,获得锁
  4. 线程B获取所有节点,判断自己不是最小节点,设置监听(watcher)比自己次小的节点(只关注比自己次小的节点是为了防止发生“羊群效应”)
  5. 线程A处理完,删除自己的节点,线程B监听到变更事件,判断自己是最小的节点,获得锁。

这里推荐一个apache的开源库Curator,它是一个ZooKeeper客户端,Curator提供的InterProcessMutex是分布式锁的实现,acquire方法用于获取锁,release方法用于释放锁。

优点:具备高可用、可重入、阻塞锁特性,可解决失效死锁问题。

缺点:因为需要频繁的创建和删除节点,性能上不如Redis方式。

Apache Curator之InterProcessMutex源码分析

https://www.cnblogs.com/shileibrave/p/9854921.html

【七张图】彻底讲清楚ZooKeeper分布式锁的实现原理

http://www.imooc.com/article/284956?block_id=tuijian_wz

分布式锁_慕课手记

http://www.imooc.com/article/details/id/256334

lock.acquire获取分布式锁失败

Java实现Zookeeper分布式锁

https://blog.csdn.net/weixin_38004638/article/details/97292019

实现多线程轮流获取锁,单线程重复获取锁成功

对比获取锁过程,将生成节点路径缩短

客户端断开后重连,已经可以正常获取锁

锁信息如下,分别是获取分布式锁生成节点,以及获取分布式id中workid生成节点

获取分布式锁生成节点,以及获取分布式id中workid生成节点

客户端断开后重连,原生成的workid节点已经删除,但路径还在

再次获取分布式锁生成节点,此时跟锁节点在同一路径下还存在id节点的路径

在判断自己是否是最小顺序节点的时候,就

临时节点未删除,锁未释放

addauth digest super:admin 获取超级管理员权限

查看新生成的id路径

查看新生成的临时节点

过期的旧节点将会被删除

版本不匹配

查看zookeeper版本 echo stat|nc localhost 2181,下载地址:https://www.apache.org/dyn/closer.cgi/zookeeper/

查看maven引入的jar包版本,下载地址:https://repo1.maven.org/maven2/org/apache/zookeeper/zookeeper

客户端与服务器的时间不一致,超时未释放

测试可以临时节点和递增节点,可以正常删除

先断开连接,节点可能等待超时释放。先关闭zookeeper服务,保证删除。

参考:

采用zookeeper的EPHEMERAL节点机制实现服务集群的陷阱

https://blog.csdn.net/SAN_YUN/article/details/84925365

使用zookeeper封装组件curator的锁,发现zookeeper大量临时节点没有被删除 ,只删除了子节点,低版本将临时节点存储为了持久化节点

https://www.cnblogs.com/xiaodu1993/articles/xiaodu1993.html

zookeeper分布式锁超时没有自动释放,zk集群服务器时间不一致

https://blog.csdn.net/qqxhwwqwq/article/details/52042261

zookeeper 临时节点不消失的原因 ,客户端与服务器的时间相差比较大,清空data目录后,重新初始化zk目录结构

https://blog.csdn.net/gong_xucheng/article/details/44337265

dubbo提供者停止服务后zookeeper临时节点不能自动摘除,服务器时间不正确,临时节点时间戳不正确

https://blog.csdn.net/liujunzxcv/article/details/91670951

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年07月24日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基于ZooKeeper的实现方式
  • Apache Curator之InterProcessMutex源码分析
  • lock.acquire获取分布式锁失败
    • Java实现Zookeeper分布式锁
    • 临时节点未删除,锁未释放
    • 版本不匹配
    • 客户端与服务器的时间不一致,超时未释放
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档