分布式协同 - 分布式锁一二事儿

文章目录

  • 导图
  • Pre
  • 概述
  • 概述
    • 1. 分布式互斥和临界资源的协调
    • 2. 分布式锁的基本原理
    • 3. 分布式锁的实现方式
      • a. 基于数据库实现的分布式锁
      • b. 基于Redis实现的分布式锁
      • c. 基于Zookeeper实现的分布式锁
    • 4. 高并发场景下的分布式锁优化
        • a. 分段锁(Sharded Locks)
        • b. 锁竞争优化
        • c. 锁超时和自动解锁
        • d. 异步处理
    • 5. 分布式锁的高可用性保障
  • 分布式锁的由来和定义
    • 进程内对临界资源的竞态操作
    • 分布式锁示意图
  • 通过 Redis 缓存实现分布式锁
  • 通过 ZooKeeper 实现分布式锁
  • 分布式分段加锁

在这里插入图片描述

导图

在这里插入图片描述


Pre

分布式协同 - 分布式系统的特性与互斥问题

深入理解分布式技术 - 分布式锁的应用场景和主流方案

深入理解分布式技术 - Redis 分布式锁解决方案

Redis进阶- Redisson分布式锁实现原理及源码解析

Redis进阶-细说分布式锁

Apache ZooKeeper - 使用ZK实现分布式锁(非公平锁/公平锁/共享锁 )


概述

概述

1. 分布式互斥和临界资源的协调

在分布式系统中,由于多个节点(进程)并发执行,可能会访问共享的临界资源。为了保证资源的正确性和一致性,必须保证同一时刻只有一个节点能够访问该资源,这就是分布式互斥的需求。没有这种互斥机制时,多个节点可能会同时修改共享数据,导致数据不一致或不正确。

例如,在高并发的秒杀系统中,多个订单服务节点可能会同时扣减库存,如果没有互斥控制,可能导致库存超卖的问题。

2. 分布式锁的基本原理

分布式锁是一种确保在分布式环境中,多个节点对临界资源进行顺序访问的机制。其基本原理是:每次只有一个节点能够获得锁并访问资源,其他节点需要等待锁释放。锁通常有两种状态:

  • 持有锁的节点:该节点正在访问临界资源。
  • 等待锁的节点:该节点在等待资源访问权限。

当一个节点获取锁时,其他节点必须等待,直到该节点释放锁才能继续访问资源。

3. 分布式锁的实现方式

分布式锁的实现方式有多种,常见的方式包括:

a. 基于数据库实现的分布式锁

数据库可以通过表记录来实现分布式锁。例如,可以在数据库中创建一个“锁”表,只有获取到该表的某一行记录的节点才能访问资源。为了保证锁的唯一性,通常会使用数据库的事务和悲观锁机制。

优点:

  • 实现简单,适用于使用数据库的系统。

缺点:

  • 性能较低,锁竞争严重时会影响数据库的读写性能。

b. 基于Redis实现的分布式锁

Redis提供了丰富的锁机制,最常用的是通过SETNX命令(“SET if Not eXists”)来实现分布式锁。SETNX命令可以确保只有一个节点能够成功设置一个键,如果该键已经存在,则表示锁已被其他节点持有。

Redis分布式锁的常见实现包括:

  • 使用SETNX命令设置锁。
  • 设置超时,确保即使进程崩溃或网络断开,锁也能被释放,避免死锁。
  • 使用RedLock算法,确保在多个Redis实例上使用锁,提高系统的可用性和容错性。

优点:

  • 性能高,支持高并发。
  • 支持分布式环境下的锁管理。

缺点:

  • 需要确保锁的超时和重试机制,避免死锁。

c. 基于Zookeeper实现的分布式锁

Zookeeper提供了原生的分布式协调服务,能够很方便地实现分布式锁。通过在Zookeeper中创建临时节点,每个进程尝试创建一个节点作为锁的标识,只有一个进程能够成功创建临时节点并获得锁。

