理解分布式锁的实现过程

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 理解分布式锁的实现过程

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

在分布式系统中,一个应用部署在多台机器当中,在某些场景下,
为了保证数据一致性,要求在同一时刻,同一任务只在一个节点上运行,即保证某个行为在同一时刻只能被一个线程执行;
在单机单进程多线程环境,通过锁很容易做到,
比如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服务期高级架构系统教程学习:链接

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
6月前
|
缓存 NoSQL 关系型数据库
几种分布式锁的实现方式
几种分布式锁的实现方式
55 2
|
1月前
|
SQL NoSQL 安全
分布式环境的分布式锁 - Redlock方案
【10月更文挑战第2天】Redlock方案是一种分布式锁实现,通过在多个独立的Redis实例上加锁来提高容错性和可靠性。客户端需从大多数节点成功加锁且总耗时小于锁的过期时间,才能视为加锁成功。然而,该方案受到分布式专家Martin的质疑,指出其在特定异常情况下(如网络延迟、进程暂停、时钟偏移)可能导致锁失效,影响系统的正确性。Martin建议采用fencing token方案,以确保分布式锁的正确性和安全性。
43 0
|
3月前
|
NoSQL 关系型数据库 MySQL
分布式锁设计问题之分布式锁内部实现的如何解决
分布式锁设计问题之分布式锁内部实现的如何解决
|
3月前
|
存储 调度
分布式锁设计问题之分布式锁系统通常设计其架构如何解决
分布式锁设计问题之分布式锁系统通常设计其架构如何解决
|
5月前
|
NoSQL 算法 Java
浅谈分布式锁设计
浅谈分布式锁设计
50 0
|
6月前
|
缓存 NoSQL 数据库
分布式锁三种实现方式及对比
分布式锁三种实现方式及对比
165 0
|
6月前
|
NoSQL 安全 Java
面试官:分布式锁最终解决方案是RedLock吗?为什么?
面试官:分布式锁最终解决方案是RedLock吗?为什么?
97 1
|
6月前
|
存储 缓存 NoSQL
分布式锁的常见实现方式有哪些
分布式锁的常见实现方式有哪些
|
存储 NoSQL 关系型数据库
分布式锁的实现方式
分布式锁的实现方式
71 0
|
NoSQL 算法 Redis
分布式锁的一些细节问题,值得收藏
分布式锁的一些细节问题,值得收藏