关于Zookeeper分布式锁

news2024/11/16 20:31:39

背景

之前说到分布式锁的实现有三种
1、基于数据库实现的分布式锁
2、Redis分布式锁
3、Zookeeper分布式锁
前者redis分布式锁博客已具体介绍,此博客最终决定补齐关于Zookeeper分布式锁的实现原理。

简述

Zoopkeeper,它是一个为分布式的协调服务,基于CP,注重数据的一致性,它内部是一个分层的文件系统目录树结构,规定同一个目录下只能有一个唯一文件名。
简单来说,zookeeper相当于文件系统+监听通知机制

Zookeeper的四种类型节点

  • PERSISTENT-持久化目录节点
    客户端与zookeeper断开连接后,该节点依旧存在

  • PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点
    客户端与zookeeper断开连接后,该节点依旧存在,并且Zookeeper给该节点名称进行顺序编号

  • EPHEMERAL-临时目录节点
    客户端与zookeeper断开连接后,该节点被删除

  • EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点
    并且Zookeeper给临时目录节点进行顺序编号

zk的事件监听

客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加删除)时,zookeeper会通知客户端。
zookeeper使用watcher机制实现数据的发布订阅功能,该机制在被订阅对象发生变化时会异步通知客户端,因此客户端不必再watcher注册后轮询堵塞,从而减轻客户端压力。

基于ZooKeeper实现分布式锁的步骤如下:
2.基于zookeeper : 使用临时顺序节点+监听实现,线程进来都去创建临时顺序节点,第一个节点的创建线程获取到锁,后面的节点监听自己的上一个节点的删除事件,如果第一个节点被删除,释放锁第二个节点就成为第一个节点,获取到锁。

zookeeper分布式锁

针对zookeeper以上及节点和监听机制的特性,可以使用临时有序节点+监听机制来实现zookeeper分布式锁
实现原理
1、一把分布式锁通常使用一个Znode节点(以/lock为例)表示,如果锁对应的Znode节点不存在,先创建Znode节点。代表分布式锁。
2,线程1获取锁时,在节点/lock下建一个临时有序子节点,第一个节点是当前序号最小的节点,表示获取到锁。
3、当线程2获取锁时,在节点/lock下创建一个临时有序节点,此时判断当前自己的节点序号是否最小,不是,表示拿不到锁,则需要监听上一个节点。
4、当获取到锁的节点线程1执行业务完毕后,释放锁,即删除该节点,表锁被释放。
5、此时第二个节点监听到第一个节点被删除,成为第一个锁,获取到锁
6、以上以此类推

因此,当线程创建的子节点是当前锁下子节点列表中序号最小的有一个时,表示获取到锁,否则监听上一个锁节点,直接上一个子节点被删除,成为第一个节点时获取到锁

以图为例:

图(1)线程1获取到锁,其他线程排队等待

图(2) 线程1执行完毕,删除当前节点,节点2监听到上一节点被删,获取锁执行

三种分布式锁优缺点

在这里插入图片描述

总结

根据应用场景选择
● 基于ZooKeeper的分布式锁,适用于高可靠(高可用)而并发量不是太大的场景。如果实际业务场景,更需要的是保证数据一致性,适用于CP型的zookeeper分布式锁。

● 基于Redis的分布式锁,适用于并发量很大、性能要求很高的。如果实际业务场景,更需要的是保证数据高可用性。适用于AP类型的redis分布式锁。

参考文档:https://blog.csdn.net/weixin_45125989/article/details/130493038
redis分布式锁:https://superteam.blog.csdn.net/article/details/132958060

author:yana

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1526318.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux下dlib静态库和动态库编译

本文讲述的linux系统下如何编译dlib的静态库和动态库方法。 dlib源码下载地址 dlib官网:dlib C LibraryGitHub - davisking/dlib: A toolkit for making real world machine learning and data analysis applications in C dlib源码的目录结构如下: 编…

某网乱序拼图验证码快速破解还原

注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 本文的验证码网址如下,使用base64解码获得 aHR0cHM6Ly93d3cuZGluZ3hpYW5nLWluYy5jb20vYnVzaW5lc3MvY2FwdGNoYQ== ———————————————— 数据集如下,每张图片会切割成四个部分,…

git基础命令(二)

目录 git revert 撤消上一次提交的更改但是会创建一个新的提交来撤消该提交所做的更改git show 显示提交详细信息git mv 重命名文件git rm 从工作树和索引中移除文件git clean 从工作树中移除未跟踪文件git checkout 将文件恢复到工作树git reset 撤销更改、移动 HEAD 指针以及…

理论学习:with torch.no_grad()

