分布式锁的实现

一、背景

  • 在分布式系统中,一个应用部署在多台机器中,在某些场景下,为了保证数据的一致性,要求在同一时刻,同一任务只在一个节点上运行,即保证某个行为在同一时刻只能被一个线程执行。
  • 单机单进程多线程环境下,通过锁很容易做到,比如 mutexspinlock信号量 等。
  • 多机多进程环境下,就需要使用 分布式锁 来解决了。
    • 分布式场景:我们的应用由多个节点构成,这些节点可能分布在不同的机器中,也有可能分布在不同的网络环境中,通常这些进程之间通过 socket 进行通信。

二、分布式锁

  • 是什么类型的锁 ?
    • 在分布式场景中实现互斥类型的锁
      • 互斥类型:同一时刻只允许一个执行体进入临界资源
  • 解决了什么问题 ?
    • 在分布式场景中,同时只允许一个节点执行某类任务。
  • 锁 = 资源 + 行为
    • 资源:
      • 要记录进程的全局唯一 ID
      • 放在 数据库zookeeperetcd 中,可以让所有的执行体访问
    • 行为:加锁、解锁。(以网络通信的方式)
      • 加锁:把当前进程的唯一标识打到当前数据库的某一个字段中,作为一个标记,说明当前进程持有锁。
        • 加锁的方式:原来没有标记,现在打上标记了。
      • 解锁:谁加的锁,谁释放锁,也就是加锁对象和解锁对象必须是同一个对象,除了因为网络异常而造成的锁超时情况
        • 解锁的方式:持锁方去清除标记,比如置为 0,这样其他的进程才能去加锁。

三、分布式锁特性

  • 互斥性。
    • 锁打上标记:加锁。
    • 锁取消标记:解锁。
    • 标记:执行体的唯一标识,可以通过雪花算法生成。
  • 锁超时。
    • 在分布式场景中,允许一个进程退出,并希望其他的进程能够继续工作。
    • 当持有锁的进程想要解锁的时候,由于某些原因,比如进程宕机、网络异常,导致无法清除数据库中的标记,也就是持锁的进程没有能力去释放锁了,那么我们应该提供一种机制,让数据库自动地去释放锁 → 时间一到,数据库自动地释放锁
  • 可用性。
    • 合理时间内得到合理的回复
    • 实现:
      • 计算型:开多个备份点。
      • 存储型:
        • 多个备份点。
        • 主从切换。
  • 容错性。
    • 一致性来解决(半数以上)。
      • raft 一致性算法。
      • redlock。
    • 高可用 = 可用性 + 容错性

四、分布式锁类型

  • 重入锁和非重入锁。
    • 重入锁:
      • 允许同一个线程多次获取同一把锁,而不会导致死锁。当一个线程持有锁时,它可以再次获取相同的锁而不被阻塞。
      • std::recursive_mutex
    • 非重入锁:
      • 不允许同一个线程在持有锁的情况下再次获取相同的锁,会导致死锁。
      • std::mutex
  • 公平锁和非公平锁。
    • 公平锁:排队,对应互斥锁。
    • 非公平锁:轮询,对应自旋锁。

五、实现分布式锁

  • 基于中间件来实现 → 所有的节点都能访问到。
  • 资源存储在中间件中。
  • 加锁、解锁行为基于中间件的特性来实现。

MySQL 实现分布式锁

  • 锁的存储:表。
  • 获取锁和释放锁:字段。
  • 互斥语义:
    • 唯一性约束:unique keyprimary key
    • 利用 innodb 中的 S 锁和 X 锁互斥。
      select * from lock where ... lock in share mode;
      update lock set ... where ...
      
  • 锁超时:
    • 表增加一个字段:加锁时间戳
    • 另起进程(超进程),定时检测是否超时。
  • 其他进程怎么获取锁:主动探寻,实现定时器 → MySQL 只能实现非公平锁
  • 递归锁:表中增加一个字段 count。
  • 创建表。
    DROP TABLE IF EXISTS `dislock`;
    CREATE TABLE 

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

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

相关文章

Chapter 1-10. Introduction to Congestion in Storage Networks

Common Questions on Storage Networks This section covers some questions that we have been frequently asked and our responses to those questions. 本节包括我们经常被问到的一些问题以及我们对这些问题的答复。 Q: What is the difference between a network and a …

ArcGIS Desktop使用入门(三)图层右键工具——可见比例范围

