Network File System
Network File System
接着上一篇博客Distributed Systems 分布式系统来扯淡,之前的博客一再在写文件系统,这次继续,只不过是分布式文件系统。
1. 这篇文章讲什么
这篇文章介绍一种分布式文件系统,名字叫Network File Sytem(NFS),翻译过来就是网络文件系统。NFS是一种分布式文件系统,大概的样子是这样的:
这里多说一句,NFS可不是仅仅指图中那个server,它包含了图中的所有部件 ,client中也有NFS的组件。
在细一点看client与server之间的数据通信,是这样子的:
现在大概知道NFS的基本架构了吧。下面开始具体介绍了。
2. NFS的设计目标
每一种文件系统的设计都有它自己的考虑,NFS的主要考虑是简单而快速的故障恢复。这可能考虑到分布式系统因为机器多,故而故障是经常发生的。况且,这里面只有一个server,而server是系统的核心,这个server一旦出问题怎么办。
3. 核心设计思路
有了基本的设计,那就到了具体的设计环节了,如何达到目的呢?快速恢复要求“隔离”,也就是说系统各个部件之间尽量减少“共享信息”,因为有了共享信息,恢复起来也就复杂了。
Client和Server之间的发生的操作主要是读写,因为读写一般都不是一次性完成的,需要多次操作,那么有两种方式,一种是双方之间保存读取状态,也就是说server保存了每个client的读取状态记录,比如说读到文件的哪个位置了,这种方式称之为stateful;还有一种是 stateless,也就是说server跟client之间没有什么共享信息,server压根就不知道client读取到了文件的什么位置,每次client读取数据,都是自己提供完整的参数,server按照提供的参数进行操作、返回结果就好了。
那么基于设计目标来看的话,第一种方式不是一个好的选择,很大的一个缺点就是client或者server宕机了的话怎么处理,是不是还得同步一下状态,client的话还好说,server恢复过程中还额外需要恢复跟各个client之间的共享状态,简直复杂啊!!所以NFS选择第二种方式,用户操作指令提供server完成操作所需的所有信息,简单直白效率高。
事实上这是NFS的核心设计思路。
3. 具体系统设计
命名空间
文件按照层次结构存储,文件夹,文件。那么首先一个问题就是系统怎么唯一标示一个文件(文件夹也是一种“文件”),一般而言文件的inode是唯一的,故而可用它来唯一标示。NFS也是这么做的,但是又补充了两个参量,首先一个是卷标示符(volume identifier),还有一个版本号(generation number)。卷标示符主要是考虑到扩展,因为NFS可以支持多个文件系统(server端的数据存储使用文件系统具体存储文件,可以包含多种文件系统,为了便与区别,称之为子文件系统);版本号就容易理解了,为了确定文件是否是最新版本。
卷标示符、inode number以及版本号共同组成了文件的唯一标识,称之为File handle。怎么寻找文件的File handle呢
举个例子,我们需要操作文件/foo.txt,那么首先需要找到这个文件的FIle handle。根目录的FIle handle在子文件系统介入NFS中的时候就已经或者,可以认为是已知。client向server发送根目录'/'的file handle以及文件名foo.txt查询foo.txt的File handle,server查找并返回。如此便获得了文件的File handle了。可以想象,每多增加一级目录就需要多一次查询。NFS的操作命令
下面的是NFS的一些样例操作命令:
可以看到常见的文件读、写、创建、删除以及文件夹的创建、删除;LOOKUP用来执行前面提到的查询文件File Handle操作,GETATTR用来获得文件的属性(包括当前版本号啊,啥的)。下面看看具体操作样例:
注意到,具体实现的时候,client在本地存储了一个映射关系,文件(File descriptor)和其对应的File handle以及当前操作到的文件位置(Current file location)。
这个很好懂。接着来看NFS怎么处理异常情况,操作失败。操作失败
遇到操作失败怎么处理,这里的失败指的是异常,比如因为server宕机导致的client操作没有返回。
NFS由于采用stateless的设计,所以它只能对失败的操纵“ 再试一次”,也就是说操作失败的处理方式是再试一次。判断一个操作是否失败也很简单,只要固定时间内操作没有返回就算失败,简单吧。
但是另一个问题来了,是不是所有的操作“再试一次”仍然确保返回结果正确。一般将多次执行且返回结果依然正确的操作称之为 “幂等操作”(idempotent)。首先,读以及查询操作是幂等操作;其次,写操作也是,同样的数据在同一个位置多次写,依然是可以的。所以NFS的大多数操作是幂等的。但是,文件/文件夹的创建操作可不是哦,client向server发送创建文件夹操作,server完成操作,但是因为某种原因client没有收到反馈,于是 再试一次,这时候server那边就出问题了,“文件夹存在啊”。哈哈,需要额外处理吧。client cache 为了加速操作,NFS设计了Cache。client端的cache可以用作两方面,首先是缓存已经读取的数据,其次是将写操作也缓存一下。缓存已经读取的数据可以理解,那么缓存写操作干嘛?目的就是想将一些操作合并、调度,比如说前后两个写操作作用于同一个文件的同一个位置,那么前一个写操作就可以不用执行了。
这里面有个缓存一致性(cache consistency)的问题,比如说缓存已读文件,若缓存后其他的client已经修改了这个文件,那么缓存的数据就是过时的数据,这时候再直接使用这个数据就会出错啊!!
client端的缓存一致性问题的本质不就是别人改了文件而我不知道么,那么解决起来也不费劲啊,只要读取缓存文件判断文件是否过时即可。分两步:- flush-on-close,也就是说当一个client写文件完成、将文件关闭之后,立刻将修改后的文件发送到server。这样一来server就可以保持server端文件是最新的;
- client使用缓存数据前,先向server查询文件的当前状态(还记得前面提到的GETATTR操作么),然后确认缓存的数据是否过时,以便决定要不要使用这个缓存数据。
但是,这么一来也有问题,每次client打开文件都需要向server确认,这样无疑加重了server的负担,所以处于性能考虑,NFS设置一个时间区间,比如说3秒,3秒内认为缓存的数据是绝对最新的,之后就需要向server确认,一旦确认,这个“保质期”也是3秒。如此一来就减轻了server的负担了。
那么问题来了,要是在这3秒内文件被修改了怎么办?答案是,不管!!!毕竟这种情况很少。server cache server端的cache跟client端cache的作用基本一样,但是也会有缓存一致性问题!!
因为server修改文件为了效率考虑也会使用cache的数据,那么在cahche中修改文件之后就像client返回操作成功,如果此时server宕机了,这个文件的更新就丢失了啊!!最要命的是client还以为已经写文件成功了,它也就不会再试一次了。
于是,对于写操作,server会先将在cache中的修改保存到磁盘之后再想client返回操作成功,如此便可以了。但是感觉很诡异啊!!!!因为每次写都需要设计磁盘操作,所以很容易成为整个系统的瓶颈!!故而有人建议使用battery-backed memory,也就是说宕机后缓存数据不丢失。
写了这么多,大概是吧NFS介绍完了,注意的是这个只是NFS的框架介绍,跟具体的实现可能有点区别,况且NFS不断更新。
4. 参考文献
❝
- http://pages.cs.wisc.edu/~remzi/OSTEP/dist-nfs.pdf
❞
Network File System的更多相关文章
- Design and Implementation of the Sun Network File System
Introduction The network file system(NFS) is a client/service application that provides shared file ...
- NFS(Network File System)服务配置和使用
Sun公司开发NFS (Network File System)之初就是为了在不同linux/Unix系统之间共享文件或者文件夹.可以在本地通过网络挂载远程主机的共享文件,和远程主机交互.NFS共享存 ...
- NFS - Network File System网络文件系统
NFS(Network File System/网络文件系统): 设置Linux系统之间的文件共享(Linux与Windows中间文件共享采用SAMBA服务): NFS只是一种文件系统,本身没有传输功 ...
- Centos7——NFS(Network File System)服务
NFS(Network File System)即网络文件系统,允许计算机之间通过网络共享资源:在NFS客户端即可NFS服务端所共享的目录挂载到本地,此时即可像读写本地目录一样读写远程计算机的目录与文 ...
- CentOS7.5搭建NFS(Network File System)
NFS(Network File System)即网络文件系统,是由Sun公司开发的一种通过网络方式共享文件系统的通用共享解决方案.可以将远程Linux系统上的文件共享资源挂载到本地主机(Linux客 ...
- 【Azure 存储服务】如何把开启NFS 3.0协议的Azure Blob挂载在Linux VM中呢?(NFS: Network File System 网络文件系统)
问题描述 如何把开启NFS协议的Azure Blob挂载到Linux虚拟机中呢? [答案]:可以使用 NFS 3.0 协议从基于 Linux 的 Azure 虚拟机 (VM) 或在本地运行的 Linu ...
- NFS(Network File System)即网络文件系统 (转)
第1章 NFS介绍 1.1 NFS服务内容的概述 □ RPC服务知识概念介绍说明,以及RPC服务存在价值(必须理解掌握) □ NFS服务工作原理讲解(必须理解掌握) □ NFS共享文件系统使用原理讲解 ...
- nfs 是Network File System 网络文件系统
NFS的基本原刚是容许不同的客户端及服务通过一组PRC分享相同的文件系统,它是独立于操作系统,容许不同硬件及操作系统的系统共同进行文件的分享.NFS在文件传送过程中依赖于RPC协议.远程过程调用Rem ...
- CentOS7 配置NFS(Network File System)及其使用
1. 服务端配置 1.1. 安装NFS yum -y install nfs* 1.2. 查看是否安装了NFS与RPCBIND rpm -qa | grep nfs rpm - ...
随机推荐
- Alpha冲刺——第五天
Alpha第五天 听说 031502543 周龙荣(队长) 031502615 李家鹏 031502632 伍晨薇 031502637 张柽 031502639 郑秦 1.前言 任务分配是VV.ZQ. ...
- 【技术向】rainmeter的设计与发现
我们在大学期间所学的那点代码知识还远远不够,于是我就自己寻找到了一款简单易懂的软件,来丰富我的代码知识. 这款软件叫rainmeter,中文叫做雨滴,是一款可以修改桌面的软件.它可以将桌面上更改出硬盘 ...
- Week2-作业1 -阅读《构建之法》
第一章 在阅读第1.2.2节时,感受最深,记得开学初有老师就给我们分析过计算机专业和我们专业的区别,当时是给我们讲的是计算机科学注重的是理论,偏向于硬件方面,而软件工程则注重实践,偏向于软件方面.然很 ...
- Scrum Meeting Beta - 4
Scrum Meeting Beta - 4 NewTeam 2017/12/2 地点:新主楼F座二楼 任务反馈 团队成员 完成任务 计划任务 安万贺 完成了部分页面标题栏颜色的修改和字体的调整Iss ...
- Alpha阶段敏捷冲刺 DAY5
一.举行站立式例会 1.今天我们利用晚上的时间开展了站立会议,总结了一下之前工作的问题,并且制定了明天的计划. 2.站立式会议照片 二.团队报告 1.昨日已完成的工作 (1)改进了程序算法 (2)优化 ...
- Splash广告界面
在软件开始启动时都是会使用一个splashActivity实现联网判断和相关资源的加载,在一款网络软件上开始时的缓存加载和网络判断可以为用户节省不必要的流量开销. 使用handler延时启动下一个ac ...
- Java 中 Vector、ArrayList、List 使用深入剖析
线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中.本文试图通过简单的描述,向读者阐述各个类的作用以 ...
- LeetCode 696. Count Binary Substrings
Give a string s, count the number of non-empty (contiguous) substrings that have the same number of ...
- [BZOJ3195][Jxoi2012]奇怪的道路
3195: [Jxoi2012]奇怪的道路 Time Limit: 10 Sec Memory Limit: 128 MB Description 小宇从历史书上了解到一个古老的文明.这个文明在各个 ...
- 【WebAPI】新手入门WebAPI
一.前言 工作也有一年多了,从进入公司就一直进行BIM(建筑信息模型)C/S产品的研发,平时写的最多的就是Dev WPF.一个偶然的时机,产品需要做支付宝扫码与微信扫码,所以需要了解产品服 ...