NFS文件锁一致性设计原理解析

简介: 在存储系统中, NFS(Network File System,即网络文件系统)是一个重要的概念,已成为兼容POSIX语义的分布式文件系统的基础。它允许在多个主机之间共享公共文件系统,并提供数据共享的优势,从而最小化所需的存储空间。本文将通过分析NFS文件锁状态视图一致性的原理,帮助大家理解NFS的一致性设计思路。

文件锁

文件锁是文件系统的最基本特性之一,应用程序借助文件锁可以控制其他应用对文件的并发访问。NFS作为类UNIX系统的标准网络文件系统,在发展过程中逐步的原生地支持了文件锁(从NFSv4开始)。NFS从上个世界80年代诞生至今,共发布了3个版本:NFSv2、NFSv3、NFSv4。NFSv4最大的变化是有“状态”了。某些操作需要服务端维持相关状态,如文件锁,例如客户端申请了文件锁,服务端就需要维护该文件锁的状态,否则其他客户端冲突的访问就无法检测。如果是NFSv3就需要NLM协助才能实现文件锁功能,但是有的时候两者配合不够协调就会容易出错。而NFSv4设计成了一种有状态的协议,自身就可以实现了文件锁功能,也就不需要NLM协议了。

应用接口

应用程序可以通过fcntl()或flock()系统调用管理NFS文件锁,下面NAS使用NFSv4挂载时获取文件锁的调用过程:

3.jpg

从上图调用栈容易看出来,NFS文件锁实现逻辑基本复用了VFS层设计和数据结构,在通过RPC从Server成功获取文件锁后调用locks_lock_inode_wait()函数将获得文件锁交给到VFS层管理,关于VFS层文件锁设计的相关资料比较多,在此就不再描述了。

EOS原理

文件锁是典型的非幂等操作,文件锁操作的重试和Failover会导致文件锁状态视图在客户端和服务端间的不一致。NFSv4借助SeqId机制设计了最多执行一次的机制,具体方法如下:

针对每个open/lock状态Client和Server同时独立维护seqid,Client在发起会引起状态变化的操作时(open/close/lock/unlock/release_lockowner)会将seqid加1,并作为参数发送给Server,假定Client发送的seqid为R,Server维护的seqid为L,则:
1) 若R == L +1,表示合法请求,正常处理之;
2) 若R == L,表示重试请求,Server将缓存的reply返回即可;
3) 其他情况均为非法请求,决绝访问。
根据上述规则,Server可判断操作是否为正常、重试或非法请求。

该方法能够保证每个文件锁操作在服务端最多执行一次,解决了RPC重试带来的重复执行的问题,但是仅靠这一点是不够的。比如LOCK操作发送后调用线程被信号中断,此后服务端又成功接受并执行了该LOCK操作,这样服务端就记录了客户端持有了锁,但客户端中却因为中断而没有维护这把锁,客户端和服务端间的锁状态视图不一致就发生了。因此,客户端还需配合处理异常场景,最终才能够做到文件锁视图一致性。

异常处理

由上一节分析可知,客户端需要配合处理异常场景才能够保证文件视图一致性,那么客户端设计者主要做了哪些配合的设计呢?目前客户端主要从SunRPC和NFS协议实现两个维度相互配合解决该问题,下面会分别介绍这两个维度的设计如何保证了文件锁状态视图一致性。

SunRPC设计

SunRPC是Sun公司专门为远程过程调用设计的网络通讯协议,这里从保障文件锁视图一致性的维度来了解一下SunRPC实现层面的设计理念:
1) 客户端使用int32_t类型的xid标识上层使用者发起的每个远程过程调用过程,每个远程过程调用的多次RPC重试使用相同的xid标识,这样就保障了多次RPC重试中任何一个返回就可以告知上层远程过程调用已经成功,保证了服务端执行远程过程调用执行耗时较长时也能拿到结果,这一点和传统的netty/mina/brpc等都需要每个RPC都要有独立的xid/packetid不同;
2) 服务端设计了DRC(duplicate request cache)缓存最近执行的RPC结果,接收到RPC时会首先通过xid检索DRC缓存,若命中则表明RPC为重试操作,直接返回缓存的结果即可,这在一定程度上规避了RPC重试带来的重复执行的问题。为了避免xid复用导致DRC缓存返回非预期的结果,开发者通过下述设计进一步有效地减少复用引起错误的概率:
a) 客户端建立新链接时初始xid采用随机值:
b) 服务端DRC会额外记录请求的校验信息,缓存命中时会同时校验这些信息;
3) 客户端允许在获得服务端相应前无限重试,保证调用者能够获得服务端确定性的执行结果,当然这样的策略会导致无响应时调用者会一直hang;
4) NFS允许用户在挂载时通过soft/hard参数指定SunRPC的重试策略,其中soft模式禁止超时后重试,hard模式则持续重试。当用户使用soft模式挂载时NFS实现不保证客户端和服务端状态视图的一致性,在遇到远程过程调用返回超时要求应用程序配合状态的清理和恢复,比如关闭访问出错的文件等,然而实践中很少有应用程序会配合,所以一般情况下NAS用户都使用hard模式挂载;
总之,SunRPC要解决的核心问题之一是远程过程调用执行时间是不可控的,协议设计者为此定制化设计,尽量避免非幂等操作RPC重试带来的副作用。

