分布式共享锁

11.1 需求描述

在我们自己的分布式业务系统中,可能会存在某种资源,需要被整个系统的各台服务器共享访问,但是只允许一台服务器同时访问

 

11.2 设计思路

 

11.3 代码开发

 


public class DistributedClientMy {

     // 超时时间

     private static final int SESSION_TIMEOUT = 5000;

     // zookeeper server列表

     private String hosts = "spark01:2181,spark02:2181,spark03:2181";

     private String groupNode = "locks";

     private String subNode = "sub";

     private boolean haveLock = false;

 

     private ZooKeeper zk;

     // 当前client创建的子节点

     private volatile String thisPath;

 

     /**

      * 连接zookeeper

      */

     public void connectZookeeper() throws Exception {

          zk = new ZooKeeper("spark01:2181", SESSION_TIMEOUT, new Watcher() {

               public void process(WatchedEvent event) {

                    try {

 

                         // 子节点发生变化

                         if (event.getType() == EventType.NodeChildrenChanged && event.getPath().equals("/" + groupNode)) {

                              // thisPath是否是列表中的最小节点

                              List<String> childrenNodes = zk.getChildren("/" + groupNode, true);

                              String thisNode = thisPath.substring(("/" + groupNode + "/").length());

                              // 排序

                              Collections.sort(childrenNodes);

                              if (childrenNodes.indexOf(thisNode) == 0) {

                                   doSomething();

                                   thisPath = zk.create("/" + groupNode + "/" + subNode, null, Ids.OPEN_ACL_UNSAFE,

                                             CreateMode.EPHEMERAL_SEQUENTIAL);

                              }

                         }

                    } catch (Exception e) {

                         e.printStackTrace();

                    }

               }

          });

 

          // 创建子节点

          thisPath = zk.create("/" + groupNode + "/" + subNode, null, Ids.OPEN_ACL_UNSAFE,

                    CreateMode.EPHEMERAL_SEQUENTIAL);

 

          // wait一小会, 让结果更清晰一些

          Thread.sleep(new Random().nextInt(1000));

 

          // 监听子节点的变化

          List<String> childrenNodes = zk.getChildren("/" + groupNode, true);

 

          // 列表中只有一个子节点, 那肯定就是thisPath, 说明client获得锁

          if (childrenNodes.size() == 1) {

               doSomething();

               thisPath = zk.create("/" + groupNode + "/" + subNode, null, Ids.OPEN_ACL_UNSAFE,

                         CreateMode.EPHEMERAL_SEQUENTIAL);

          }

     }

 

     /**

      * 共享资源的访问逻辑写在这个方法中

      */

     private void doSomething() throws Exception {

          try {

               System.out.println("gain lock: " + thisPath);

               Thread.sleep(2000);

               // do something

          } finally {

               System.out.println("finished: " + thisPath);

               // 将thisPath删除, 监听thisPath的client将获得通知

               // 相当于释放锁

               zk.delete(this.thisPath, -1);

          }

     }

 

     public static void main(String[] args) throws Exception {

          DistributedClientMy dl = new DistributedClientMy();

          dl.connectZookeeper();

          Thread.sleep(Long.MAX_VALUE);

     }

 

    

}

时间: 2024-07-30 16:40:08

分布式共享锁的相关文章

一脸懵逼学习Zookeeper(动物园管理员)---》高度可靠的分布式协调服务

 1:Zookeeper是一个分布式协调服务:就是为用户的分布式应用程序提供协调服务 A.zookeeper是为别的分布式程序服务的 B.Zookeeper本身就是一个分布式程序(只要有半数以上节点存活,Zookeeper就能正常服务) C.Zookeeper所提供的服务涵盖:主从协调.服务器节点动态上下线.统一配置管理.分布式共享锁.统一名称服务-- D.虽然说可以提供各种服务,但是zookeeper在底层其实只提供了两个功能: 管理(存储,读取)用户程序提交的数据: 并为用户程序提供数据节点

ZooKeeper场景实践:(7) 分布式锁

1.基本介绍 分布式锁是控制分布式系统之间同步访问共享资源的一种方式,需要互斥来防止彼此干扰来保证一致性.利用Zookeeper的强一致性可以完成锁服务.Zookeeper的官方文档是列举了两种锁,独占锁和共享锁.独占锁保证任何时候都只有一个进程能或者资源的读写权限.共享锁可以同时有多个读,但是同一时刻最多只能有一个写,读和写是互斥的. 2.场景分析 我们准备来实现互斥的锁,按照官网的思路,给定一个锁的路径,如/Lock,所有要申请这个锁的进程都在/Lock目录下创建一个/Lock/lock-的

