分布式锁在存储系统中的技术实践

简介: 阿里云存储提供了完整的分布式锁解决方案,经过了阿里云众多云产品宝贵的业务场景中长期锤炼,稳定高可靠,且提供了多种语言的SDK选择,甚至是RESTful集成方案。

1 背景

针对共享资源的互斥访问历来是很多业务系统需要解决的问题。在分布式系统中,通常会采用分布式锁这一通用型解决方案。本文将就分布式锁的实现原理、技术选型以及阿里云存储的具体实践进行论述。

5.png

图1 锁

2 从单机锁到分布式锁

在单机环境中,当共享资源自身无法提供互斥能力的时候,为了防止多线程/多进程对共享资源的同时读写访问造成的数据破坏,就需要一个第三方提供的互斥的能力,这里往往是内核或者提供互斥能力的类库,如下图所示,进程首先从内核/类库获取一把互斥锁,拿到锁的进程就可以排他性的访问共享资源。演化到分布式环境,我们就需要一个提供同样功能的分布式服务,不同的机器通过该服务获取一把锁,获取到锁的机器就可以排他性的访问共享资源,这样的服务我们统称为分布式锁服务,锁也就叫分布式锁。

6.png

图2 单机锁到分布式锁

由此抽象一下分布式锁的概念,首先分布式锁需要是一个资源,这个资源能够提供并发控制,并输出一个排他性的状态,也就是: 
锁 = 资源 + 并发控制 + 所有权展示 
以常见的单机锁为例: 
Spinlock = BOOL + CAS (乐观锁) 
Mutex = BOOL + CAS + 通知 (悲观锁) 
Spinlock和Mutex都是一个Bool资源,通过原子的CAS指令:当现在为0设置为1,成功的话持有锁,失败的话不持有锁,如果不提供所有权的展示,例如AtomicInteger,也是通过资源(Interger)+CAS,但是不会明确的提示所有权,因此不会被视为一种锁,当然,可以将“所有权展示”这个更多地视为某种服务提供形式的包装。 
单机环境下,内核具备“上帝视角”,能够知道进程的存活,当进程挂掉的时候可以将该进程持有的锁资源释放,但发展到分布式环境,这就变成了一个挑战,为了应对各种机器故障、宕机等,就需要给锁提供了一个新的特性:可用性。 
如下图所示,任何提供三个特性的服务都可以提供分布式锁的能力,资源可以是文件、KV等,通过创建文件、KV等原子操作,通过创建成功的结果来表明所有权的归属,同时通过TTL或者会话来保证锁的可用性。

7.png

图3 分布式锁的特性和实现

3 分布式锁的系统分类

根据锁资源本身的安全性,我们将分布式锁分为两个阵营: 
A:基于异步复制的分布式系统,例如mysql,tair,redis等; 
B:基于paxos协议的分布式一致性系统,例如zookeeper,etcd,consul等; 
基于异步复制的分布式系统,存在数据丢失(丢锁)的风险,不够安全,往往通过TTL的机制承担细粒度的锁服务,该系统接入简单,适用于对时间很敏感,期望设置一个较短的有效期,执行短期任务,丢锁对业务影响相对可控的服务。
基于paxos协议的分布式系统,通过一致性协议保证数据的多副本,数据安全性高,往往通过租约(会话)的机制承担粗粒度的锁服务,该系统需要一定的门槛,适用于对安全性很敏感,希望长期持有锁,不期望发生丢锁现象的服务。

4 阿里云存储分布式锁

阿里云存储在长期的实践过程中,在如何提升分布式锁使用时的正确性、保证锁的可用性以及提升锁的切换效率方面积累比较多的经验。

4.1 严格互斥性 
互斥性作为分布式锁最基本的要求,对用户而言就是不能出现“一锁多占”,那么存储分布式锁是如何避免该情况的呢?
答案是,服务端每把锁都和唯一的会话绑定,客户端通过定期发送心跳来保证会话的有效性,也就保证了锁的拥有权。当心跳不能维持时,会话连同关联的锁节点都会被释放,锁节点就可以被重新抢占。这里有一个关键的地方,就是如何保证客户端和服务端的同步,在服务端会话过期的时候,客户端也能感知,如下图所示,在客户端和服务端都维护了会话的有效期的时间,客户端从心跳发送时刻(S0)开始计时,服务端从收到请求(S1)开始计时,这样就能保证客户端会先于服务端过期。 用户在创建锁之后,核心工作线程在进行核心操作之前可以判断是否有足够的有效期,同时我们不再依赖墙上时间,而是基于系统时钟来对时间进行判断,系统时钟更加精确,且不会向前或者向后移动(秒级别误差毫秒级,同时在NTP跳变的场景,最多会修改时钟的速率)。