Zookeeper的分布式锁通常涉及以下步骤:

  • 创建一个顺序临时节点。
  • 通过Zookeeper提供的Watcher机制监控其他节点的创建,保证获取锁的顺序。
  • 在完成任务后删除锁节点。

优点:

  • 强一致性,适合需要强一致性的分布式系统。

缺点:

  • 性能相对较低,适合对一致性要求较高的场景。

4. 高并发场景下的分布式锁优化

在高并发、大流量的场景下(如秒杀系统),多个请求可能会同时竞争资源,造成系统性能瓶颈。为了应对这些挑战,可以通过以下方式优化分布式锁的性能:

a. 分段锁(Sharded Locks)

为了提高并发性能,可以对资源进行分段,使用多个锁来分担压力。例如,将库存分为多个段,每个段使用独立的锁,这样多个请求就可以并行地访问不同段的库存,减少锁竞争。

b. 锁竞争优化

优化锁的获取和释放机制,减少锁竞争的时间。可以通过乐观锁和**CAS(Compare And Swap)**等技术减少锁的争用。

c. 锁超时和自动解锁

为了避免死锁,应该为锁设置超时时间,确保即使持锁进程崩溃,锁也能被及时释放。

d. 异步处理

对于不需要立即执行的任务,可以考虑异步处理,通过消息队列等机制将任务延迟执行,从而减少对锁的依赖。

5. 分布式锁的高可用性保障

在分布式锁的实现过程中,要确保协调者(如Redis、Zookeeper)具有高可用性。在高并发的环境中,单点故障可能会导致锁服务不可用,从而影响系统的稳定性。

为了提高可用性,可以:

  • 对Redis使用集群模式,确保高可用性。
  • 使用Zookeeper集群,提高容错性。
  • 采用RedLock等算法,确保在多个节点上都能获得锁,从而避免单点故障。

分布式锁的由来和定义

通常来讲,在消费者下订单时也会对库存进行扣减,此时订单服务会更新库存变量,其实就是将其值减 1。如果有两个用户同时对同一商品下单,就会造成对同一商品库存进行扣减的情况。我们将库存称作临界资源,扣减库存的动作称为竞态。切换到在进程内,竞态可以理解为两个线程(两个用户请求)争夺临界资源,解决办法是在这个资源上加一把锁。

进程内对临界资源的竞态操作

如下所示,线程 B 先到达,于是让其持有这把锁,并访问临界资源,之后线程 A 到达时由于没有锁,就进入等待队列,等线程 B 访问完毕并释放锁以后,线程 A 持有锁,可以访问临界资源

在这里插入图片描述

分布式锁示意图

为了面对高并发的下单请求,对订单服务做了水平扩展,因此订单服务通常是分散部署的。原来是进程内的多线程对临界资源产生的竞态,现在变成了分布式应用系统中的多个服务(进程)对临界资源的竞态对订单服务进行了水平扩展,将其从原来的一个扩展为两个,分别是订单服务 A 和 B,这两个服务可能会同时扣减库存。

由于是不同的服务或者进程,它们不知道对方的存在,因此共同访问的临界资源应该独立于服务,保存在一个公共的存储区域中,让水平扩展的订单服务都可以访问到。另外,可以通过锁机制,保证多服务并发请求时的竞态不会造成超卖情况,这和解决进程内竞态的方式相同。通过给临界资源加上一把锁,可以让并发操作变成串行的方式。这个锁就是分布式锁,其实现方式多种多样,比如通过数据库、Redis 缓存、ZooKeeper 实现
在这里插入图片描述

用数据库实现分布式锁比较简单,就是创建一张锁表。要锁住临界资源并对其访问时,在锁表中增加一条记录即可;删除某条记录就可释放相应的临界资源。数据库对临界资源做了唯一性约束,如果有访问临界资源的请求同时提交到数据库,数据库会保证只有一个请求能够得到锁,然后只有得到锁的这个请求才可以访问临界资源。