系列文章目录 ArcGIS Desktop使用入门(一)软件初认识 ArcGIS Desktop使用入门(二)常用工具条——标准工具 ArcGIS Desktop使用入门(二)常用工具条——编辑器 ArcGIS Desktop使用入门(二&#x…

如何下载和安装Google Chrome扩展插件:一步步指南

Google Chrome 插件为我们提供了这样的便利,但有时找到一个有用的插件后,我们可能需要将其下载到本地以便离线使用或备份。 一、为什么可以从Google Chrome商店直接下载插件? Google Chrome 扩展插件主要通过Chrome Web Store分发&#xff…

scala---面向对象(类,对象,继承,抽象类,特质)

一、类(class)和 对象(object) 1、类 类就是对客观的一类事物的抽象。用一个class关键字来描述和Java一样,在这个类中可以拥有这一类事物的属性,行为等等。 2、为什么要有对象 在java中的一个class既可…

流氓软件清理绝杀全家桶

下载地址:流氓软件清理绝杀全家桶.zip 网上仍有不少软件中携带流氓软件,甚至某些所谓的大厂出品的工具中也会有一些捆绑! 对于玩机经验不太丰富的小白来说,也许一不小心,桌面就会被某些流氓软件搞得乌烟瘴气&#xf…

实验笔记之——RGBD GS-ICP SLAM配置与测试

《RGBD GS-ICP SLAM》是最新开源的一个3DGS-SLAM工作,通过利用GICP来实现当前帧gaussian与已mapping的gaussian进行匹配进行位姿的估算,并通过关键帧的选择策略来进一步提升performance~ Use G-ICP to align the current frame with the 3D GS map whic…

基于人脸识别的发型推荐系统代码实现

1.摘要 本文介绍了一个基于人脸识别技术的发型推荐系统的实现与分析。该系统利用Python编程语言和相关库,结合Face人脸识别API,实现了用户上传照片后的性别识别、脸型分析和发型推荐功能。首先,用户通过Tkinter GUI界面选择上传照片&#xff…

gpt在线网页版最全收录

ChatGPT镜像 今天在知乎看到一个问题:“平民不参与内测的话没有账号还有机会使用ChatGPT吗?” 从去年GPT大火到现在,关于GPT的消息铺天盖地,真要有心想要去用,途径很多,别的不说,国内GPT的镜像…

Linux网络基础 (二) ——(IP、MAC、端口号、TCPUDP协议、网络字节序)

文章目录 IP 地址基本概念源IP地址 & 目的IP地址 MAC 地址基本概念源MAC地址 & 目的MAC地址 端口号基本概念源端口号 & 目的端口号 TCP & UDP 协议基本概念TCP 与 UDP 的抉择 网络字节序大端、小端字节序 🎖 博主的CSDN主页:Ryan.Alask…

DAY8|344.反转字符串、541. 反转字符串II、151.翻转字符串里的单词

344.反转字符串、541. 反转字符串II、151.翻转字符串里的单词 344.反转字符串541. 反转字符串II151.翻转字符串里的单词 344.反转字符串 本题是字符串基础题目,就是考察 reverse 函数的实现,同时也明确一下 平时刷题什么时候用 库函数,什么时…

1.9 数据结构之 并查集

编程总结 在刷题之前需要反复练习的编程技巧,尤其是手写各类数据结构实现,它们好比就是全真教的上乘武功 本栏目为学习笔记参考:https://leetcode.cn/leetbook/read/disjoint-set/oviefi/ 1.0 概述 并查集(Union Find&#xff09…

vue2/vue3定时处理某个方法

一、vue2定时器 在Vue 2中,你可以使用mounted生命周期钩子来启动一个定时器,并在beforeDestroy钩子中清除它,以确保不会发生内存泄漏。以下是一个简单的例子: export default {data() {return {timerId: null};},mounted() {// …

# Nacos 服务发现-快速入门-测试多实例 Ribbon 负载均衡

Nacos 服务发现-快速入门-测试多实例 Ribbon 负载均衡 1、修改 服务生产模块 quickstart_provider 子工程中的 配置文件 application.yaml port: ${port:56010} # 启动端口 # 修改为动态传参,如果未传参数,默认端口为 56010 2、在 idea 中,…

内网渗透-Linux内网渗透

系列文章目录 文章目录 系列文章目录一、Linux内网渗透二、提权 2.1 利用内核漏洞进行提权2.2 利用文件权限配置不当进行提权2.3 利用SUID程序进行提权 三、隧道 3.1 SSH3.2 nc/ncat3.3 portmap3.4 portfw 四、反弹shell 4.1 bash4.2 netcat4.3 php4.4 perl4.5 python4.6 ruby4…

Prime (2021): 2

前言 这个靶机有亿点难,收获很多。打靶的时候,前面很顺,到创建ssh公钥之后就一点不会了。 1 01 arp扫描,发现有一个130,再查看端口 有22,80,129,445,10123 dirb扫描目录 这…

蓝牙技术在智能硬件中应用火热,你的蓝牙适配测试如何解决?

蓝牙技术在物联网中的应用非常广泛,可以为人们的生活和工作带来更多的便利和智能化体验,主要五大核心应用场景,具体如下: 1、智能家居 通过蓝牙连接智能家居设备,如智能灯泡、智能插座、智能恒温器等,可以…

chrome截屏插件用到的JavaScript 库,图像处理库,

包含的库介绍 javascripts\libs\ InboxSDK.js InboxSDK 是一个 JavaScript 库,用于在 Gmail 中添加应用菜单项目。它允许开发者向 Gmail 的应用菜单添加自己的项目,这些项目通常用于提供高级可折叠面板、导航或发送用户到已注册的不同路由 diigo-image-…

mysql 查询实战-变量方式-解答

对mysql 查询实战-变量方式-题目,进行一个解答。(先看题,先做,再看解答) 1、查询表中⾄少连续三次的数字 1,处理思路 要计算连续出现的数字,加个前置变量,记录上一个的值&#xff0c…

如何用C++判断一个系统是16位、32位还是64位?

如何用C判断一个系统是16位、32位还是64位&#xff1f; 方法一&#xff1a;使用指针的sizeof()判断 #include <iostream> using namespace std;int main() {int *p nullptr;if(sizeof(p) 8){cout << "64 bits system" << endl;}else if(sizeof(…