8.png

图4 存储场景的使用方式

在分布式锁互斥性上,我们是不是做到完美了?并非如此,还是存在一种情况下业务基于分布式锁服务的访问互斥会被破坏。我们来看下面的例子:如下图9所示,客户端在时间点S0尝试去抢锁,在时间点S1在后端抢锁成功,因此也产生了一个分布式锁的有效期窗口。在有效期内,时间点S2做了一个访问存储的操作,很快完成,然后在时间点S3判断锁的有效期依旧成立,继续执行访问存储操作,结果这个操作耗时良久,超过了分布式锁的过期时间,那么可能这个时候,分布式锁已经被其他客户端抢占成功,进而出现两个客户端同时操作同一批数据的可能性,这种可能性是存在的,虽然概率很小。

9.png

图6 越界场景

针对这个场景,具体的应对方案是在操作数据的时候确保有足够的锁有效期窗口,当然如果业务本身提供回滚机制的话,那么方案就更加完备,该方案也在存储产品使用分布式锁的过程中被采用。
还有一个更佳的方案,即,存储系统本身引入IO Fence能力。这里就不得不提Martin Kleppmann和redis的作者antirez之间的讨论了,redis为了防止异步复制导致的锁丢失的问题,引入redlock,该方案引入了多数派的机制,需要获得多数派的锁,最大程度的保证了可用性和正确性,但仍然有两个问题:
• 墙上时间的不可靠(NTP时间)
• 异构系统的无法做到严格正确性
墙上时间可以通过非墙上时间MonoticTime来解决(redis目前仍然依赖墙上时间),但是异构系统的只有一个系统并没有办法保证完全正确,如下图10所示,Client1获取了锁,在操作数据的时候发生了GC,在GC完成时候丢失了锁的所有权,造成了数据不一致。

10.png

图7 异构系统无法做到完全正确性

因此需要两个系统同时协作来完成一个完全正确的互斥访问,在存储系统引入IO Fence能力,如下图11所示,全局锁服务提供全局自增的token,Client1拿到锁返回的token是33,并带入存储系统,发生GC,当Client2抢锁成功返回34,带入存储系统,存储系统会拒绝token较小的请求,那么经过了长时间full gc重新恢复后的Client 1再次写入数据的时候,因为存储层记录的Token已经更新,携带token值为33的请求将被直接拒绝,从而达到了数据保护的效果(chubby的论文中有讲述,也是Martin Kleppmann提出的解决方案)。

11.png

图8 引入IO Fence能力

这与阿里云分布式存储平台盘古的设计思路不谋而合,盘古支持了类似IO Fence的写保护能力,引入Inline File的文件类型,配合Seal File操作,这就有着类似IO Fence的写保护能力,首先,SealFile操作用来关闭已经打开的cs上面的文件,防止旧的Owner继续写数据;其次,InlineFile可以防止旧的Owner打开新的文件。这两个功能事实上也是提供了存储系统中的Token支持。

4.2 可用性
存储分布式锁通过持续心跳来保证锁的健壮性,让用户不用投入很多精力关注可用性,但也有可能异常的用户进程持续占据锁。针对该场景,为了保证锁最终可以被调度,提供了可以安全释放锁的会话加黑机制。
当用户需要将发生假死的进程持有的锁释放时,可以通过查询会话信息,并将会话加黑,此后,心跳将不能正常维护,最终导致会话过期,锁节点被安全释放。这里我们不是强制删除锁,而是选用禁用心跳的原因如下:

  1. 删除锁操作本身不安全,如果锁已经被其他人正常抢占,此时删锁请求会产生误删除。
    b.删除锁后,持有锁的人会话依然正常,它仍然认为自己持有锁,会打破锁的互斥性原则。