由于此类操作属于数据库 IO 操作,效率不高,而且频繁操作会增大数据库的开销,因此这种方式在高并发、对性能要求较高的场景中使用得并不多,这里不做详细介绍。


通过 Redis 缓存实现分布式锁

库存作为临界资源会遭遇高并发的请求访问,为了提高效率,可以将库存信息放到缓存中。以流行的 Redis 为例,用其存放库存信息,当多个进程同时请求访问库存时会出现资源争夺现象,也就是分布式程序争夺唯一资源。为了解决这个问题,需要实现分布式锁

在这里插入图片描述

假设有多个扣减服务用于响应用户的下单请求,这些服务接收到请求后会去访问 Redis 缓存中存放的库存信息,每接收一次用户请求,就将 Redis 中存放的库存量减去 1。

一个进程持有锁后,就可以访问 Redis 中的库存资源,且在其访问期间其他进程是不能访问的。如果该进程长期没有释放锁,就会造成其他进程饥饿,因此需要考虑锁的过期时间,设置超时时间。


通过 ZooKeeper 实现分布式锁

使用 Redis 缓存实现分布式锁,使同时访问临界资源的进程由并行执行变为串行执行。按照同样的思路,ZooKeeper 中的 DataNode 也可以保证两个进程的访问顺序是串行的,两个库存扣减进程会在 ZooKeeper 上建立顺序的 DataNode,DataNode 的顺序就是进程访问临界资源的顺序,这样避免了多个进程同时访问临界资源,起到了锁的作用。

在 ZooKeeper 中建立一个 Locker 的 DataNode 节点,在此节点下面建立子 DataNode 来保证先后顺序。即便是两个进程同时申请新建节点,也会按照先后顺序建立两个节点
在这里插入图片描述

整个过程具体如下。

  • (1) 当库存服务 A 想要访问库存时,需要先申请锁,于是在 ZooKeeper 的 Locker 节点下面新建一个 DataNode1 节点,表明可以扣减库存。
  • (2) 库存服务 B 在服务 A 后面申请库存的访问权限,由于申请锁操作排在服务 A 后面,因此节点会按照次序建立在 DataNode1 下面,为 DataNode2。
  • (3) 库存服务 A 在申请锁成功以后访问库存资源,并完成扣减。这段时间内库存服务 B 一直等待,直到库存服务 A 扣减完毕,ZooKeeper 中 Locker 下面的 DataNode1 节点被删除。
  • (4) DataNode1 被删除后,DataNode2 作为序号最靠前的节点,对应的库存服务 B 能够访问并扣减库存

可知: ZooKeeper 实现分布式锁的基本原理是按照顺序建立 DataNode 节点


分布式分段加锁

通过 Redis 缓存和 ZooKeeper 实现分布式锁依据的都是把并行执行转换成串行执行的思路。现在假设处理一次下单扣减等逻辑需要 20ms,那么同时有 500 个扣减请求串行执行的话,就需要 20ms×500 =10 000ms,也就是 10 s。如果并发数量再高一点,即使可以将订单服务水平扩展成很多个,使用队列做缓冲,也需要很久才能完成。

实际上,有我们可以将原理中的临界资源——库存由一个分成多个,然后将分得的库存段放到临界资源中,例如库存量为 500,将其分成 50 份,每份放 10 个库存,并从 1 到 50 标号,每个号码中就放 10 个库存。当高并发来临时,订单服务按序或者随机请求 1 到 10 号库存段,如果请求的库存段没有被锁,就获取锁并进行扣减操作;如果请求的库存段被其他请求锁住了,就换一个库存段进行扣减。这样在无形中提高了并发量,可以用在秒杀系统中

在这里插入图片描述

扣减库存请求 1 获取了库存段 1 的资源后,扣减库存请求 2 再获取库存段 1 时会发现这部分库存资源已经被锁住了,于是找库存段 2 获取资源,发现这部分库存资源并没有被锁住,于是执行扣减操作。

在这里插入图片描述

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

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

相关文章

Vue-01

