2019独角兽企业重金招聘Python工程师标准>>>

简介

NFS4实现“租赁锁”。每个锁拥有一样的“租赁期”。客户端的读写操作将刷新“租赁期”。租赁期到期后,锁将被服务器释放。NFS4通过下述“模型”实现对锁的管理:

1) 清晰地划分客户端和服务器;

2) 可靠的锁的一致性检测机制

3) 简单可靠的锁状态恢复机制

几个概念

Client -- 客户端是访问NFS服务器的资源的实体。客户端是包含直接访问NFS服务器的一个应用程序。客户端可以是传统的操作系统远程文件系统服务的应用程序。客户端负责维护一个或多个用户应用程序的NFS锁。客户端崩溃或失败时,它负责管理重新获取锁。请注意,多个客户端可以共享相同的传输;多个客户端可能存在于同一个网络节点。

Clientid  --- 64位的id标识符。客户端经过认证后,由服务器分配的整型数,用于后续通讯中标识客户端。

Server  --- 负责协调客户端访问文件系统的实体。

Stateid  --- 128位变量用于标识特定文件状态(打开和锁定)。由服务器分配,根据stateid可找到相应的状态信息表。

关键流程

1) 客户端认证(申请clientid)

客户端启动 --> 发送nfs_client_id4(verifier和id串) ,SETCLIENTID

--> 服务器分配clientid --> 客户端发送clientid 给服务器端,二次确认SETCLIENTID_CONFIRM --> 认证成功(建立server记录)

2) 状态建立(申请stateid) --> 带状态的文件操作 --> 撤销状态

客户端用clientid为特定lock_owner发起锁申请 --> 服务器锁定文件,并发回stateid (建立状态表)--> 客户端用stateid进行文件读写--> 撤销状态,即撤销stateid

NFS 4 为支持文件锁需要解决的问题:

1) 如何识别客户端?不同客户端?客户端重启?

2) 如何识别服务器?服务器是否重启?

3) 如何维护锁状态?正常流程?重启恢复?

4) 如何保证“至多一次”的锁状态更新?

5) 状态同步?客户端失败,服务器成功下的状态同步?

1) 如何识别客户端?不同客户端?客户端重启?

每个客户端均必须经过服务器端的认证,并获取服务器端分配的唯一标识符clientid。在后续操作中,NFS系统采用clientid表示该客户端。

客户端发起认证时,需提供两个信息,verifier和id,verifier用于表示该客户端是否是重启客户端(重启客户端将撤销所有此客户端的锁状态);id是该客户端用户标识自己身份的唯一字符串。Id串一般由如下几部分组成:客户端地址(ip+port),服务器地址(ip+port), MAC等机器唯一的信息。socket的通讯五元组可作为同一个server下的唯一标识串,加上MAC等信息是为了防止不同客户端的ip重用。

在上述id生成规则下,不同客户端将生成唯一的标识串。客户端重启时,id不变,仅改变verifier。为了实现重启时id不变,每个客户端配一个监控进程,监控进程生成id和verifier,并启动客户端,重启时改变verifier。

2) 如何识别服务器?服务器是否重启?

服务器的标识放在stateid中,由于服务器的唯一性,可用进程id来标识服务器。服务器重启后,进程id改变,相应的stateid中server标识也将改变,导致stateid失效。同时服务器重启将导致所有锁信息丢失(无信息持久化),也导致stateid失效。

3) 如何维护锁状态?正常流程?重启恢复?

正常流程:

针对特定文件,lock_owner可申请相应的锁(状态申请),得到服务器分配的stateid表示锁请求成功。在后续操作中,该owner均使用stateid进行文件操作。

异常处理流程:

a) 客户端失败:死锁,网络不可达,无法正常工作

NFS 4采用的租赁锁,有特定的租赁期限。若客户端失败,服务器不做任何特殊处理(无法区分客户端正常与否),等待租赁锁到期,锁自然释放。

b) 客户端重启

客户端重启,服务器根据客户端发过来的verifier可知客户端重启,服务器主动释放与该客户端id相关的所有锁。

c) 服务器失败 -- 无法处理,只能重启服务器

d) 服务器重启

服务器重启将导致所有的客户端锁状态失效,客户端进行文件操作时将知道lock状态丢失。当lock状态丢失,client应该重建锁状态。

Server重启后,lease period期间内为客户端重建锁状态时期。在此期间,server可以阻塞所有的读、写、lock等请求,除非server能够确保不发生锁冲突(比如持久化锁状态于磁盘)!

e) 网络不可达

网络不可达,基本等同于客户端失败,服务器等待租赁锁失效。但当网络不可达和服务器重启同时出现时,可能出现两种难以处理的情形,需要持久化存储锁状态方能解决,略去。

4) 如何保证“至多一次”的锁状态更新?

在和文件锁相关的操作中(加锁,升级,降级,解锁),多次操作是不允许的。这就要求相应的操作具有“至多一次(at-most-once)”语义。为实现“至多一次”的锁状态更新,NFS引入“序列化机制”,以应对网络重传和重排序。具体实现如下:每个锁状态更新请求均携带序列号。该序列号是一个连续递增整数,由客户端维护,不同lock_owners拥有不同的序列号,初始值为0。服务器在状态表中缓存最后收到的序列号(last sequence number (L))和应答(response)。只有当下次锁状态更新请求的序列号为L+1时,该请求才被视为有效请求!

注意:

a) 客户端必须保证不多于一个的锁状态更新请求!(同一锁状态更新请求可多次发送,序列号相同)

