分布式锁系列之zookeeper分布式锁和mysql分布式锁

目录

介绍

下载安装

 基本指令​编辑

java集成zookeeper

官方提供版

永久节点

 临时节点​编辑

 永久序列化节点

判断当前节点是否存在

 获取当前节点中的数据内容

 获取当前节点的子节点

更新节点内容

删除节点 

 zookeeper实现分布式锁

Mysql实现分布式锁

总结


介绍

ZooKeeper是一个开源的分布式协调服务,它提供了一套强大的原语和工具,用于构建分布式系统中的协调和同步机制。其中之一就是分布式锁。

分布式锁是一种用于在分布式系统中实现资源互斥访问的机制。在多个节点同时访问共享资源时,分布式锁可以确保只有一个节点能够获取到锁,从而避免数据竞争和冲突。

ZooKeeper分布式锁的实现主要依赖于ZooKeeper的有序节点和临时节点特性。下面是分布式锁的基本实现步骤:

  1. 创建一个持久的ZooKeeper节点作为分布式锁的根节点,例如/locks

  2. 当一个节点需要获取锁时,它会在/locks节点下创建一个有序的临时节点,例如/locks/lock-000000001

  3. 节点获取到锁的条件是它创建的节点是当前所有节点中最小的节点。

  4. 节点检查自己创建的节点是否是当前所有节点中最小的节点,如果是,则表示节点获取到了锁,可以继续执行业务逻辑;如果不是,则节点需要监听前一个节点的删除事件。

  5. 当前一个节点释放锁时,它会删除自己创建的节点。

  6. 其他节点监听到前一个节点的删除事件后,重复步骤4,直到获取到锁。

通过这样的方式,ZooKeeper分布式锁可以保证只有一个节点能够获取到锁,其他节点需要等待。当获取到锁的节点完成业务逻辑后,会释放锁,让其他节点有机会获取到锁。

需要注意的是,ZooKeeper分布式锁的实现需要考虑异常情况和竞态条件,例如节点宕机、网络分区等,以保证锁的可靠性和正确性。

ZooKeeper分布式锁是通过有序节点和临时节点特性实现的,它可以在分布式系统中实现资源的互斥访问,确保只有一个节点能够获取到锁。这种机制可以帮助开发者解决分布式系统中的并发访问问题。

下载安装

在官网进行下载安装包

Apache ZooKeeper

分布式锁系列之zookeeper分布式锁和mysql分布式锁_第1张图片

这里以长期稳定版编译版为例测试

连接服务器,创建zookeeper文件夹,然后将下载好的tar包上传至服务器

分布式锁系列之zookeeper分布式锁和mysql分布式锁_第2张图片

上传

分布式锁系列之zookeeper分布式锁和mysql分布式锁_第3张图片

分布式锁系列之zookeeper分布式锁和mysql分布式锁_第4张图片

 解压包

 tar -zxvf apache-zookeeper-3.8.2.tar.gz

分布式锁系列之zookeeper分布式锁和mysql分布式锁_第5张图片

查看解压后包

分布式锁系列之zookeeper分布式锁和mysql分布式锁_第6张图片

分布式锁系列之zookeeper分布式锁和mysql分布式锁_第7张图片

进入配置文件夹

 但是zookeeper启动时加载的是zoo.cfg配置文件,并不是该模板配置文件,所以在该模板配置文件基础上需要另外创建并书写一个zoo.cfg配置文件

cp zoo_sample.cfg zoo.cfg

分布式锁系列之zookeeper分布式锁和mysql分布式锁_第8张图片

来到zp目录下先创建一个数据目录,等下要书写在zoo.cfg配置文件中

,注意数据目录是和conf文件夹等同级 

 

复制data目录路径

分布式锁系列之zookeeper分布式锁和mysql分布式锁_第9张图片

编辑配置zoo.cfg文件

分布式锁系列之zookeeper分布式锁和mysql分布式锁_第10张图片

其他使用默认即可

 切换脚本目录启动zookeeper  注意 启动zookeeper需要jdk环境,需提前在服务器中配置好jdk环境

 ./zkServer.sh start   启动

 ./zkServer.sh stop  停止

 ./zkServer.sh restart 重启

 ./zkServer.sh status  查看状态

分布式锁系列之zookeeper分布式锁和mysql分布式锁_第11张图片

 基本指令分布式锁系列之zookeeper分布式锁和mysql分布式锁_第12张图片

分布式锁系列之zookeeper分布式锁和mysql分布式锁_第13张图片

 分布式锁系列之zookeeper分布式锁和mysql分布式锁_第14张图片