4.3 切换效率 
当进程持有的锁需要被重新调度时,持有者可以主动删除锁节点,但当持有者发生异常(如进程重启,机器宕机等),新的进程要重新抢占,就需要等待原先的会话过期后,才有机会抢占成功。默认情况下,分布式锁使用的会话生命期为数十秒,当持有锁的进程意外退出后(未主动释放锁),最长需要经过很长时间锁节点才可以被再次抢占。

12.png

图5 客户端和服务各自维护过期时间

要提升切换精度,本质上要压缩会话生命周期,同时也意味着更快的心跳频率,对后端更大的访问压力。我们通过对进行优化,使得会话周期可以进一步压缩。 
同时结合具体的业务场景,例如守护进程发现锁持有进程挂掉的场景,提供锁的CAS释放操作,使得进程可以零等待进行抢锁。比如利用在锁节点中存放进程的唯一标识,强制释放已经不再使用的锁,并重新争抢,该方式可以彻底避免进程升级或意外重启后抢锁需要的等待时间。

5 结语

阿里云存储提供了完整的分布式锁解决方案,经过了阿里云众多云产品宝贵的业务场景中长期锤炼,稳定高可靠,且提供了多种语言的SDK选择,甚至是RESTful集成方案。
分布式锁提供了分布式环境下共享资源的互斥访问,业务或者依赖分布式锁追求效率提升,或者依赖分布式锁追求访问的绝对互斥。同时,在接入分布式锁服务过程中,要考虑接入成本、服务可靠性、分布式锁切换精度以及正确性等问题,正确和合理的使用分布式锁,是需要持续思考并予以优化的。

 

原文链接
本文为阿里云原创内容,未经允许不得转载。

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

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

相关文章

Spring Cloud 应用在 Kubernetes 上的最佳实践 — 高可用(混沌工程)

简介: 从上篇开始,我们进入到了高可用的章节,上篇提到的熔断能力,是历年保障大促当天晚上整个系统不被洪峰流量打垮的法宝,本篇介绍的措施与熔断有不一样的地方? 前言 从上篇开始,我们进入到了…

闲鱼对Flutter-Native混合工程解耦的探索

简介: 分手快乐,祝你快乐~ 作者:祈晴 1. 闲鱼Flutter现状 闲鱼是第一个使用Flutter混合开发的大型应用,但闲鱼客户端开发最深入体会的痛点就是编译时长影响开发体验。在FlutterNative这种开发模式下,Nat…

学 Python 最大的 1 个误区,看看你中招了吗?

提起 Python,大家总觉得很简单。但是,能把 Python 用好的人,好像并没多少。随着 Python 火了之后,像“ 3 天带你学会 Python ”、“快速入门到全栈”这样的教程层出不穷。很多讲了一点基础语法后,还没讲 http 协议和异…

