由于多个客户端可以挂载同一个文件系统,如何在多个客户端之间保持数据一致性是个非常麻烦的问题,NFSv2和NFSv3没有规定具体的方法,一般的做法是客户端不定期检查文件是否发生了冲突,比如读操作中在发起READ请求前可能要发起GETATTR请求,判断本地缓存是否有效。在大规模系统中以及当客户端和服务器分布比较遥远时就会影响系统性能,因为GETATTR操作需要一定的执行时间。

NFSv4引入了一种机制保持文件缓存一致性,这种机制称为delegation。这种机制的基本原理是客户端A打开文件时服务器给客户端A颁发一个凭证,只要客户端A持有这个凭证就可以认为没有与其他客户端发生冲突,读写操作中就不需要发起GETATTR请求了。当客户端B试图访问同一个文件时,这两个客户端就发生了冲突。服务器先暂时不响应客户端B的请求,而是向客户端A发送RECALL请求。客户端A接收到RECALL请求后将缓存中的数据刷新到服务器中,然后将凭证交还给服务器。这时服务器再响应客户端B的请求。以后两个客户端就按照NFSv2、NFSv3中的方法检查文件冲突。因此,这种机制适用于只读文件系统,或者客户端对数据修改不频繁的文件系统。

1.反向通道

如果一个客户端持有delegation,当文件访问发生冲突时,服务器需要向客户端发送RECALL请求,收回delegation,这是请求是在一个反向通道上进行的。也就是说:客户端和服务端之间有两个RPC通道,正常的NFS请求在正向通道中传输,与delegation相关的请求在反向通道中传输。在反向通道中,NFS服务器是反向通道的RPCK客户端,NFS客户端是反向通道的RPC服务器端,NFS客户端监听NFS服务器端发送过来的请求。正向通道是在客户端挂载NFS文件系统时创建的,反向通道在必要时才创建。什么叫"必要时"呢?简单说来,就是当客户端和服务器端需要建立状态时。具体来说,反向通道是在SETCLIENTID请求中创建。客户端发起SETCLIENTID时,会将反向通道的相关信息发送给服务器端。服务器检查是否可以创建反向通道,如果可以,将创建。后面的文章中会详细讲解SETCLIENTID请求的处理过程。

2.获取delegation

如果反向通道可用,那么当客户端打开文件时,服务器会给客户端分配一个delegation。只要客户端持有delegation,就可以认为本地文件和服务器端同步,文件没有发生冲突。所以,客户端可以直接向服务器发送数据而不用担心与其他客户端冲突。

3.冲突访问冲突

当另一个客户端Client2与Client1访问同一个文件,并且访问方式发生冲突时,服务器会检测到这种冲突情况。这时,服务器会暂时停止Client2的请求,转而向Client1发送CB_RECALL请求,Client1接收到这个请求后会通过DELEGRETURN请求将delegation返还给服务器。这时,服务器继续响应Client2的OPEN请求。这之后,如果Client1再向服务器发送数据,就必须小心检查文件是否冲突了。

4.反向通道故障

上一小节讲到:当Client2和Client1对文件访问发生冲突时,服务器会通过反向通道向Client1发送CB_RECALL请求回收delegation,回收delegation后再响应Client2的OPEN请求。这里还存在一个问题,假设服务器和Client1之间的反向通道发生故障了,Client1无法接收到服务器发送的请求,服务器是否要一直延迟Client2的OPEN请求?这是Client2来说不公平。因此服务器会设置一个过期时间。如果在规定的时间内Client1没有交回delegation,那么服务器会强制删除delegation,然后马上相应Client2的请求。假设后来Client1又向服务器发起了I/O请求,服务器必须检测到Client1中的delegation已经删除了,然后将这一信息通知Client1,这样Client1就不能使用delegation了。

