文档章节

女朋友也能看懂的Zookeeper分布式锁原理

o
 osc_gu9d45li
发布于 2019/04/10 09:13
字数 1224
阅读 5
收藏 0

行业解决方案、产品招募中!想赚钱就来传!>>>

 

前言

 

关于分布式锁,在互联网行业的使用场景还是比较多的,比如电商的库存扣减,秒杀活动,集群定时任务执行等需要进程互斥的场景。而实现分布式锁的手段也很多,大家比较常见的就是redis跟zookeeper,今天我们主要介绍的是基于zookeeper实现的分布式锁。

 

这篇文章主要借用Curator框架对zk分布式锁的实现思路,大家理解了以后完全可以自己手动实现一遍,但是在工作中还是建议使用成熟的开源框架,很多坑别人已经帮我们踩好了,除非万不得已,需要高度定制符合自己项目的需求的时候,才开始自行封装吧。

 

正文

 

zookeeper简单介绍

 

既然是基于zookeeper的分布式锁,首先肯定要对这个zookeeper有一定了解,这里就不过多的进行讲解,只对其跟分布式锁有关联的特性做一个简单的介绍,更多详细的功能特性大家可以参阅官方文档。

 

zookeeper维护着类似文件系统的数据结构,它总共有四种类型的节点

 

 

  • PERSISTENT:持久化的节点。一旦创建后,即使客户端与zk断开了连接,该节点依然存在。

  • PERSISTENT_SEQUENTIAL:持久化顺序编号节点。比PERSISTENT节点多了节点自动按照顺序编号。

  • EPHEMERAL:临时节点。当客户端与zk断开连接之后,该节点就被删除。

  • EPHEMERAL_SEQUENTIAL:临时顺序编号节点。比EPHEMERAL节点多了节点自动按照顺序编号。(分布式锁实现使用该节点类型)

 
Curator实现分布式锁原理

 

好,当我们简单了解了zk的节点类型以后,现在正式的分析Curator分布式锁的实现原理。这里我们定义了一个“/curator_lock”锁节点用来存放相关客户端创建的临时顺序节点。

 

假设两个客户端ClientA跟ClientB同时去争夺一个锁,此时ClientA先行一步到达zk,那么它将会在我们的zk上创建一个“/curator_lock/xxxxx-0000000000”的临时顺序节点。

 

 

接着它会获取到“/curator_lock/”锁节点下的所有子节点,因为这些节点是有序的,这时候会判断它所创建的节点是否排在第一位(也就是序号最小),由于ClientA是第一个创建节点的的客户端,必然是排在第一位,所以它也就拿到了锁。我们用zkCli查看节点信息如下。

 

[zk: localhost:2182(CONNECTED) 4] ls /curator_lock
[_c_f3f38067-8bff-47ef-9628-e638cfaad77e-lock-0000000000]

  

 

这个时候ClientB也来了,按照同样的步骤,先是在“/curator_lock/”下创建一个临时顺序节点“/curator_lock/xxxxx-0000000001”,这个节点的序号是递增的,接着也是获得该节点下的所有子节点,并比对自己当前生成的节点序号是否在这些子节点中是最小的,由于此时序号最小的节点是ClientA创建的,并且还没释放掉,所以ClientB自己就拿不到锁。

 

 

[zk: localhost:2182(CONNECTED) 4] ls /curator_lock
[_c_2a8198e4-2039-4a3c-8606-39c65790d637-lock-0000000001,
_c_f3f38067-8bff-47ef-9628-e638cfaad77e-lock-0000000000]

  

既然ClientB拿不到锁,也不会放弃,它会对自己的前一个节点加上监听器(zk提供的api实现),只要监听到前一个节点被删除了,也就是释放了锁,就会马上重新执行获取锁的操作。

 

当后面的ClientC,ClientD...过来的时候也是如此,变化的只是节点上的编号,它会根据Client连接的数量而不断增加。

 

可能大家还会担心,万一我的获取到锁的客户端宕机了怎么办,会不会不释放锁?其实上面已经解答了这个问题,由于Curator使用的是临时顺序节点来实现的分布式锁,只要客户端与zk连接断开,该节点也就消失了,相当于释放了锁。

 