Vue框架 Vue官网: Vue.js 框架 数据模型和view的通信就是依靠viewmodel的关键。 目前主流版本仍然是vue2版本。 Vue快速入门 1.新建一个HTML文件,引入Vue.js文件。Vue.js文件是官方引入的一个文件,我们如果要使用Vue就必须引入这个文件。…

【微服务】Nacos

一、安装 1、官网地址:https://nacos.io/download/nacos-server/ 2、启动:找到bin目录下的startup.cmd双击启动,或者打开一个命令窗口输入: startup.cmd -m standalone双击启动后如下:可以访问控制台地址 访问后的…

2025 - AIDD - python的autodock vina 批量分子对接改进版本2.0-全自动对接,完全全自动对接

2025 - AIDD - python的autodock vina 批量分子对接改进版本2.0-全自动对接,完全全自动对接 import warnings from pathlib import Path import subprocess from itertools import product import numpy as np import pandas as pd from MDAnalysis import Univers…

【uniapp】轮播图

前言 Uniapp的swiper组件是一个滑块视图容器组件&#xff0c;可以在其中放置多个轮播图或滑动卡片。它是基于微信小程序的swiper组件进行封装&#xff0c;可以在不同的平台上使用&#xff0c;如微信小程序、H5、App等。 效果图 前端代码 swiper组件 <template><vi…

由于导包而引发的错误

今天在调试时发现删除功能无论如何都无法实现&#xff0c;于是调试找到了mapper层的错误但不知道为什么报错。以下是报错信息。 Caused by: org.apache.ibatis.binding.BindingException: Parameter userIds not found. Available parameters are [arg0, collection, list]at o…

STM32 ADC --- 知识点总结

STM32 ADC — 知识点总结 文章目录 STM32 ADC --- 知识点总结cubeMX中配置注解单次转换模式、连续转换模式、扫描模式单通道采样的情况单次转换模式&#xff1a;连续转换模式&#xff1a; 多通道采样的情况禁止扫描模式&#xff08;单次转换模式或连续转换模式&#xff09;单次…

Web day02 Js Vue Ajax

目录 1.javascript: 1.js的引入方式&#xff1a; 2.js变量 & 数据类型 & 输出语句&#xff1a; 模板字符串&#xff1a; 3.函数 & 自定义对象&#xff1a; 4. json 字符串 & DOM操作&#xff1a; 5. js事件监听&#xff1a; 6.js的模块化导入或者导出&a…

Kylin Server V10 下 RocketMQ 主备自动切换模式部署

一、NameServer简介 NameServer 是一个注册中心,提供服务注册和服务发现的功能。NameServer 可以集群部署,集群中每个节点都是对等的关系,节点之间互不通信。 服务注册 Broker 启动的时候会向所有的 NameServer 节点进行注册,注意这里是向集群中所有的 NameServer 节点注册…

芯片测试-RF中的S参数,return loss, VSWR,反射系数,插入损耗,隔离度等

RF中的S参数&#xff0c;return loss, VSWR&#xff0c;反射系数&#xff0c;插入损耗&#xff0c;隔离度 &#x1f4a2;S参数&#x1f4a2;&#x1f4a2;S11与return loss&#xff0c;VSWR&#xff0c;反射系数&#x1f4a2;&#x1f4a2;S21&#xff0c;插入损耗和增益&#…

一个开源轻量级的服务器资源监控平台,支持告警推送

大家好&#xff0c;今天给大家分享一款开源的轻量级服务器资源监控工具Beszel&#xff0c;提供历史数据记录、Docker容器统计信息监控以及多种警报功能&#xff0c;用于监控服务器资源。 项目介绍 Beszel由hub&#xff08;中心服务器端应用&#xff0c;基于PocketBase构建&…

linux centos nginx编译安装

编译安装nginx&#xff08;Centos&#xff09; 编译需要的基础环境yum -y install pcre-devel openssl openssl-devel gd-devel gcc gcc-c1.下载nginx源码包 Nginx源码包下载地址&#xff1a;nginx源码包下载 2. 上传nginx源码包到服务器 我上传的地址是/home/chenhao/nginx…

