聊聊zookeeper的分布式锁
分布式锁就是多台机器,分布在不同的JVM中,这些不同JVM内的方法需要获取一个唯一锁,比如获取锁之后要把数据写入数据库,保证数据在同一时刻只有一台机器写入数据库。
分布式锁的实现有多种实现方法,除了今天聊到的ZK实现的分布式锁还有Redis通过SETNXPX或Lua脚本实现,还可以通过数据库的锁实现,但今天咱们主要聊一下ZK的分布式锁的原理实现。
zookeeper可以创建两种节点,一种是永久型的,一种是临时型还可以是有序的,当机器与zk失去连接的时候临时节点会自动删除,这个功能非常强大以至于很多功能都是基于此,比如leader选举等。现在直接上一张我自己画的图:

首先会有一个永久节点\Locks,然后每个客户端请求的时候会创建一个临时有序节点,在这时每个都是有序的,最小的节点就意味着获取了锁。
在此图上显然ClientC获取了锁,其他的锁获取的节点不是最小的,但是他们之前会有一个链接,就是lock_00000001在虽然没有获取锁,但是会需要监听lock_00000000的,因为如果监听所有节点的话会浪费很多的资源。相应的大的节点都会watch比自己小的节点,当比自己节点小的节点释放之后然后就可以继续处理了。
我们看看Curator很好的帮我们实现了这样的功能,所有大家可以直接拿过来用:
InterProcessMutex lock = new InterProcessMutex(client, lockPath);
try {
lock.acquire(seconds, TimeUnit.SECONDS);
//do something
} catch (Exception e) {
logger.error("error", e);
} finally {
lock.release();
}
很多东西都为我们封装好了,如果用原生zookeepr API需要写太多的行,并且需要考虑的点非常的多。我在网上也找了一个例子,自己改了一把,然后跑了没有什么问题, 因为不是自己写的,所有不贴出来了,有需要了自行下载: https://github.com/stonehqs/Demo/blob/master/ZookeeperLock.java
但是在这里边我能想到的还有一场景需要大家一起思考一下:
1. 如果ZK集群出问题了,如何处理?
2. 如果方法调用的太频繁,这样会出现连接ZK被拒绝,比如一个应用连接数超过60个。
大家如果有更好的方案,可以给我留言讨论。
我能想到的第1点就是采用多个集群,比如两个集群,在写入数据的时候同时写入到两个集群中(保证数据一致),如果有一个群集中超过一半不能使用的时候,那么整个集群不能用了,这时可以切换到另一个群集,保证访问的高可用。
关于第2点,每个连接ZK群集的IP会被记录下来,这样一个IP连接ZK集群的最大默认数量60个,如果超过60个的话会被拒绝连接,防止DDOS攻击。所以在每个应用的方法调用的时候需要加入synchronized关键字,这样每个应用在同一时刻有一个线程在进行处理,其他的线程可以等待或者直接去做别的处理。还有另一个方案就是调整这个数变大,这样也可以解决一下,但是如果调整的话还需要多做一些测试,保证这个数字是最佳的。
好了,有问题的可以给我留言。下期再见。
聊聊zookeeper的分布式锁的更多相关文章
- 基于 Zookeeper 的分布式锁实现
1. 背景 最近在学习 Zookeeper,在刚开始接触 Zookeeper 的时候,完全不知道 Zookeeper 有什么用.且很多资料都是将 Zookeeper 描述成一个“类 Unix/Linu ...
- zookeeper实现分布式锁服务
A distributed lock base on zookeeper. zookeeper是hadoop下面的一个子项目, 用来协调跟hadoop相关的一些分布式的框架, 如hadoop, hiv ...
- [ZooKeeper.net] 3 ZooKeeper的分布式锁
基于ZooKeeper的分布式锁 ZooKeeper 里实现分布式锁的基本逻辑: 1.zookeeper中创建一个根节点(Locks),用于后续各个客户端的锁操作. 2.想要获取锁的client都在L ...
- zookeeper的分布式锁
实现分布式锁目前有三种流行方案,分别为基于数据库.Redis.Zookeeper的方案,其中前两种方案网络上有很多资料可以参考,本文不做展开.我们来看下使用Zookeeper如何实现分布式锁. 什么是 ...
- zookeeper 实现分布式锁安全用法
zookeeper 实现分布式锁安全用法 标签: zookeeper sessionExpire connectionLoss 分布式锁 背景 ConnectionLoss 链接丢失 SessionE ...
- 基于Zookeeper的分布式锁
实现分布式锁目前有三种流行方案,分别为基于数据库.Redis.Zookeeper的方案,其中前两种方案网络上有很多资料可以参考,本文不做展开.我们来看下使用Zookeeper如何实现分布式锁. 什么是 ...
- 转载 [ZooKeeper.net] 3 ZooKeeper的分布式锁
[ZooKeeper.net] 3 ZooKeeper的分布式锁 基于ZooKeeper的分布式锁 源码分享:http://pan.baidu.com/s/1miQCDKk ZooKeeper ...
- Redis与Zookeeper实现分布式锁的区别
Redis实现分布式锁 1.根据lockKey区进行setnx(set not exist,如果key值为空,则正常设置,返回1,否则不会进行设置并返回0)操作,如果设置成功,表示已经获得锁,否则并没 ...
- Zookeeper系列四:Zookeeper实现分布式锁、Zookeeper实现配置中心
一.Zookeeper实现分布式锁 分布式锁主要用于在分布式环境中保证数据的一致性. 包括跨进程.跨机器.跨网络导致共享资源不一致的问题. 1. 分布式锁的实现思路 说明: 这种实现会有一个缺点,即当 ...
随机推荐
- Access时间日期函数大全
这里特别推荐WeekdayName() 函数.MonthName() 函数,将日期转换为中文星期名与月份,如"星期一"."五月"一.Date() 函数.Now( ...
- 如何把手机app的视频下载到手机上?网页上的视频怎么下载?
手机上小视频怎么下载?求推荐不需要安装软件的下载方法? 如何把手机app的视频下载到手机上?比如把快手上的视频下载到手机上? 如何免费下载视频? ... 答案当然是用iiiLab提供的在线视频解析下载 ...
- 百度钱包、百付宝、baifubao接入支付的常见问题
[5004:参数非法,请检查输入参数后重试.]:检查是否缺少了其它必要的参数,我当时是缺少了order_no [5804,抱歉,订单创建失败,请联系客服处理]:即验证签名失败,这个只能参考文档进行处理 ...
- bzoj千题计划222:bzoj2329: [HNOI2011]括号修复(fhq treap)
http://www.lydsy.com/JudgeOnline/problem.php?id=2329 需要改变的括号序列一定长这样 :)))((( 最少改变次数= 多余的‘)’/2 [上取整] + ...
- Maven 环境的配置
Maven 环境的配置 现在Java新架构的不断出现,例如Struts,Spring,Hibernate等,项目的配置文件的增多,给开发人员带来很大麻烦.在实际的开发当中,Myeclipse中的pro ...
- HDU 2988 Dark roads (裸的最小生成树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2988 解题报告:一个裸的最小生成树,没看题,只知道结果是用所有道路的总长度减去最小生成树的长度和. # ...
- 第10月第4天 Mac g++ sfml opendir
1. g++ OpenGL.cpp -I/Users/temp/Downloads/SFML-2.4.2-osx-clang/include -L/usr/local/lib -framework O ...
- Django进阶之缓存和信号
一.缓存 简介 由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者mem ...
- 【密码学】RSA算法过程-求解密钥
1.密钥的计算获取过程 密钥的计算过程为:首先选择两个质数p和q,令n=p*q. 令k=ϕ(n)=(p−1)(q−1),原理见2的分析 选择任意整数d,保证其与k互质 取整数e,使得[de]k=[1] ...
- Casperjs循环执行(重复执行不退出)
var casper = require('casper').create({ // pageSettings: { // loadImages: true, // loadPlugins: fals ...