分布式锁就是多台机器,分布在不同的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的分布式锁的更多相关文章

  1. 基于 Zookeeper 的分布式锁实现

    1. 背景 最近在学习 Zookeeper,在刚开始接触 Zookeeper 的时候,完全不知道 Zookeeper 有什么用.且很多资料都是将 Zookeeper 描述成一个“类 Unix/Linu ...

  2. zookeeper实现分布式锁服务

    A distributed lock base on zookeeper. zookeeper是hadoop下面的一个子项目, 用来协调跟hadoop相关的一些分布式的框架, 如hadoop, hiv ...

  3. [ZooKeeper.net] 3 ZooKeeper的分布式锁

    基于ZooKeeper的分布式锁 ZooKeeper 里实现分布式锁的基本逻辑: 1.zookeeper中创建一个根节点(Locks),用于后续各个客户端的锁操作. 2.想要获取锁的client都在L ...

  4. zookeeper的分布式锁

    实现分布式锁目前有三种流行方案,分别为基于数据库.Redis.Zookeeper的方案,其中前两种方案网络上有很多资料可以参考,本文不做展开.我们来看下使用Zookeeper如何实现分布式锁. 什么是 ...

  5. zookeeper 实现分布式锁安全用法

    zookeeper 实现分布式锁安全用法 标签: zookeeper sessionExpire connectionLoss 分布式锁 背景 ConnectionLoss 链接丢失 SessionE ...

  6. 基于Zookeeper的分布式锁

    实现分布式锁目前有三种流行方案,分别为基于数据库.Redis.Zookeeper的方案,其中前两种方案网络上有很多资料可以参考,本文不做展开.我们来看下使用Zookeeper如何实现分布式锁. 什么是 ...

  7. 转载 [ZooKeeper.net] 3 ZooKeeper的分布式锁

    [ZooKeeper.net] 3 ZooKeeper的分布式锁   基于ZooKeeper的分布式锁  源码分享:http://pan.baidu.com/s/1miQCDKk ZooKeeper ...

  8. Redis与Zookeeper实现分布式锁的区别

    Redis实现分布式锁 1.根据lockKey区进行setnx(set not exist,如果key值为空,则正常设置,返回1,否则不会进行设置并返回0)操作,如果设置成功,表示已经获得锁,否则并没 ...

  9. Zookeeper系列四:Zookeeper实现分布式锁、Zookeeper实现配置中心

    一.Zookeeper实现分布式锁 分布式锁主要用于在分布式环境中保证数据的一致性. 包括跨进程.跨机器.跨网络导致共享资源不一致的问题. 1. 分布式锁的实现思路 说明: 这种实现会有一个缺点,即当 ...

随机推荐

  1. hdu 1358 Period 最小循环节

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1358 分析:已知字符串,求其由最小循环节构成的前缀字符串. /*Period Time Limit: ...

  2. Zabbix应用五:Zabbix监控多Tomcat

    利用Zabbix Trapper方式监控多Tomcat实例 Zabbix自带的模版(JMX Tomcat.JMX Generic)默认只能在一台机器上监控一个tomcat实例(因为监控项中的key不能 ...

  3. Flink窗口介绍及应用

    Windows是Flink流计算的核心,本文将概括的介绍几种窗口的概念,重点只放在窗口的应用上. 本实验的数据采用自拟电影评分数据(userId, movieId, rating, timestamp ...

  4. [六字真言]2.嘛.异常定制和通用.md

    幻世当空 恩怨休怀 舍悟离迷 六尘不改 且怒且悲且狂哉! 最近一直在循环的一首歌! 丰富自己,比取悦他人更有力量.种下梧桐树,引得凤凰来.你若盛开,蝴蝶自来! 言归正传! 言归正传! 不要去大包大揽 ...

  5. python获取指定目录下所有文件名os.walk和os.listdir

    python获取指定目录下所有文件名os.walk和os.listdir 觉得有用的话,欢迎一起讨论相互学习~Follow Me os.walk 返回指定路径下所有文件和子文件夹中所有文件列表 其中文 ...

  6. Why is my Spring @Autowired field null?

    spring有@Autowired 空指针异常 https://stackoverflow.com/questions/19896870/why-is-my-spring-autowired-fiel ...

  7. python 基础知识 列表的 增删改查 以及迭代取值

    """ python 列表 通用方法 元组.数组.字典 取值方法 [] 列表中可以存储不同类型的数据 函数 封装了独立的功能可以直接调用 函数名(参数) 方法 和函数类似 ...

  8. Spring Mvc 一个接口多个继承; (八)

    在 spring 注解实现里,一个接口一般是不能多继承的! 除非在 bean 配置文件里有 针对这个 实现类的配置: <beans:bean id="icService" c ...

  9. Vue.js绑定内联样式

    1.对象语法 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...

  10. Jenkins mac pkg安装 后默认配置文件/启动路径

    自启动文件路径 /Library/LaunchDaemons/org.jenkins-ci.plist jenkins.war 执行文件路径 /Applications/Jenkins/jenkins ...