Distributed File System 分布式文件系统

来源:互联网 发布:知乎汗毛怎样去除 编辑:程序博客网 时间:2024/05/16 19:07

转载请注明出处:

http://blog.csdn.net/c602273091/article/details/78598699

Storage System快要期末考了,要准备复习一下,这门课Prof Greig讲得很迷,需要好好整理一下。

分布式文件系统大概:

  • 基本的客户端/服务器模型
  • 客户端服务器模型的运用分配
  • 服务器设计中需要考虑的问题

基本的客户端/服务器模型

文件系统的顶层功能包括:《name,offset》与《partition,sector》之间的转换(地址空间管理,FTL这一类的东西);文件缓存和永久保存;对于某些关键数据结构进行的一致性原则;访问权限控制等等。

文件系统和存储介质之间的关系:存储介质是文件系统的附属;文件系统应该尽可能少的和存储介质有关系,尽可能抽象出接口,类似于VFS。

分布式文件系统便于:

  • 共享数据:在用户和计算机之间进行数据共享,多个计算机可以进行数据共享;远距离访问,存储空间及客服端进行了分离,支持远距离操作。
  • 监督:方便在用户之间重新分配存储空间。
  • 管理:当集中的时候更容易备份,可靠性提升;灾难恢复(运用到mirror数据)

设计的想法:
当客户端做更多的时候,性能提升,方便管理,服务器不用维护太多客户端的状态;当服务器做更多的时候系统更简单;系统做更多的时候,安全性提高,操作语义更加简单,共享数据更加方便等等。

最简单的模型:服务器做一切东西。客户端的所有操作全部都在服务器上进行,缓存,文件操作读写;访问控制,文件状态等等一切由服务器维护。客服端请求的时候,会把请求打包发送,注明比如是哪个客户端,哪个文件,指针等等。这里对于RPC没有说传输过程中的文件表示格式。

使用vnode layer可以在同时运行文件系统,所有在kernel里面的文件系统通过vfs进行。通过mount可以挂载一个文件系统到路径名上,unmount就会去掉一个文件系统。在分布式文件系统中,客户端会把服务器的文件系统挂载上,然后访问服务器就像访问本地文件一样轻松。当然每次访问在服务器端会运行UID,NIS,LDAP等等程序进行权限访问查询等等。

每次客户端需要知道某个目录底下的文件就需要调用一次RPC,让服务器发回该目录底下的所有目录名。这个问题NFS4。2正在解决的过程中。

常见的分布式文件系统模型

服务器搞定一切:所有的负载全部在服务器,安全性,简洁性很高,但是服务器负载太大,而且服务器要维护所有客户端的状态。

Sprite(客户端缓存,服务器控制)为了提高性能,可以增加一个客户端的缓存,这样可以减少RPC的调用过程,减少服务器的负载,但是缓存一致性问题,比如客户端数据更新了,服务器没有更新,别的客户端访问到服务器的数据是过期的。客户端告知服务器何时更新数据;服务器给予客户端缓存权限;客户端通知服务器如果客户端文件关闭。

NFSv3(stateless caching:无状态缓存)客户端可以在写后30d内把数据更新回服务器;或者等别的客户端close以后进行操作。

AFSorig:缓存和回调。当服务器中的文件被修改时,会告知有备份这份文件的客户端。客户端的缓存改变后,把整个数据写会服务器。

文件系统一定需要保存客服端的状态么?所以根据这个分成了无状态和有状态的服务器。无状态的运行更快,资源消耗小,简单,而且崩溃恢复的时候不需要记得客户端与服务器之间的状态做恢复。有状态的可能会更快,能提供更好的语义操作。

在无状态的服务器里面,如何像之前使用file handle进行文件的操作,这个时候文件系统会传回一个handle structure给客户端,客户端通过这个与文件进行操作。为了使得数据一致性保存,给的结构体里面有一个inode number用来表示这个handle是否有操作权限。

运行模型:
基于进程(Samba);基于线程(NFS Server);基于事件(node.js)这三种从左到右依次减少资源的使用。

multi-server Storage

刚才只是一个服务器的分布式文件系统,那么现在把服务器增加。为什么增加呢?为了负载均衡,以及coordinate updates?这是啥?

一般来说是两种情况:做同样的事情,只是处理的数据不同;做不一样的事情,处理相同的数据。

一般要考虑负载均衡;避免瓶颈;避免服务器之间通信频繁;避免让用户使用过于复杂。

情况一:同样的功能,不同的数据。目前最普遍的情况。那么一个客户端如何找到那个服务器是正在服务它的呢?不同的文件系统就会有不同的答案。负载均衡(进行文件striping或者是pseudo-random distribution来提高带宽,减少bottleneck)

在NFS中,服务器都是独立服务的,一个客服端会根据mount point去找对应的server,每个server都有自己的namespace。如何做到负载均衡:赋予文件一个sub-tree~ 那么访问不同的文件,就会去不同的server。

在AFS中,首先客户端与global AFS directory进行通信,然后这个服务器就会根据volumn id找到最近管理该文件的服务器。

在HTTP请求中,通过DNS转换为ip地址,然后再进行负载均衡,分配请求到不同的服务器。

情况二:不同的函数,一样的数据。

具体可以参考: Design and Implementation of 4.4 BSD (Chapter 9: Network File system)