b) 当服务器收到相同的锁状态更新请求(序列号相同)时,缓存的应答将发送给客户端,而无相应锁操作被执行。

5) 状态同步?客户端失败,服务器成功下的状态同步?

当锁状态更新请求失败后,如超时,服务器的锁状态可能已经改变。为了保证客户端的锁状态的一致性,客户端应该重发“失败”的锁状态更新请求,同步状态,即客户端必须缓存失败的锁状态更新请求,并在下次提交锁状态更新请求前,重发该lock_owner缓存的锁状态更新请求!

“二次确认机制”也能确保状态的一致性,但成本高,重发机制,只有在失败后才会重新发送,成本低(锁状态更新请求远比客户端认证频繁!)。

参考文献:RFC 3530

转载于:https://my.oschina.net/linjiezang/blog/1845157

NFS4文件锁机制探秘相关推荐

  1. Spring Cloud Zuul重试机制探秘

    简介 本文章对应spring cloud的版本为(Dalston.SR4),具体内容如下: 开启Zuul功能 通过源码了解Zuul的一次转发 怎么开启zuul的重试机制 Edgware.RC1版本的优 ...

  2. Tensorflow broadcast 广播机制

    针对多维情况,需要保证维度一致性,举个栗子: 需要对保证除需广播的维度以外其余所有维度均相等即可 举个栗子 import tensorflow as tf a = tf.random_normal([ ...

  3. 锁机制:读者写者问题 Linux C

    最近碰到一些锁机制的问题,想起大三的时候做过的一个小课设,记录复习一下. 问题描述: 一个数据文件可以被多个进程共享,其中,有些进程要求读(reader进程),而另一些进程要求对数据进行写或修改(wr ...

  4. 高级 IO(非阻塞、多路复用、异步、存储映射、文件锁)

    目录 非阻塞I/O 阻塞I/O 与非阻塞I/O 读文件 阻塞I/O 的优点与缺点 使用非阻塞I/O实现并发读取 I/O 多路复用 何为I/O多路复用 select()函数 poll()函数 总结 异步 ...

  5. Futex系统调用,Futex机制,及具体案例分析

    Futex 1.背景 1.1 自己实现锁 1.1.1 自旋锁 1.1.2 sleep+自旋 1.1.3 小结 1.2 futex 1.2.1 什么是Futex 1.2.2 futex诞生之前 1.2. ...

  6. Linux中的线程同步机制-futex

    Linux中的线程同步机制(一) -- Futex 引子 在编译2.6内核的时候,你会在编译选项中看到[*] Enable futex support这一项,上网查,有的资料会告诉你"不选这 ...

  7. linux Futex同步机制

    Linux中的线程同步机制(一) -- Futex 引子 在编译2.6内核的时候,你会在编译选项中看到[*] Enable futex support这一项,上网查,有的资料会告诉你"不选这 ...

  8. Linux进程同步机制-Futex

    引子 在编译2.6内核的时候,你会在编译选项中看到[*] Enable futex support这一项,上网查,有的资料会告诉你"不选这个内核不一定能正确的运行使用glibc的程序&quo ...

  9. 浏览器缓存机制介绍与缓存策略剖析

    缓存可以减少网络 IO 消耗,提高访问速度.浏览器缓存是一种操作简单.效果显著的前端性能优化手段.对于这个操作的必要性,Chrome 官方给出的解释似乎更有说服力一些: 通过网络获取内容既速度缓慢又开 ...

最新文章

  1. YTU_3137: 动态规划基础题目之拦截导弹
  2. 转:求多边形的面积 算法几何
  3. spring-mvc(基础)
  4. ARM 之四 各集成开发环境(IDE)说明(Keil、RVDS、ADS、DS-5、MDK)
  5. Python-100例(5-6) 排序斐波那契数列
  6. android百度多渠道打包,Android多渠道打包方案的实践与优化
  7. 2019双11,支付宝有哪些“秘密武器”?
  8. Radon变换——MATLAB
  9. SpringMVC-01-基本组件与注解式编程
  10. 发现eclipse红叉,查看markers发现Target runtime Apache Tomcat 6.0 is not defined
  11. inode客户端连接成功上不了网_iNode智能客户端常见问题及解决办法
  12. windows必备的驱动软件推荐
  13. 【CQF Finance Class 4 金融衍生品】
  14. 两个经纬度偏角_怎么根据两个经纬度计算出航向
  15. 疫情下,数字化转型成功的“光明”
  16. 听劝!不要啥都不懂就学PMP!这100个考试关键点,带你直击考试现场
  17. 深入理解String.intern
  18. 关于nacos配置中心配置不成功的问题
  19. 杂谈---名言警句记录
  20. 魅思CMS10php开源版,魅思V10全能开源版,集成第三方支付接口_带站群功能,卡密系统+多线路播放...

热门文章

  1. Web前端开发CSS基础(2)
  2. 项目复审——Beta阶段
  3. 峰Redis学习(8)Redis 持久化AOF方式
  4. MYSQL:基础——触发器
  5. 玩转HTML5+跨平台开发[4] HTML表格标签
  6. css网页布局兼容性有哪些要点与诀窍
  7. Java多线程复习_Java多线程复习
  8. 全国计算机等级考试题库二级C操作题100套(第95套)
  9. php 数组降维,php 数组去重的方法参考(一维数组去重、二维数组去重)
  10. c语言位运算负数的实例_0基础学习C语言第三章:位运算