关于Zookeeper分布式锁

背景

之前说到分布式锁的实现有三种
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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vertex cover preprocessing for influence maximization algorithms

Abstract 影响力最大化问题是社交网络分析中的一个基本问题,其目的是选择一小组节点作为种子集,并在特定的传播模型下最大化通过种子集传播的影响力。本文研究了独立级联模型下影响力最大化算法中执行顶点覆盖作为预处理的效果。所提出的方法从主要计算过…

考研复习C语言进阶(4)

1. 为什么存在动态内存分配 我们已经掌握的内存开辟方式有: int val 20;//在栈空间上开辟四个字节 char arr[10] {0};//在栈空间上开辟10个字节的连续空间 但是上述的开辟空间的方式有两个特点: 1. 空间开辟大小是固定的。 2. 数组在申明的时候&#…

Stm32-使用TB6612驱动电机及编码器测速

这里写目录标题 起因一、电机及编码器的参数二、硬件三、接线四、驱动电机1、TB6612电机驱动2、定时器的PWM模式驱动电机 五、编码器测速1、定时器的编码器接口模式2、定时器编码器模式测速的原理3、编码器模式的配置4、编码器模式相关代码5、测速方法 六、相关问题以及解答1、…

软件测试入门基础

说到软件测试,那么首先得和没有基础的同学们,讲解一下,平时我们使用的那些app,比如淘宝,微信是怎么进行交互的呢?在淘宝上下个订单,按钮按出去为什么就能下单成功呢?微信看朋友圈&am…

组建对等网

一、概念 对等网络(Peer-to-Peer, P2P)是一种分布式网络架构,其中每个参与节点(称为"对等体"或"节点")既可以作为客户端也可以作为服务器,直接与网络中的其他节点分享资源&#xff08…

windows上安装虚拟机及搭建Linux环境

虚拟机的安装 VMware Workstation Player(虚拟机),下载网址如下: VMware Workstation Player | VMwarehttps://www.vmware.com/content/vmware/vmware-published-sites/us/products/workstation-player.html.html?srcWWW_Player7Pro_US_HPPromo_Introducing 进入网…

8.Python从入门到精通—Python 字符串,转义字符,字符串运算符

8.Python从入门到精通—Python 字符串,转义字符,字符串运算符 Python 字符串创建字符串访问字符串中的字符字符串切片字符串操作符字符串方法 Python 转义字符Python字符串运算符 Python 字符串 在 Python 中,字符串是一种基本数据类型,用于表示文本数据…

深度学习pytorch——基本数据类型创建Tensor(持续更新)

声明:本深度学习笔记基于课时18 索引与切片-1_哔哩哔哩_bilibili学习而来 All is about Tensor 定义:Tensors are simply mathematical objects that can be used to describe physical properties, just like scalars and vectors. In fact tensors a…

地址转换函数(ip地址在计算中的识别方式,ipv4与ipv6)

ip地址在计算中的识别方式 ip地址如192.168.3.103是字符串 在计算机中该字符串ip用整型保存并识别。 ipv4与ipv6 ipv4 有四组,每组一个字节,一共4x832位 ipv4一共有 2^32 42 9496 7296 个地址。 ipv6 IPv6是由八组,每组四位16进制数字…

Java:设计模式

文章目录 参考简介工厂模式简单工厂模式工厂方法模式抽象工厂模式总结 单例模式预加载懒加载线程安全问题 策略模式 参考 知乎 简介 总体来说设计模式分为三类共23种。 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模…

【晴问算法】入门篇—贪心算法—区间选点问题

题目描述 给定n个闭区间,问最少需要确定多少个点,才能使每个闭区间中都至少存在一个点。 输入描述 输出描述 输出一个整数,表示最少需要确定的点的个数。 样例1输入 3 1 4 2 6 5 7输出 2 解释 至少需要两个点(例如3和5&#xff…

Java基础夯实【进阶】——八股文【2024面试题案例代码】

1、Java当中什么是线程和进程 在Java中,线程和进程是两个非常重要的概念。进程可以被视为一个执行中的程序的实例,它拥有自己的内存空间和系统资源。而线程则是进程中的一个实体,由进程创建,并允许程序在同一时刻执行多个任务。J…

Jenkins实现CICD(4)_Jenkins和gitlab进行交互

文章目录 一、实现功能二、操作思路三、插件安装四、jenkins与gitlab集成配置2.1、需求2.2、gitlab生成 API认证token2.2.1、创建token 2.3、jenkins使用gitlab API通信2.3.1、创建凭据2.3.2、查看创建结果 2.4、jenkins 集成 Gitlab2.4.1、配置2.4.2、操作流程 参考&#xff1…

XDAG节点版本更新(0.6.5升级到0.7.0)

1、拉取最新的xdagj源码 mkdir /root/xdagj-0.7.0 && cd /root/xdagj-0.7.0 git clone https://github.com/XDagger/xdagj.git cd xdagj mvn clean package -Dmaven.test.skiptrue2、创建新的数据目录并解压程序包 mkdir /data/docker-compose/xdagj-7.0/bin -p cd /…

Linux使用git命令行教程

. 个人主页:晓风飞 专栏:数据结构|Linux|C语言 路漫漫其修远兮,吾将上下而求索 文章目录 git安装git仓库的创建.git 文件添加文件git 三板斧(add,commit,push)解释拓展git log.gitignore git安装 首先输入git --version看看有没有安装git 如…

STM32F4+薄膜压力传感器(FSR)AO模拟输出程序ADC模数转换器详解

前言:博主在使用STM32F4加薄膜压力传感器用来测量压力时,发现给的例程只有STM32F1系列的,而STM32F4系列库函数程序不太一致,博主实战解决了该问题,用STM32F4标准库开发。有关ADC模数转换器的详细知识点详情点击我的博文…

【深度长文】聊一聊 Java AbstractQueuedSynchronizer 以及在 ReentrantLock 中的应用

文章目录 AQS 原理简述内部数据结构公平锁 vs. 非公平锁ReentrantLock 非公平锁ReentrantLock 公平锁 AQS 源码分析加锁过程addWaiteracquireQueuedshouldParkAfterFailedAcquirecancelAcquire 解锁过程unparkSuccessor AbstractQueuedSynchronizer (AQS) 是 Java 并发包中&…

【AUTOSAR】【通信栈】Fls

AUTOSAR专栏——总目录-CSDN博客文章浏览阅读592次。本文主要汇总该专栏文章,以方便各位读者阅读。https://blog.csdn.net/qq_42357877/article/details/132072415?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22132072415%22…

【电路笔记】-MOSFET作为开关

MOSFET 作为开关 文章目录 MOSFET 作为开关1、概述2、MOSFET特性曲线2.1 截住区域2.2 饱和区域3、MOSFET作为开关的示例4、功率MOSFET电机控制5、P沟道MOSFET作为开关6、互补MOSFET作为开关电机控制器当 MOSFET 在截止区和饱和区之间工作时,MOSFET 是非常好的电子开关,用于控…

RK3588 Buildroot 增加本地模块(单独编译/加入系统配置)

前言 本文基于 RK3588 Buildroot 编写. 在RK3588开发板环境下,开发者通常利用Buildroot来定制适合RK3588芯片特性的嵌入式Linux系统。通过Buildroot,开发者能够根据实际需求裁剪系统组件、添加特定驱动、配置内核特性,并集成用户应用程序&a…