【面试重难点问题】c++中为什么可以函数重载,但是c语言中不可以

本文章是对于“c中为什么可以函数重载&#xff0c;但是c语言中不可以”这个问题的探究&#xff1a; 当然这是一个值得深入探讨的问题。在面对难题时&#xff0c;我们常常会竭尽全力寻找答案&#xff0c;不惜挖掘三尺以探究竟。面对上面这个问题时&#xff0c;理解计算机系统的…

AI实践项目——图片视频自动上色系统,让旧照片焕然一新

1.主要内容 &#xff08;1&#xff09;项目概述 在图片处理的世界中&#xff0c;AI不仅用于识别和分析&#xff0c;还可以赋予灰度照片色彩&#xff0c;为其注入新的生命。今天&#xff0c;我们将探讨一种通过深度学习模型为灰度图片上色的技术。 ①参考文献 Colorful Image…

评分规则的建模,用户全选就是满分10分(分数可自定义), 选2个5分, 选2个以下0分

子夜(603***854) 15:11:40 和各位讨论一下设计问题: 有个有业务场景: 有一组产品共4个产品(数目用户可自定义), 需要一套规则,比如如果用户全选就是满分10分(分数可自定义), 选2个5分, 选2个以下0分 又比如另一组产品 产品有个必选属性,如果选了其中所有的必选则5分, 其他项每1…

计算机网络:数据链路层(二)

网课资源&#xff1a; 湖科大教书匠 1、网络适配器和MAC地址 习题1 1 以下哪个地址是广播MAC地址 A. 00-00-00-00-00-00 B. AB-CD-EF-11-22-33 C. FF-FF-FF-FF-FF-FF D. 29-29-29-29-29-29 2 以下哪个地址是多播MAC地址 A. 00-00-00-00-00-00 B. A9-8B-7C-6D-5E-4F C. FF-FF-…

# issue 6 网络编程基础

一、网络的物理结构和光纤千兆网络 首先&#xff0c;我们需要知道网络的物理结构——数据是如何从一台机器传输到另外一台机器的 这个过程是非常重要的。现在很多人做软件开发&#xff0c;只会软件角度&#xff0c;这导致讲软件原理头头是道&#xff0c;但是连数据线都不会接&a…

彻底理解quadtree四叉树、Octree八叉树 —— 点云的空间划分的标准做法

1.参考文章&#xff1a; &#xff08;1&#xff09;https://www.zhihu.com/question/25111128 这里面的第一个回答&#xff0c;有一幅图&#xff1a; 只要理解的四叉树的构建&#xff0c;对于八叉树的构建原理类比方法完全一样&#xff1a;对于二维平面内的随机分布的这些点&…

飞塔防火墙只允许国内IP访问

飞塔防火墙只允许国内IP访问 方法1 新增地址对象&#xff0c;注意里面已经细分为中国内地、中国香港、中国澳门和中国台湾 方法2 手动新增国内IP的对象组&#xff0c;目前好像一共有8632个&#xff0c;每个对象最多支持600个IP段

超详细ensp配置VRRP和MSTP协议

一、简介 1、什么是VRRP&#xff1a; &#xff08;1&#xff09;VRRP&#xff08;Virtual Router Redundancy Protocol&#xff09;的概念&#xff1a; VRRP&#xff08;Virtual Router Redundancy Protocol&#xff09;指的是一种实现路由器冗余备份的协议&#xff0c;常用于…

东风破捉妖师横空出世

一.异动拉升实时监测 东风破就像是一个大盘监测平台&#xff0c;是现实版的捉妖师&#xff0c;一旦妖股横空出世&#xff0c;就会在东风破面前原形毕露。东风破AI算法逻辑是监测存在异动拉升的股票&#xff0c;实时分析上证&#xff0c;深证&#xff0c;创业和科创板的股票数据…