028-86261949

当前位置:首页 > 技术交流 > 如何使用zookeeper实现分布式锁?

如何使用zookeeper实现分布式锁?

2021/05/17 17:18 分类: 技术交流 浏览:0

在之前《Redis实现分布式锁》一文中我已经介绍了使用Redis实现分布式锁原理,今天主要是介绍一下如何使用zookeeper实现分布式锁。

一.zookeeper介绍和安装

1.zookeeper介绍

1.1.什么是zookeeper

01

ZooKeeper由雅虎研发,是Google Chubby的开源实现,目前托管给Apache,是一个经典的分布式数据一致性解决方案,致力于为分布式应用提供一个高性能、高可用,且具有严格顺序访问控制能力的分布式协调服务。

分布式应用程序可以基于ZooKeeper实现数据发布与订阅、负载均衡、命名服务、分布式协调与通知、集群管理、Leader选举、分布式锁、分布式队列等功能

它基于层次型的目录树的数据结构,并通过对树上的节点进行有效管理,可以设计出各种各样的分布式集群管理功能,其本身也是分布式的。

 

1.2.zookeeper存储方式

Zookeeper会维护一个具有层次关系的树状的数据结构,它非常类似于一个标准的文件系统,如下图所
示:同一个目录下不能有相同名称的目录节点

在这里插入图片描述

 

ZooKeeper 节点是有生命周期的这取决于节点的类型,在 ZooKeeper 中,节点类型可以分为持久节点(PERSISTENT )、临时节点(EPHEMERAL),以及时序节点(SEQUENTIAL ),具体在节点创建过程中,一般是组合使用,可以生成以下 4 种节点类型。

 

持久节点(PERSISTENT)

所谓持久节点,是指在节点创建后,就一直存在,直到有删除操作来主动清除这个节点——不会因为创建该节点的客户端会话失效而消失。

 

持久顺序节点(PERSISTENT_SEQUENTIAL)

这类节点的基本特性和上面的节点类型是一致的。额外的特性是,在ZK中,每个父节点会为他的第一级子节点维护一份时序,会记录每个子节点创建的先后顺序。基于这个特性,在创建子节点的时候,可以设置这个属性,那么在创建节点过程中,ZK会自动为给定节点名加上一个数字后缀,作为新的节点名。这个数字后缀的范围是整型的最大值。

临时节点(EPHEMERAL)

 

和持久节点不同的是,临时节点的生命周期和客户端会话绑定。也就是说,如果客户端会话失效,那么这个节点就会自动被清除掉。注意,这里提到的是会话失效,而非连接断开。另外,在临时节点下面不能创建子节点。

 

临时顺序节点(EPHEMERAL_SEQUENTIAL)

在临时几点的基础上增加了顺序,可以用来实现分布式锁

顺序节点可以用来为所有的事件进行全局排序,这样客户端可以通过序号推断事件的顺序。

 

 

2.zookeeper安装(windows)

2.1.下载zookeeper

 

下载地址:https://mirrors.bfsu.edu.cn/apache/zookeeper/,

下载之后解压即可

 

2.2.配置zookeeper

 

解压之后,找到config/ zoo_sample.cfg 文件,复制一份重命名为:zoo.cfg ,这个是zookeeper配置文件,编辑zoo.cfg ,将dataDir 和 dataLogDir 修改成磁盘的某个地址

image.png

 

回到bin目录中,执行zkServer.cmd 启动zookeeper

 

在这里插入图片描述

 

 

 

2.3.测试zookeeper

执行bin/zsCli.cmd 启动zookeeper自带客户端,执行 "ls /"查看根节点

image.png

创建节点

image.png

获取节点

image.png

删除节点

image.png

其他命令

image.png

 

二.基于Zookeeper的分布式锁

1.zookeeper分布式锁原理

分布式锁就是基于zk的 临时顺序节点+watch监听机制完成的。临时顺序节点特点是客户端断开节点释放,且自己维护节点顺序值,当多个线程同时创建节点我们就可以按照顺序创建N个顺序临时节点,然后依次从第一个往后获取锁。只不过能拿到锁的只能是第一个节点的线程,所以后面的线程需要监听自己上一个节点的节点释放。轮到谁,谁就拿到锁。

 

在这里插入图片描述

 

2.Java封装基于ZK的分布式锁

2.1.创建项目导入依赖

image.png

 

 

2.2.封装zookeeper分布式锁

image.png

image.png

image.png

image.png

image.png

 

2.3.测试代码

image.png

 

打印日志:

image.png

image.png

 

这个效果看起来是对的。但是如果自己基于zookeeper封装分布式锁未免太过麻烦,而且容易出BUG,Apache提供了一个基于Zookeeper的客户端工具curator已经实现了分布式锁的封装,我们使用它就可以了。

 

 

3.使用curator实现分布式锁

3.1.curator介绍

Apache Curator是用于Apache ZooKeeper(一种分布式协调服务)的Java / JVM客户端库。它包括一个高级API框架和实用程序,使使用Apache ZooKeeper变得更加轻松和可靠。解决了很多Zookeeper客户端非常底层的细节开发工作,包括连接重连、反复注册Watcher和NodeExistsException异常等等。

 

重点是它对分布式锁进行了封装 :http://curator.apache.org/getting-started.html

 

3.1.导入依赖

image.png

 

3.2.配置curator

image.png

 

3.3.分布式锁案例

image.png

image.png

打印效果

image.png

#标签:zookeeper