信号中断

应用程序等待远程过程调用结果时允许被信号中断。当发生信号中断时由于没有得到远程过程调用的执行结果,所以客户端和服务端的状态很可能就不一致了,比如加锁操作在服务端已经成功执行,但客户端并不知道这个情况。这就要求客户端做额外的工作将状态和服务端恢复一致。下面简要分析获取文件锁被信号中断后的处理说明NFS协议实现层面的一致性设计。
通过获取NFSv4文件锁的过程可知,NFSv4获取文件锁最终会调用_nfs4_do_setlk()函数发起RPC操作,最终调用nfs4_wait_for_completion_rpc_task()等待,下面是相关代码:

5684 static int _nfs4_do_setlk(struct nfs4_state state, int cmd, struct file_lock fl, int recovery_type)
5685 {

  ......

5718 task = rpc_run_task(&task_setup_data);
5719 if (IS_ERR(task))
5720 return PTR_ERR(task);
5721 ret = nfs4_wait_for_completion_rpc_task(task);
5722 if (ret == 0) {
5723 ret = data->rpc_status;
5724 if (ret)
5725 nfs4_handle_setlk_error(data->server, data->lsp,
5726 data->arg.new_lock_owner, ret);
5727 } else
5728 data->cancelled = 1;

   ......}

Copy
通过分析nfs4_wait_for_completion_rpc_task()实现可知,当ret < 0时,表明获取锁过程被信号中,并使用struct nfs4_lockdata的cancelled成员记录。继续查看rpc_task完成后释放时的回调函数nfs4_lock_release():

4.jpg

从上面红色框中代码可知,nfs4_lock_release()检测到存在信号中断时会调用nfs4_do_unlck()函数尝试将可能成功获得文件锁释放掉,注意此时没有调用nfs_free_seqid()函数将持有的nfs_seqid释放掉,这是为了:
1) 保证订正状态过程中不会有用户新发起的并发加锁或者释放锁操作,简化实现;
2) 保证hard模式下UNLOCK操作只会在LOCK操作返回后才会发送,保障已经获得锁能够被释放掉;
客户端通过上面的方法能够有效地保证信号中断后客户端和服务端锁状态的最终一致性,但也是在损失一部分可用性为代价的。

总结

文件锁是文件系统原生支持的基础特性,NAS作为共享的文件系统要面临客户端和服务端锁状态视图一致性的问题,NFSv4.0在一定程度上解决了这个问题,当然,技术前进的脚步不会停止,NFS的更新迭代也就不会停止,未来的NFS将会有更多的期待。

 

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

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

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

相关文章

作为工程师,你真的了解无服务器?

译者 | 王欢来源 | 分布式实验室头图 | 下载于ICphoto最近&#xff0c;我在YouTube上看了一个非常出色的开发人员的视频。它的标题是“无服务器毫无意义”。虽然我非常喜欢该视频&#xff0c;但也不敢确定作者关于无服务器的观点是否完全正确&#xff0c;因此我想在本文中进行讨…

recaf反编译 java jar包

文章目录1. 获取方式2. 软件运行3. 导入jar4. 模式切换5. 字符串混淆解析1. 获取方式 添加QQ群获取197453088 2. 软件运行 java -jar recaf-2.21.13.jar3. 导入jar 4. 模式切换 5. 字符串混淆解析 如何解密Allatori 混淆的字符串 Java ALLATORIxDEMO

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

简介&#xff1a; 阿里云存储提供了完整的分布式锁解决方案&#xff0c;经过了阿里云众多云产品宝贵的业务场景中长期锤炼&#xff0c;稳定高可靠&#xff0c;且提供了多种语言的SDK选择&#xff0c;甚至是RESTful集成方案。 1 背景 针对共享资源的互斥访问历来是很多业务系统…

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

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

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

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

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

提起 Python&#xff0c;大家总觉得很简单。但是&#xff0c;能把 Python 用好的人&#xff0c;好像并没多少。随着 Python 火了之后&#xff0c;像“ 3 天带你学会 Python ”、“快速入门到全栈”这样的教程层出不穷。很多讲了一点基础语法后&#xff0c;还没讲 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包报错 具体信息如下&#xff1a; C:\Users\gblfy\Desktop\xJarDir>xjar.exe java -jar…

win10安装go开发环境

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

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

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

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

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

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

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

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

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

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

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

idea 双击打不开了咋办

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

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

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

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

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

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

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

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

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

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

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

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

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