delegation机制相关推荐

  1. iOS 消息的传递机制

    2019独角兽企业重金招聘Python工程师标准>>> 转载原地址:http://beyondvincent.com/blog/2013/12/14/124-communicatio ...

  2. 大数据Scala编程.问题集(02)

    大数据Scala编程.问题集(02) by 高焕堂 洞庭国际智能硬件检测基地 & 中云大数据中心(IDC) 首席架构师 微博:@高焕堂_台北 Q-02: Scala语言的trait具有什么设计 ...

  3. 软件构造学习笔记-实验3

    本次实验要求从五项要求(航班管理.高铁车次管理.操作系统进程管理.大学课表管理.学习日程管理)里完成三项要求,并且尽量实现复用. 面向可复用性和可维护性的设计:PlanningEntry 1.首先设计 ...

  4. iOS开发经验总结—内存管理

    From: http://ihuby.info/2011/07/18/ios%E5%BC%80%E5%8F%91%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93-%E5%86% ...

  5. 苹果官方指南:Cocoa框架(2)(非原创)

    原文链接:http://mobile.51cto.com/iphone-269848_1.htm Mac OS X包含多个Cocoa框架,苹果和第三方厂商也随时会发布更多的框架.无论Cocoa框架有多 ...

  6. 哈工大软件构造lab3

    2020年春季学期 计算机学院<软件构造>课程 Lab 3实验报告 1 实验目标概述 1 2 实验环境配置 1 3 实验过程 1 3.1 待开发的三个应用场景 1 3.2 面向可复用性和可 ...

  7. 存储大师班:NFS 的诞生与成长

    作者| QingStor 黄蒙 我们为什么需要 "网络文件协议" 存储文件是大家日常工作生活中最常见的需求,随着文件数量和占用存储空间的上升,以及在一定范围内共享访问文件的需求产生 ...

  8. (2019春)软件构造:雨课堂试卷(第6章)

    目录 6-1 可维护性 单选题 第1题 1分 多选题 第2题 2分 多选题 第3题 2分 单选题 第4题 2分 单选题 第5题 1分 单选题 第6题 1分 6-2 面向可维护性的设计模式 单选题 第1 ...

  9. (2019春)软件构造:雨课堂试卷(四)(第6章)

    文章目录 6-1 可维护性 单选题 第1题 1分 多选题 第2题 2分 多选题 第3题 2分 多选题 第4题 2分 单选题 第5题 1分 单选题 第6题 1分 6-2 面向可维护性的设计模式 单选题 ...

最新文章

  1. SAP Spartacus B2B 页面 Disable 按钮的显示原理
  2. spring boot之session store type is 'null'
  3. 【文末福利】图论算法:稳定婚姻问题,如何找到最适合自己的另一半
  4. deb 中标麒麟_「图」百度网盘Linux版放出deb包客户端:新增支持Ubuntu 18.04 LTS
  5. Linux内存带宽的一些测试笔记
  6. 给Xcode增加复制行、删除行快捷键的方法
  7. 极客技术专题【002期】:开发小技巧 - 如何使用jQuery来处理图片坏链?
  8. 欧瑞变频器800参数设置_常见品牌变频器修改功率方法大全
  9. DSP 6678的中断系统
  10. HMC5883L磁力计使用介绍
  11. 【CVPR 2021】Revisiting Knowledge Distillation: An Inheritance and Exploration Framework
  12. 浪潮华为,高端存储市场的双头之争
  13. 小猪短租网requests库使用
  14. CentOs 7源码安装 Python3
  15. ADB调试关闭荣耀手机的系统更新(烦人的推送)
  16. 比特彗星一直显示连接服务器,BitComet常见问题
  17. 《红面书生》的算法博客
  18. RAC 主机内存条故障导致的一个节点重启
  19. 桂花网创始人赵福勇:蓝牙物联网的领先者,让万物互联奔腾起来
  20. 类似YY 9158网页版多人语音视频聊天室远程教学系统源码

热门文章

  1. IM群聊头像九宫格实现方式
  2. 春联大全·七字联(1)
  3. vue 2.0使用tinymce-vue富文本
  4. lj245a引脚功能图_急,谁能提供给我74ls245的功能说明和引脚图,谢谢了
  5. Response to preflight request do‘nt access control check: Redirect is not allow for a preflight re.
  6. Hashtable、HashMap 与 HashTable区别、HashMap、Hashtable和TreeMap、 LinkedHashMap
  7. Android实现渐色变圆形
  8. 无线联网功能硬件模块无法拆除的计算机禁止,2021年保密知识竞赛抢答题库及答案(共120题).docx...
  9. Platform 概述
  10. ROS1云课→29如何借助导航实现走迷宫机器人