下面代码展示了Curator的基本使用方法,仅作为参考实例,请勿在生产环境使用的这么随意。

 

CuratorFramework client = CuratorFrameworkFactory.newClient("127.0.0.1:2182",
                5000,10000,
                new ExponentialBackoffRetry(1000, 3));
        client.start();
        InterProcessMutex interProcessMutex = new InterProcessMutex(client, "/curator_lock");
        //加锁
        interProcessMutex.acquire();
        
        //业务逻辑
        
        //释放锁
        interProcessMutex.release();
        client.close();

 

总结

 

我们在搞懂了原理之后,就可以抛弃Curator,自己动手实现一个分布式锁了,相信有一定经验的工程师实现基本的功能都是没问题的,但是要做到生产级别,可能还是要在细节上下功夫,比如说一些异常处理,性能优化等因素要考虑。

 

该文章首发于微信公众号《深夜里的程序猿》,转载请注明出处,侵权必究。

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
SQLServer实现split分割字符串到列

网上已有人实现sqlserver的split函数可将字符串分割成行,但是我们习惯了split返回数组或者列表,因此这里对其做一些改动,最终实现也许不尽如意,但是也能解决一些问题。 先贴上某大牛写的s...

cwalet
2014/05/21
9.6K
0
Nutch学习笔记4-Nutch 1.7 的 索引篇 ElasticSearch

上一篇讲解了爬取和分析的流程,很重要的收获就是: 解析过程中,会根据页面的ContentType获得一系列的注册解析器, 依次调用每个解析器,当其中一个解析成功后就返回,否则继续执行下一个解...

强子哥哥
2014/06/26
712
0
工作流管理系统--Pegasus WMS

Pegasus (飞马座)工作流管理系统包括一套技术标准工作流程应用程序中执行帮助许多不同的环境中,包括桌面、校园集群、网格、云。它弥补了科学领域和执行环境通过自 动映射到分布式资源的高层工...

匿名
2013/02/24
5.2K
0
CSS编译工具--Peaches

Peaches是一个基于Node的CSS编译工具,用于自动合成CSS Sprite。 Peaches 追求简单、自然的CSS书写方式! 大致的工作原理如下: 1. 我们在书写样式时,对每个需要使用背景图片的元素,进行单...

sliuqin
2013/04/12
592
0
Apache Curator

zookeeper 的客户端调用过于复杂,Apache Curator 就是为了简化zookeeper客户端调用而生,利用它,可以更好的使用zookeeper。

李旸
2012/11/27
9.7K
0

没有更多内容

加载失败,请刷新页面

加载更多

Vim清除最后一个搜索突出显示 - Vim clear last search highlighting

问题: Want to improve this post? 想要改善这篇文章吗? Provide detailed answers to this question, including citations and an explanation of why your answer is correct. 提供此问题......

技术盛宴
51分钟前
23
0
原子属性和非原子属性有什么区别? - What's the difference between the atomic and nonatomic attributes?

问题: What do atomic and nonatomic mean in property declarations? 属性声明中atomic和nonatomic是什么意思? @property(nonatomic, retain) UITextField *userName;@property(atomic, ......

fyin1314
今天
7
0
马化腾每天刷 Leetcode?代码你打算写到几岁?

本文作者:o****0 前几天,一张未证真伪的截图流传,图中显示马化腾几乎每天都会在 Leetcode 上提交代码。 截图还贴出一个 Leetcode 账户地址。该地址的头像已从马化腾的照片换成腾讯 logo,...

百度开发者中心
前天
13
0
滴滴 3000+ Kylin Cube 背后的实践经验揭秘

本次分享主要有三个部分:Kylin 在滴滴的整体应用、架构的实践经验、滴滴全局字典最新版本的实现以及 Kylin 最新实时 OLAP 探索经验分享。 Kylin 在滴滴的应用&架构 Kylin 在滴滴的三类应用场...

浪尖聊大数据
昨天
9
0
ssh“权限太开放”错误 - ssh “permissions are too open” error

问题: I had a problem with my mac where I couldn't save any kind of file on the disk anymore. 我的Mac出现问题,无法再在磁盘上保存任何类型的文件。 I had to reboot OSX lion and r......

javail
今天
19
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部