理解分布式锁的实现过程

news2024/11/21 0:28:56

背景:分布式锁在后端开发者会用到,它有哪些特点呢?

在分布式系统中,一个应用部署在多台机器当中,在某些场景下,
为了保证数据一致性,要求在同一时刻,同一任务只在一个节点上运行,即保证某个行为在同一时刻只能被一个线程执行;
在单机单进程多线程环境,通过锁很容易做到,
比如mutex、spinlock、信号量等;而在多机多进程环境中,此时就需要分布式锁来解决了;

所谓的分布式场景就是:多机器,多网段,通过socket通信。

需要注意的问题

互斥性

同时只允许一个持锁对象进入临界资源;其他待持锁对象要
么等待,要么轮询检测是否能获取锁;
有唯一的标识。

锁超时

允许持锁对象持锁最长时间;如果持锁对象宕机,需要外力
解除锁定,方便其他持锁对象获取锁;

高可用

锁存储位置若宕机,可能引发整个系统不可用;应有备份存储位置和切换备份存储的机制,从而确保服务可用;
在合理的时间内得到合理的回复,备份点可以理解为不同的服务器,总节点数应为奇数。

容错性

若锁存储位置宕机,恰好锁丢失的话,是否能正确处理;
当一个“上锁/解锁”的请求应答过半时,就可以认为请求成功。

etcd , redis ,mysql 这三种数据库做分布锁对比

  1. 完备性 etcd > redis > mysql
  2. 性能 redis > etcd > mysql
  3. 选择:如果系统上三者都有,选etcd; 如果只有mysql,不会为了实现分布式锁而加入redis 或者 etcd

上面的内容太抽象了,怎么实现呢?

需要抓住 “多机器,多网段,通过socket通信” 这个分布式的要义,然后分布锁是通过数据库的表去实现的,
表里面的primary-key对应 分布式锁的唯一性

以mysql为例尝试性解释

相关的代码:

创建表:

DROP TABLE IF EXISTS `dislock`;
CREATE TABLE `dislock` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT
COMMENT '主键',
`lock_type` varchar(64) NOT NULL COMMENT '锁类
型',
`owner_id` varchar(255) NOT NULL COMMENT '持锁对
象',
`update_time` timestamp NOT NULL DEFAULT
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_lock_type` (`lock_type`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT
CHARSET=utf8 COMMENT='分布式锁表';

加锁

INSERT INTO dislock (`lock_type`, `owner_id`)
VALUES ('act_lock', 'ad2daf3');

解锁

DELETE FROM dislock WHERE `lock_type` = 'act_lock'
AND `owner_id` = 'ad2daf3';

互斥性的理解

加锁,某个节点往服务器表里面插入lock_type,它是唯一的,跟锁的特性一致,一旦数据库有了’act_lock’, ‘ad2daf3’,其它节点再想往里面插入,就会失败,相当于被锁住了。
方便理解可以参考下图
在这里插入图片描述

lock理解为数据库中的分布锁对应的表
节点S1通过socket发送加锁指令到lock,S2,S3,S4再发送加锁指令到lock,因为lock_type的唯一性,加锁失败;
只有等到S1通过socket发送解锁指令到lock,或者S1 lock超时,S2,S3,S4才有再次加锁的可能。

锁超时的理解

加锁、解锁的对象只能为同一个(超时除外),S1加的锁,只能由S1去解。
在S1宕机,或者通信故障的时候,由“锁超时”功能去处理,把超的锁解锁,或者删掉。
锁超时功能:在节点(服务器)开启超线程:对锁进行超时检测,超时就对其进行解锁

高可用性的理解

创建表,可以在多台机器上都创建,也就是备份,如下图:
开起多个备份点,R1~R5是含有lock的服务节点,它们之间的数据是相互备份的。
在这里插入图片描述

容错性的理解

假如R1宕机,
还可以从R2~R4获取数据。
另一方面,加锁、解锁等操作都可以同时向R1~R5发起,半数以上通过即可认为有效。
这里涉及到的算法有:raft一致性算法等
有些复杂了,暂更新到这。。。
文章参考与<零声教育>的C/C++linux服务期高级架构系统教程学习:链接

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

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

相关文章

【计算机网络复习】第七章 物理层

物理层的位置和基本功能 u 网络体系结构的最底层&#xff0c;实现真正的数据传输 u 将二进制数据编码或调制成信号&#xff0c;发送到传输介质(传输媒体)&#xff1b; u 从传输介质接收信号&#xff0c;转换成二进制数据 物理层的主要功能 u 规定了与传输介质的接口的特…

chatgpt赋能python:判断Python中的字符类型

判断Python中的字符类型 在Python编程中&#xff0c;有时我们需要判断一个字符的类型。Python提供了几种方法来判断字符类型。本文将介绍这些方法并提供示例代码。 1. 使用内置函数ord() ord()函数可以返回一个字符的Unicode编码。使用这个方法我们可以判断一个字符是否是数…

【LGR-142-Div.4】洛谷入门赛 #13 考后分析与题解

洛谷入门赛 #Round 13 比赛分析与总结T1 魔方魔方题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示数据规模与约定 分析AC代码注意 T2 教学楼教学楼题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示样例…

尚硅谷甄选--更新中

文章目录 搭建后台管理系统模板项目初始化2.1.1环境准备2.1.2初始化项目2.2项目配置一、eslint配置1.1vue3环境代码校验插件1.2修改.eslintrc.cjs配置文件1.3.eslintignore忽略文件1.4运行脚本 二、配置**prettier**2.1安装依赖包2.2.prettierrc.json添加规则2.3.prettierignor…

Shell编程条件语句(if、case)

目录 一、Shell条件语句 1.条件表达式测试 2.文件测试 3.整数值比较 4.字符串比较 5.逻辑测试 二、if 条件语句&#xff08;串行执行&#xff09; &#xff08;1&#xff09;单分支结构 &#xff08;2&#xff09;双分支结构 &#xff08;3&#xff09;多分支结构 三…

C语言之数据在内存中的存储习题讲解

上个博客我们讲到了整型家族,对于整型家族来说有有符号和无符号之分 short signed short unsigned short int signed int unsigned int char在VS环境上其实是signed char unsigned char 对于有符号的char来说,把二进制位序列中的最高位当成符号位 对于无符号的char来…

【计算机组成原理与体系结构】控制器

目录 一、CPU的功能与基本结构 二、指令周期的数据流 三、数据通路 四、硬布线控制器 五、微程序控制器 六、微指令 一、CPU的功能与基本结构 运算器基本结构 控制器基本结构 CPU的基本结构 二、指令周期的数据流 取址周期 间址周期 中断周期 指令周期流程 三、数据通路 …

微信云开发

微信云数据库 快速开始&#xff1a;小程序/小游戏 | 微信开放文档 (qq.com) 首先微信云开发需要一个真实小程序的 AppID&#xff0c;而不能使用测试号。 然后点击这个开通云开发 云的环境大概是这样的 首先我们要初始化 否则会像这样&#xff0c;报错 写在app.js的 onLaunc…

LearnOpenGL-高级OpenGL-11.抗锯齿

本人初学者&#xff0c;文中定有代码、术语等错误&#xff0c;欢迎指正 文章目录 抗锯齿多重采样锯齿产生原因多重采样方式 OpenGL的MSAA例子&#xff1a;提示GLFW离屏MSAA例子1&#xff1a;多重采样帧缓冲传送到屏幕上例子2&#xff1a;采样多重采样帧缓冲的纹理缓冲与后期效果…

【华为OD统一考试B卷 | 100分】太阳能板最大面积(C++ Java JavaScript Python)

题目描述 给航天器一侧加装长方形或正方形的太阳能板(图中的红色斜线区域),需要先安装两个支柱(图中的黑色竖条),再在支柱的中间部分固定太阳能板。 但航天器不同位置的支柱长度不同,太阳能板的安装面积受限于最短一侧的那根支柱长度。如图: 现提供一组整形数组的支柱高…

chatgpt赋能python:如何升级你的Python到最新版本

如何升级你的Python到最新版本 Python作为一种强大的编程语言&#xff0c;拥有广泛的用途&#xff0c;从网站开发到数据科学&#xff0c;都可以使用它来实现。然而&#xff0c;Python不断更新&#xff0c;每个新版本都带来了新的功能和改进&#xff0c;因此升级Python到最新版…

二叉树概念(二)

平衡二叉树 AVL树(Adelson-Velsky 和 Landis) 左子树和右子树的高度之差的绝对值小于等于1 C++ 中,可以直接使用 std::set 类作为平衡二叉树;Java 中,可以直接使用 TreeSet。在 Python 中,没有内置的库可以用来模拟平衡二叉树。 力扣 红黑树 (Red-Black Tree) 是一种二…

Shell脚本数组简介及运用

目录 一、数组简介 二、数组支持的数据类型 三、定义数组 四、获取数组某个索引处的值 五、遍历数组元素 六、获取数组长度 七、截取数组元素 八、数组的元素替换 1.临时替换 2.永久替换 九、删除元素或数组 十、数组追加元素 1.满元素数组追加 2.非满元素数组追…

【模块三:职业成长】39|能力维度四:如何从做技术到为企业创造生存优势?

你好&#xff0c;我是郭东白。今天这节课是架构师能力维度的第四部分&#xff0c;我们来继续探索架构师成长过程的能力跃迁。不过今天我们会连续讲两个跃迁&#xff1a;从跨域架构师到总架构师&#xff08;首席架构师&#xff09;的跃迁&#xff1b;从总架构师再到 CTO 的跃迁。…

浅尝 xen 虚拟化

前言 之前分享过使用 oVirt 部署私有虚拟化环境, oVirt 是基于 KVM 虚拟化开发了一系列的管理工具, 以 Web Console /CLI 的方式交付使用. 今天记录和分享的是在 VMware Workstation 中使用 Alpine 作为基础操作系统部署 xen 虚拟化环境的简单测试. xen 基本概念 xen 可以理…

chatgpt赋能python:Python的发音

Python的发音 Python是一种广泛使用的编程语言&#xff0c;用于web开发、数据分析、科学计算等众多领域。然而&#xff0c;Python这个词汇的发音在不同的地方却存在差异。在本文中&#xff0c;我们将介绍Python的发音&#xff0c;解决大家的困惑。 发音方式 Python在英语中常…

【数学建模系列】TOPSIS法的算法步骤及实战应用——MATLAB实现

文章目录 TOPSIS简介方法和原理数学定义数学语言描述现实案例 正负理想解定义实例 量纲 TOPSIS法的算法步骤1.用向量规范化的方法求得规范决策矩阵2.构成加权规范阵C(c~ij~)~m*n~3.确定正负理想解的距离4.计算各方案到正理想解与负理想解的距离5.计算各方案的综合评价指数6.排列…

STM32源码阅读记录之HAL库(SystemTick)

问题 HAL_Delay是怎么做到可以延迟控制的? 分析记录 步骤01&#xff1a;看函数本身 void HAL_Delay(uint32_t Delay); /*** brief 此函数根据变量递增提供最小延迟&#xff08;以毫秒为单位&#xff09;。* note 在默认的实现中&#xff0c;SysTick计时器是时基的来源。它用…

【Leetcode -225.用队列实现栈 -232.用栈实现队列】

Leetcode Leetcode -225.用队列实现栈Leetcode -232.用栈实现队列 Leetcode -225.用队列实现栈 题目&#xff1a;仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 …

chatgpt赋能python:Python实践:如何升级pip

Python实践&#xff1a;如何升级pip Python作为一门高效的脚本语言&#xff0c;被广泛应用于数据分析、人工智能、Web开发等领域。而pip则是Python的包管理工具&#xff0c;是开发Python应用的必备工具。但是pip在使用过程中&#xff0c;有时候会出现版本不兼容或者出现漏洞等…