Unable to make public jdk.internal.loader.Resource jdk.internal.loader.URLClassPath.getResource(jav

文章目录1. 现象2. 异常截图2. 解决方案3. 执行命令4. 启动日志5. 浏览器效果图1. 现象 执行命令 xjar.exe java -jar unified-access-center-passwd.jar运行 sprinbgboot 打包的jar包报错 具体信息如下: C:\Users\gblfy\Desktop\xJarDir>xjar.exe java -jar…

win10安装go开发环境

文章目录1. 下载软件2. 安装3. 验证1. 下载软件 golang官网:https://golang.google.cn/dl/ 2. 安装 双击go1.19.1.windows-amd64.msi一路下一步 3. 验证 go version

3 张图带你走近蚂蚁mPaaS音视频通话组件

简介: 远程问诊、线上开户、车载语音通话……蚂蚁 mPaaS 正在“拥抱新技术,探索新未来”。 音视频技术的进步,让线上办公不再是一时权宜之计,也使得线上业务的“无接触”开展成为可能。近日,蚂蚁集团推出的移动开发平台…

立即生效!帕特·基辛格卸任 VMware 所有职务

整理 | 苏宓出品 | CSDN(ID:CSDNnews)心无二用,在帕特基辛格(Pat Gelsinger)成为英特尔新任 CEO 两个月后,他宣布辞去此前的 VMware 首席执行官的职务,全身心地帮助英特尔重建往日的…

云原生应用实现规范 - 初识 Operator

简介: 本文我们将首先了解到 Operator 是什么,之后逐步了解到 Operator 的生态建设,Operator 的关键组件及其基本的工作原理,下面让我们来一探究竟吧。 作者 | 匡大虎、阚俊宝 基于 Kubernetes 平台,我们可以轻松的…

如何基于 K8s 构建下一代 DevOps 平台?

简介: 当前云原生 DevOps 体系现状如何?面临哪些挑战?如何通过 OAM 解决云原生 DevOps 场景下的诸多问题?云原生开发应用模型 OAM(Open Application Model) 社区核心成员孙健波将为大家一一解答,并分享如何基于 OAM 和…

中国电子云发布专属云CECSTACK 以全栈信创赋能千行百业

2021年4月26日,第四届数字中国建设峰会召开之际,中国电子云在福州举办“云可信 创未来——中国电子云全系产品发布暨战略伙伴签约仪式”,重磅发布中国电子云“信创”实践和全栈自主专属云CECSTACK。中国电子副总经理、党组成员陈锡明&#xf…

idea 双击打不开了咋办

文章目录1. 文件内容还原2. 删除以前旧文件3. 删除以前缓存文件1. 文件内容还原 首先检查一下idea64.exe.vmoptions是否有改动 有的话可以把-javaagent的这一行删除,删除后保存再尝试看看能不能打开。 2. 删除以前旧文件 如果还是不行的话我们可以找打开 C:\Us…

使用日志审计查看MaxCompute执行过哪些操作

简介: MaxCompute完整地记录用户的各项操作行为,会自动将操作日志实时投递到ActionTrail中,ActionTrail针对作业(Instance)、表(Table)、函数(Function)、资源&#xff0…

谈“云”色变?近80%企业曾遭受数据泄露

出品 | 《大咖来了》 一边是企业上云这一毋庸置疑的发展趋势,但另一边,云数据泄露事件的频繁,却让不少企业谈“云”色变。 2020年2月,万豪酒店520万客人信息被泄露,英国信息专员办公室(ICO)对其进行了1840万英镑(约1.…

云网络十年:探路者阿里云的理想和坚持

简介: 转载自CSDN:专访阿里云网络产品线负责人,阿里云智能研究员祝顺民(花名江鹤)和阿里云资深产品专家吴天议。 近日,阿里巴巴发布强劲财季业绩后,高盛、摩根大通等多家机构上调阿里云估值至千…

电商搜索“随便逛逛,想知道大家都在搜什么?现在什么最热门?”

简介: 有时候用户只是随便逛逛,没有明确的搜索意图,如何推荐更多优质查询词,引导其搜索、购买那?本文结合实际案例运用阿里云开放搜索的解决方案实现优化。 案例背景 某O2O电商平台,线下覆盖上百家连锁超…

汇量科技收购热云数据,加速SaaS工具生态布局

4月28日,全球性技术服务平台汇量科技Mobvista(HK.1860)发布公告,宣布将全资收购热云数据——国内领先的第三方移动监测和营销科技公司,总交易对价超过15亿人民币(含现金及股票)。收购完成后,热云数据将作为汇量科技旗下全资子公司…

Fluid: 让大数据和 AI 拥抱云原生的一块重要拼图

简介: 如何驱动大数据、AI 应用在云原生场景下高效运行是一个既有理论意义又具应用价值的重要挑战性问题,为系统化解决相关问题,学术界和工业界密切合作,南京大学 PASALab 副研究员顾荣博士、阿里云容器服务高级技术专家车漾、All…

估值百亿独角兽爱学习教育集团:通过云原生实践与时间赛跑

简介: iiMedia Research(艾媒咨询)数据显示,在线教育市场规模保持逐年增长的态势,2019年在线教育市场规模已突破4000亿元。在疫情的助推下,在线教育加速渗透,市场空间有望进一步打开&#xff0c…

腾讯云~安装ActiveMQ

文章目录1. docker 构建2. 腾讯云防火墙策略3. 效果图1. docker 构建 docker pull webcenter/activemq mkdir /app/activemq/log -p docker run --nameactivemq \-itd \-p 8161:8161 \-p 61616:61616 \-e ACTIVEMQ_ADMIN_LOGINadmin \-e ACTIVEMQ_ADMIN_PASSWORD123456 \--res…

如何实现一个跨库连表SQL生成器?

简介: 用户只需在前端简单配置下指标,系统即可自动生成大宽表,让用户查询到他所需要的实时数据,数据源支持跨库并支持多种目标介质。这样的数据全局实时可视化如何实现?本文从需求分析开始,分享自动生成SQL…