分布式服务框架 Zookeeper -- 管理分布式环境中的数据

安装和配置详解 本文介绍的 Zookeeper 是以 3.2.2 这个稳定版本为基础,最新的版本可以通过官网 http://hadoop.apache.org/zookeeper/来获取,Zookeeper 的安装非常简单,下面将从单机模式和集群模式两个方面介绍 Zookeeper 的安装和配置. 单机模式 单机安装非常简单,只要获取到 Zookeeper 的压缩包并解压到某个目录如:/home/zookeeper-3.2.2 下,Zookeeper 的启动脚本在 bin 目录下,Linux 下

基于Redis的分布式锁真的安全吗?(下)

自从我写完这个话题的上半部分之后,就感觉头脑中出现了许多细小的声音,久久挥之不去.它们就像是在为了一些鸡毛蒜皮的小事而相互争吵个不停.的确,有关分布式的话题就是这样,琐碎异常,而且每个人说的话听起来似乎都有道理.   今天,我们就继续探讨这个话题的后半部分.本文中,我们将从Antirez反驳Martin Kleppmann的观点开始讲起,然后会涉及到Hacker News上出现的一些讨论内容,接下来我们还会讨论到基于Zookeeper和Chubby的分布式锁是怎样的,并和Redlock进行一些对

Zookeeper分布式服务框架例子

由这个定义我们知道zookeeper是个协调系统,作用的对象是分布式系统.为什么分布式系统需要一个协调系统了?理由如下: 开发分布式系统是件很困难的事情,其中的困难主要体现在分布式系统的"部分失败"."部分失败"是指信息在网络的两个节点之间传送时候,如果网络出了故障,发送者无法知道接收者是否收到了这个信息,而且这种故障的原因很复杂,接收者可能在出现网络错误之前已经收到了信息,也可能没有收到,又或接收者的进程死掉了.发送者能够获得真实情况的唯一办法就是重新连接到接收者

传统应用层逻辑分库DB迁移阿里云DRDS+RDS分布式数据库

随着互联网快速发展,我们的结构化关系数据库在高并发.海量数据的情况下面临单机扩展性问题,首先是单机数据库容量瓶颈,单机数据库在业务高速增长的情况下依赖硬件升级也会到达天花板,并且使用成本变得非常高,而且扩展性的复杂性也是比较高,传统数据库扩容往往意味着服务中断,很难做到业务无感知或者少感知.     通过数据水平切换来现实分库可以帮助提升数据库整体性能.横向扩展性,切分后有效的降低了单台机器的访问负载,同时最大限度的降低了数据库服务节点宕机后的损失.      传统应用业务层逻辑或组件分库实现方

python的分布式任务huey如何实现异步化任务讲解

 本文我们来分享一个python的轻型的任务队列程序,他可以让python的分布式任务huey实现异步化任务,感兴趣的朋友可以看看.     一个轻型的任务队列,功能和相关的broker没有celery强大,重在轻型,而且代码读起来也比较的简单.  关于huey的介绍:  (比celery轻型,比mrq.rq要好用 !) a lightweight alternative.     written in python     no deps outside stdlib, except redi

GTS for DRDS分布式事务的实现理解

GTS介绍 全局事务服务(Global Transaction Service,简称 GTS)是一款高性能.高可靠.接入简单的分布式事务中间件,用于解决分布式环境下的数据一致性问题. 一个完整的业务往往需要调用多个子业务或服务,随着业务的不断增多,涉及的服务及数据也越来越多,越来越复杂.传统的系统难以支撑,出现了应用和数据库等的分布式系统.分布式系统又带来了数据一致性的问题,从而产生了分布式事务. 分布式事务是指事务发起者.资源管理器.事务协调者及资源分别位于不同的分布式系统的不同节点之上. G

如何实现高容量大并发数据库服务 | 数据库分布式架构设计

袋鼠学院和优云.阿里云联合举办的沙龙结束之后,总是有小伙伴们来问PPT内容,想要进一步了解Topic内容.(哦,对了对了,竟然还有小伙伴专门冲着袋鼠云去听沙龙,感动cry~~) 千呼万唤,忙成狗的袋鼠小妹终于把沙龙总结整理了出来(⊙o⊙) 本次沙龙的主题是"云时代下的运维管理实践",受邀请的演讲嘉宾,花名宏翊(经常关注袋鼠云的同学,肯定已经对这个名字很熟悉了),是袋鼠云首席数据库架构师,袋鼠学院数据库讲师. 呼应沙龙运维实践的主题,结合自己的专长领域,宏翊主要是从数据库领域来谈云时代下