分布式锁就是多台机器,分布在不同的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. Libre 6008 「网络流 24 题」餐巾计划 (网络流,最小费用最大流)

    Libre 6008 「网络流 24 题」餐巾计划 (网络流,最小费用最大流) Description 一个餐厅在相继的N天里,第i天需要Ri块餐巾(i=l,2,-,N).餐厅可以从三种途径获得餐巾. ...

  2. python之旅:异常处理

    一 什么是异常 异常就是程序运行时发生错误的信号(在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止),在python中,错误触发的异常如下 一个异常分为三部分 ...

  3. 把iPad上的视频推送到大麦盒子去

    把iPad上的视频推送到大麦盒子去   最近因为升级家里的宽带,服务商送了一个大麦盒子给我.   大麦盒子,就是一个网络机顶盒,用它可以通过互联网收看电视剧.电影.电视节目.音乐等等.除了它自身带的一 ...

  4. numpy中的arg系列函数

    numpy中的arg系列函数 觉得有用的话,欢迎一起讨论相互学习~Follow Me 不定期更新,现学现卖 numpy中arg系列函数被经常使用,通常先进行排序然后返回原数组特定的索引. argmax ...

  5. es6笔记(6) Iterator 和 for...of循环

    概要 js中的数组.对象,加上ES6中增加的Map.Set四种数据集合. Iterator提供了一种机制,为各种不同的数据结构提供统一的访问机制.任何数据结构只要部署Iterator接口,就可以完成遍 ...

  6. unbind()清除指定元素绑定效果

    定义和用法 unbind() 方法移除被选元素的事件处理程序. 该方法能够移除所有的或被选的事件处理程序,或者当事件发生时终止指定函数的运行. ubind() 适用于任何通过 jQuery 附加的事件 ...

  7. excel中数字如何自动换行

    1. excel中点击单元格右键,选择“设置单元格格式” -- “对齐”选项卡. 2. 先取消“自动换行”,勾选上“缩小字体填充”. 3.再选择“自动换行”即可实现数字的自动换行.

  8. 3.微信公众号开发:配置与微信公众平台服务器交互的URL接口地址

    微信开发基本原理: 1.首先有3个对象 分别是微信用户端 微信公众平台服务器 开发者服务器(也就是放自己代码的服务器) 三者间互相交互 2.微信公众平台服务器 充当中间者角色 (以被动回复消息为例) ...

  9. Hibernate5总结

    1. 明确Hibernate是一个实现了ORM思想的框架,它封装了JDBC,是程序员可以用对象编程思想来操作数据库. 2. 明确ORM(对象关系映射)是一种思想,JPA(Java Persistenc ...

  10. tensorboard遇到的坑

    <ul><li>No graph definition files were found.</li></ul> <p>启动命令 tensor ...