分布式锁就是多台机器,分布在不同的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. k8s pod的4种网络模式最佳实战(externalIPs )

    [k8s]k8s pod的4种网络模式最佳实战(externalIPs )       hostPort相当于docker run -p 8081:8080,不用创建svc,因此端口只在容器运行的vm ...

  2. pyspider框架的599证书问题

    使用PySpider 框架出现错误 HTTP 599: SSL certificate problem: unable to get local issuer certificate,如下 HTTP ...

  3. 配置httpd2.4与常见的I/O模型说明

    配置httpd2.4与常见的I/O模型说明 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.httpd2.4访问控制 1.基于IP访问控制: 允许所有主机访问:Require a ...

  4. Redis记录-Redis高级应用

    Redis数据库可以使用安全的方案,使得进行连接的任何客户端在执行命令之前都需要进行身份验证.要保护Redis安全,需要在配置文件中设置密码. 示例 下面的示例显示了保护Redis实例的步骤. 127 ...

  5. bzoj千题计划260:bzoj2940: [Poi2000]条纹

    http://www.lydsy.com/JudgeOnline/problem.php?id=2940 SG 博弈入门推荐张一飞的<由感性认识到理性认识 ——透析一类搏弈游戏的解答过程> ...

  6. mongodb的认证(authentication)与授权(authorization)

    一小白瞎整mongodb,认证部分被折磨的惨不忍睹,看厮可怜,特查了一下文档,浅显地总结一下mongodb认证(authentication)与授权(authorization)的联系. 创建的所有用 ...

  7. matrix 矩阵(多维DP)

    题面 \(solution:\) 这一题其实就是一个非常明显的三维背包问题(但博主太弱了就10分QAQ) \(F[i][j][k]:\)表示走到\((i,j)\)这个位置并且背包容量为 \(k\) 时 ...

  8. 跳过复制错误——slave_skip_errors、slave_exec_mode

    这一篇写写复制错误处理相关的另两个参数slave_skip_errors.slave_exec_mode,基本环境参考<复制错误处理——sql_slave_skip_counter> 一. ...

  9. 克隆虚拟机重启之后eth0不见的解决方案

    今天用虚拟机克隆多一个虚拟机的时候,发现克隆之后的新虚拟机的网卡eth0在配置之后完全是用不了的,下面说一下我的解决办法,亲测可用. 1.用ipconfig命令查看ip信息的时候会发现虚拟机没有找到e ...

  10. linux(CentOS7)中安装erlang(20.3)以及rabbitmq(3.7.9)的步骤以及一些注意事项

    首先下载安装包,之后先安装erlang,安装erlang需要很多依赖,所以一步步来: 首先 wxWidgets会报错,这个不是必须的,可以不安装,不影响 然后需要安装一些必须的依赖: yum inst ...