分布式锁系列之zookeeper分布式锁和mysql分布式锁_第15张图片

java集成zookeeper

官方提供版

引入所需依赖

       
            org.apache.zookeeper
            zookeeper
            3.7.0
       

永久节点

分布式锁系列之zookeeper分布式锁和mysql分布式锁_第16张图片

 分布式锁系列之zookeeper分布式锁和mysql分布式锁_第17张图片

 分布式锁系列之zookeeper分布式锁和mysql分布式锁_第18张图片

 临时节点分布式锁系列之zookeeper分布式锁和mysql分布式锁_第19张图片

 由于临时节点在链接关闭后就自动清除掉,所以这里演示时加断点进行演示

分布式锁系列之zookeeper分布式锁和mysql分布式锁_第20张图片

 查看节点列表  临时节点test2存在

分布式锁系列之zookeeper分布式锁和mysql分布式锁_第21张图片

 放开断点分布式锁系列之zookeeper分布式锁和mysql分布式锁_第22张图片

 分布式锁系列之zookeeper分布式锁和mysql分布式锁_第23张图片

 永久序列化节点

分布式锁系列之zookeeper分布式锁和mysql分布式锁_第24张图片

 分布式锁系列之zookeeper分布式锁和mysql分布式锁_第25张图片

永久临时序列化节点不再演示 

判断当前节点是否存在

先看下当前列表的节点有哪些分布式锁系列之zookeeper分布式锁和mysql分布式锁_第26张图片

分布式锁系列之zookeeper分布式锁和mysql分布式锁_第27张图片

 分布式锁系列之zookeeper分布式锁和mysql分布式锁_第28张图片

 获取当前节点中的数据内容

先设置node节点内容值

分布式锁系列之zookeeper分布式锁和mysql分布式锁_第29张图片

 分布式锁系列之zookeeper分布式锁和mysql分布式锁_第30张图片

 获取当前节点的子节点

分布式锁系列之zookeeper分布式锁和mysql分布式锁_第31张图片

更新节点内容

分布式锁系列之zookeeper分布式锁和mysql分布式锁_第32张图片

 分布式锁系列之zookeeper分布式锁和mysql分布式锁_第33张图片

删除节点 

先查看下node节点下有哪些节点

分布式锁系列之zookeeper分布式锁和mysql分布式锁_第34张图片

分布式锁系列之zookeeper分布式锁和mysql分布式锁_第35张图片

 

 zookeeper实现分布式锁

引入curator依赖 主要代码中使用的代码和场景继承自本博主上一篇redis分布式锁的场景,所以不再从头梳理

  
            org.apache.curator
            curator-framework
            4.3.0
            
                
                    org.apache.zookeeper
                    zookeeper
                
            
        
        
            org.apache.curator
            curator-recipes
            4.3.0
            
                
                    org.apache.zookeeper
                    zookeeper
                
            
        

书写配置类

分布式锁系列之zookeeper分布式锁和mysql分布式锁_第36张图片

服务层:

分布式锁系列之zookeeper分布式锁和mysql分布式锁_第37张图片

重置库存后重启服务压测

分布式锁系列之zookeeper分布式锁和mysql分布式锁_第38张图片

 压测日志:

分布式锁系列之zookeeper分布式锁和mysql分布式锁_第39张图片

 可以看到在高并发场景下性能上并不是太好

查看库存:

分布式锁系列之zookeeper分布式锁和mysql分布式锁_第40张图片

符合预期库存为0没有超卖

Mysql实现分布式锁

分布式锁系列之zookeeper分布式锁和mysql分布式锁_第41张图片

实现思路:基于唯一键索引实现

新建一个lock表

分布式锁系列之zookeeper分布式锁和mysql分布式锁_第42张图片

 分布式锁系列之zookeeper分布式锁和mysql分布式锁_第43张图片

代码实现

服务层

分布式锁系列之zookeeper分布式锁和mysql分布式锁_第44张图片

修改库存1000开始压测

 分布式锁系列之zookeeper分布式锁和mysql分布式锁_第45张图片

 压测日志

分布式锁系列之zookeeper分布式锁和mysql分布式锁_第46张图片

性能感人o(╥﹏╥)o

库存结果

 

达到预期0 但是性能确实有些感人 

总结

分布式锁系列之zookeeper分布式锁和mysql分布式锁_第47张图片

你可能感兴趣的:(分布式锁,mysql,分布式,zookeeper,云原生,mysql,curator,高并发,分布式锁)