如果不加上“with torch.no_grad():”,模型参数会发生改变吗? 如果不使用with torch.no_grad():,在进行模型推理(即计算outputs_cls net(inputs[batch_size//2:])这一步)时,模型参数不会发生改变&#xf…

【Godot4.2】求沿任意直线对称的点的坐标

概述 求一个点沿任意直线对称的点的坐标,这是一个简单的初中几何问题,如果用传统的求解思路,就是用公式,解方程组。但是作为Godot的使用者,要深谙向量的魅力。 我们绘制如下的图来分析: 对称轴L可以被理…

使用python开发GUI程序-用网页做界面

1.背景 之前一直使用PysimpleGUI来做带图形界面的程序,每次都需要编译成exe发给别人用,一来版本更新就要通知挨个通知更新,二来显示的界面也比较丑,要看大面积的数据,就不方便。 今天午餐时问了一下AI,把…

德人合科技|办公电脑文件资料防泄密软件

#天锐绿盾# 办公电脑文件资料防泄密软件通常具备以下几个关键功能来保障公司敏感信息的安全: PC端: https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 1. 文件透明加密: 这是此类软件的核心功能之一&#xff…

vant4中如何修改Dialog弹框内容的字体大小

最近在开发一个移动端的需求,用的UI组件库是vant4 简单地总结一下,如何修改Dialog弹框内容的字体大小 我们先看一下Dialog弹框简单的使用 import { showConfirmDialog } from vant;showConfirmDialog({title: 标题,message:如果解决方法是丑陋的&#…

docker小白第十二天

docker小白第十二天 docker network简介 docker不启动时默认的网络情况。 # 停止docker服务 systemctl stop docker.socket systemctl stop docker # 查看docker镜像 docker images输入查看docker镜像命令后,显示未连接到docker服务器 docker启动时网络情况 sy…

Java毕业设计 基于springboot vue招聘网站 招聘系统

Java毕业设计 基于springboot vue招聘网站 招聘系统 springboot vue招聘网站 招聘系统 功能介绍 用户:登录 个人信息 简历信息 查看招聘信息 企业:登录 企业信息管理 发布招聘信息 职位招聘信息管理 简历信息管理 管理员:注册 登录 管理员…

【智能算法】平衡优化器(EO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.代码实现4.参考文献 1.背景 2020年,Afshin Faramarzi等人受到估计动态和平衡状态的控制体积质量平衡模型启发,提出了平衡优化器(Equilibrium Optimizer, EO)。(PS:酒桶摇摇晃晃~&…

哪里找视频素材大全无水印,推荐五个超棒的视频素材网站

嘿,小伙伴们!你们是不是在找视频素材大全无水印?别着急,我这就给你们推荐五个超棒的视频素材网站,让你的视频创作更加出彩! 蛙学网:蛙学网是个适合国内创作者的好去处,这里有大量的视…

toapi,一个强大的 Python Web API库!

目录 前言 什么是 Python Toapi 库? 核心功能 使用方法 1. 安装 Toapi 库 2. 创建 Toapi 应用 3. 定义规则和过滤器 4. 运行 Toapi 应用 实际应用场景 1. 数据提取与分析 2. 自动化爬虫和数据抓取 3. 构建自定义搜索引擎 高级功能和进阶用法 1. 动态页面渲染 …

读《Cheating Depth: Enhancing 3D Surface Anomaly Detection via Depth Simulation》

WCAV2024 摘要&引言 RGB骨干:某些表面异常仅在RGB中实际上仍然是看不见的,因此需要合并三维信息(确实重点在于“合并”,单纯看例子里的深度图片也看不出来异常在哪里,但是和rgb overlay之后就明显一些了&#xf…

【开源】SpringBoot框架开发学生综合素质评价系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学生功能2.2 教师功能2.3 教务处功能 三、系统展示四、核心代码4.1 查询我的学科竞赛4.2 保存单个问卷4.3 根据类型查询学生问卷4.4 填写语数外评价4.5 填写品德自评问卷分 五、免责说明 一、摘要 1.1 项目介绍 基于J…

WebAssembly探索篇(三)emcc和cmake编译opencv案例

文章目录 开发环境安装opencv环境 实践出真知完整项目效果图 踩坑fatal error: opencv2/opencv.hpp file not found增加软链ln(无效)改用自行安装opencv,再显示指定lib路径 emcc命令行运行方式 最近因为项目原因,研究了一下WebAss…

NCV7321D11R2G收发器中文资料PDF数据手册引脚图参数图片价格芯片概述特性原理

产品概述: NCV7321 是一款全功能局部互联网 (LIN) 收发器,适用于 LIN 协议控制器和物理总线之间的接口。该收发器以 I3T 技术实施,可实现高电压模拟电路和数字功能在同一个芯片上的共存。NCV7321 LIN 器件属于车内联网 (IVN) 收发器系列。LI…

【鸿蒙HarmonyOS开发笔记】常用组件介绍篇 —— TextInput文本输入组件

概述 TextInput为文本输入组件,用于接收用户输入的文本内容。 参数 TextInput组件的参数定义如下 TextInput(value?:{placeholder?: string|Resource , text?: string|Resource})● placeholder placeholder属性用于设置无输入时的提示文本,效果…

基于tcp协议的网络通信(基础echo版.多进程版,多线程版,线程池版),telnet命令

目录 基础版 思路 辅助函数 服务端 代码 运行情况 -- telnet ip 端口号 传输的数据为什么没有转换格式 客户端 思路 代码 多进程版 引入 问题 解决 注意点 服务端 代码 运行情况 进程池版(简单介绍) 多线程版 引入 问题解决 注意点 服务端 代码 …

Java微服务分布式事务框架seata

🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 往期热门专栏回顾 专栏…