目录
介绍
下载安装
基本指令编辑
java集成zookeeper
官方提供版
永久节点
临时节点编辑
永久序列化节点
判断当前节点是否存在
获取当前节点中的数据内容
获取当前节点的子节点
更新节点内容
删除节点
zookeeper实现分布式锁
Mysql实现分布式锁
总结
介绍
ZooKeeper是一个开源的分布式协调服务,它提供了一套强大的原语和工具,用于构建分布式系统中的协调和同步机制。其中之一就是分布式锁。
分布式锁是一种用于在分布式系统中实现资源互斥访问的机制。在多个节点同时访问共享资源时,分布式锁可以确保只有一个节点能够获取到锁,从而避免数据竞争和冲突。
ZooKeeper分布式锁的实现主要依赖于ZooKeeper的有序节点和临时节点特性。下面是分布式锁的基本实现步骤:
-
创建一个持久的ZooKeeper节点作为分布式锁的根节点,例如
/locks
。 -
当一个节点需要获取锁时,它会在
/locks
节点下创建一个有序的临时节点,例如/locks/lock-000000001
。 -
节点获取到锁的条件是它创建的节点是当前所有节点中最小的节点。
-
节点检查自己创建的节点是否是当前所有节点中最小的节点,如果是,则表示节点获取到了锁,可以继续执行业务逻辑;如果不是,则节点需要监听前一个节点的删除事件。
-
当前一个节点释放锁时,它会删除自己创建的节点。
-
其他节点监听到前一个节点的删除事件后,重复步骤4,直到获取到锁。
通过这样的方式,ZooKeeper分布式锁可以保证只有一个节点能够获取到锁,其他节点需要等待。当获取到锁的节点完成业务逻辑后,会释放锁,让其他节点有机会获取到锁。
需要注意的是,ZooKeeper分布式锁的实现需要考虑异常情况和竞态条件,例如节点宕机、网络分区等,以保证锁的可靠性和正确性。
ZooKeeper分布式锁是通过有序节点和临时节点特性实现的,它可以在分布式系统中实现资源的互斥访问,确保只有一个节点能够获取到锁。这种机制可以帮助开发者解决分布式系统中的并发访问问题。
下载安装
在官网进行下载安装包
Apache ZooKeeper
这里以长期稳定版编译版为例测试
连接服务器,创建zookeeper文件夹,然后将下载好的tar包上传至服务器
上传
解压包
tar -zxvf apache-zookeeper-3.8.2.tar.gz
查看解压后包
进入配置文件夹
但是zookeeper启动时加载的是zoo.cfg配置文件,并不是该模板配置文件,所以在该模板配置文件基础上需要另外创建并书写一个zoo.cfg配置文件
cp zoo_sample.cfg zoo.cfg
来到zp目录下先创建一个数据目录,等下要书写在zoo.cfg配置文件中
,注意数据目录是和conf文件夹等同级
复制data目录路径
编辑配置zoo.cfg文件
其他使用默认即可
切换脚本目录启动zookeeper 注意 启动zookeeper需要jdk环境,需提前在服务器中配置好jdk环境
./zkServer.sh start 启动
./zkServer.sh stop 停止
./zkServer.sh restart 重启
./zkServer.sh status 查看状态
基本指令
java集成zookeeper
官方提供版
引入所需依赖
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.7.0</version>
</dependency>
永久节点
临时节点
由于临时节点在链接关闭后就自动清除掉,所以这里演示时加断点进行演示
查看节点列表 临时节点test2存在
放开断点
永久序列化节点
永久临时序列化节点不再演示
判断当前节点是否存在
先看下当前列表的节点有哪些
获取当前节点中的数据内容
先设置node节点内容值
获取当前节点的子节点
更新节点内容
删除节点
先查看下node节点下有哪些节点
zookeeper实现分布式锁
引入curator依赖 主要代码中使用的代码和场景继承自本博主上一篇redis分布式锁的场景,所以不再从头梳理
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.3.0</version>
<exclusions>
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.3.0</version>
<exclusions>
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
书写配置类
服务层:
重置库存后重启服务压测
压测日志:
可以看到在高并发场景下性能上并不是太好
查看库存:
符合预期库存为0没有超卖
Mysql实现分布式锁
实现思路:基于唯一键索引实现
新建一个lock表
代码实现
服务层
修改库存1000开始压测
压测日志
性能感人o(╥﹏╥)o
库存结果
达到预期0 但是性能确实有些感人