分布式文件系统的特点
- 分布式文件系统的顾客、服务员和存储设备分散在各机器上,因此服务活动必须跨越网络完成;
- 存储设备不是单一的集中的数据存储器,而是有多个独立的存储设备;
- 分布式文件系统的具体配置和实现可以有很大不同,有的服务员运行在专用的机器上,有的机器既是服务员又是顾客。
总之,分布式文件系统的特点是系统中的顾客和服务员具有自治性和多重性。
基本要求
- 透明性:对于顾客来说,分布式文件系统应表现为常规的集中式的文件系统,即服务员和存储器的多重性和分散性对顾客应该是透明的。透明性的另一个方面是用户的可移动性,即用户可以在系统中的任何机器上登录。
- 性能:分布式文件系统的性能和常规文件系统的性能差不多。
- 容错:在发生各种故障时分布式文件系统应该能正常工作,尽管其性能可能有所降低。
- 可扩充性:系统适应增加服务负载的能力叫做可扩充能力。
十个期望属性:透明性、用户灵活性、高性能、简单易用性、可扩充性、高可用性、高可靠性、数据完整性、安全性和异构性。
命名
命名方案
分布式文件系统中名字透明和位置透明:
- 数据和位置分离为文件提供一个较好的抽象。
- 名字透明给用户共享数据提供了一个方便的方法。
- 位置透明把命名结构从存储器结构和服务员间的结构分开。
分布式文件系统的三种命名方法:
- 把主机名和文件的本地名字结合起来给文件命名。这是一种最简单的命名方法,它能保证唯一的系统范围内的名字。
- 把远程文件目录附加到本地名字空间中。SUN工作站的NFS是这种方法的典型代表,它使用安装(mount)机制把远程文件目录附加到本地名字空间中。
- 把所有各部分文件系统全部集成组成单一的全局名字空间结构。同一名字空间可被所有顾客见到。理想上,合成的文件系统结构应和常规文件系统是同型的。
组织名字服务员的方法有三种:
- 使用集中式的名字服务员。集中的名字服务员维护一张表或者数据库,提供必要的名字到对象的映射关系。
- 将文件系统分割成域,每个域有自己的名字服务员。构建一个全局名字树,当本地名字服务员查找一个名字a/b/c时,它可以生成一个指向另一个域(即另一个名字服务员)的指针,把名字剩余部分(b/c)发送给它。
- 每个处理器管理自己的名字。查找名字时,首先广播到网络中。在每个处理机上,到来的请求被转发给本地名字服务员,只有当名字服务员找到相应的匹配纪录时才做出回答。
实现技术
- 路径名翻译。正文名字到底层标识符的变换典型地都使用常规UNIX中的方法,即递归查找(recursive lookup)程序。
- 有结构的标识符。实现透明的命名需要提供文件名到其位置的变换机制。
- 提示(hint)。这是用于位置变换的另一个方法。一个提示是一份信息,能提高性能,如果它不正确也不会引起任何语义上的副作用。
- 安装机制。为了创建一个全局名字结构而把远程文件系统连接起来,通常使用安装机制。
共享语义
共享语义是评价分布式文件系统允许多个顾客共享文件的重要标准。它说明分布式文件系统的这样一个特性,即多个顾客同时访问共享文件的效果。特别是,这些语义应当说明被顾客修改的数据何时可以被远程顾客看到。
- UNIX语义。在UNIX语义中,对分布式文件系统中的文件进行每个read(读)时能看到以前所有对该文件执行write(写)的效果。特别是,顾客对打开的文件进行的写可立即被其他同时打开此文件的顾客看到,即使该顾客在远程也能够看到。
- 对话语义。对话语义符合以下两个规则:第一,对于打开文件的write可立即被本地顾客看见,远程的顾客虽然也同时打开该文件,但却看不见。第二,一旦文件关闭,对此文件所作的修改仅在以后开始的对话中才能看见,该文件已经打开的各副本不表现这些修改。
- 事务处理语义。具有事务处理的文件对话产生下述熟悉的语义:几个文件对话对一个文件的作用及其输出等效于以某个串行次序执行这些对话的作用及其输出。
- 不可改变的共享文件的语义。在这种语义中,一旦文件被其创建者说明为共享的,它就不能再被修改。不可改变的文件有两个重要性质:第一其名字不可再用;第二其内容不可改变。
缓存
远程访问方法
- 远程服务。在远程服务方法中,顾客把访问请求传送给服务员,服务员执行访问,结果回送给顾客。访问请求被变换成对服务员的报文,服务员的回答也打包成报文回送给顾客。
- 缓存。如果请求的数据不在本地,则从服务员处取来那些数据的复制件给顾客。通常取来的数据量比实际请求的要多得多,例如整个文件或几个页面,所以随后的访问可在顾客所在地的本地副本中进行。
缓存设计
- 缓存的粒度:缓存单位愈大,则下次访问的数据在顾客方的本地找到的可能性愈大,即命中率愈高,但传送数据的时间和一致性问题也增加了。大缓存单位的一个优点是减少网络开销。
- 缓存的地点:使用磁盘缓存具有可靠性的优点。但是使用主存作缓存器也有若干优点。首先,它可支持无盘工作站;其次,从主存缓存器中访问数据要比从磁盘缓冲器中访问数据要快;第三,服务员缓存器(用于加速磁盘输入输出操作)是设在主存中,如果顾客缓存器也使用主存,就可以构造一个单一的缓存机构,服务员和顾客均可使用。两种缓存地点强调的功能不一样,主存缓存器主要减少访问时间,磁盘缓存器主要提高可靠性和单个机器的自治性。
延迟写策略
- 驱逐时写:当被修改过的数据块要被从缓存器中驱逐出去时,该数据块被发送到原本;
- 周期性写:周期地扫描缓存器,把从上次扫描以来已被修改过的块发送给原本;
- 关闭时写:当文件关闭时把数据写回到服务员。在文件打开很短时间或很少修改的情况下,这种方法不会很大地减少网络通信
关闭时写适合对话语义; 立即写方法比较适合UNIX语义
判定缓存的有效性和一致性
- 顾客发动的方法。顾客与服务员联系,检查本地数据与原本是否一致。这个方法的关键是有效性检验的频度。
- 服务员发动的方法。服务员为每个顾客登记被该顾客缓存的文件或文件的某个部分。当服务员检测出可能不一致时,必须做出反应。服务员发动方法的一个问题是违背顾客/服务员模型。
远程访问与共享语义的关系
- 对话语义和缓存整个文件非常匹配。对话其内的读和写访问可以完全由被缓存的副本提供,因为可以把此文件按照语义和几个不同的映像联系起来。这个模型是很吸引人的,因为它实现简单。
- 使用缓存对UNIX语义进行分布式实现有很严重的负面影响,它使得UNIX语义的分布式实现变得很困难。所有请求都由一个服务员指引服务的远程服务方法和UNIX语义符合得很好。
- 不可改变的共享文件语义是为了缓存整个文件而创建的,使用这种语义,缓存一致性问题完全消失。
- 当由同一机器上的同一服务员为所有的对同一文件的请求服务(如在远程服务中那样)时,事务处理语义可通过加锁的方法直截了当地实现。
选择缓存还是远程服务?
选择缓存还是远程服务的问题本质上是选择改进性能的潜力还是选择简单性的问题。
- 使用缓存时,大量的远程访问可由本地的缓存器有效地处理,大多数远程访问获得的服务速度和本地的一样快。
- 使用缓存时,服务员负载和网络通信量都减少了,扩充能力加强了。而在使用远程服务方法时,每次远程访问都是跨过网络处理的,明显增加了网络通信量和服务员负载,引起性能下降。
- 使用缓存时,传输大批数据的全部网络开销低于远程服务时传输一系列对具体请求的短的回答的网络开销。
- 缓存方案的主要缺点是一致性问题。在不经常写的访问模式中,缓存方法是优越的;但在有经常写的情况下,用于解决一致性问题的机制在性能、网络通信量和服务员负载方面产生重大开销。
- 在用缓存作为远程访问方法的系统中,仿真集中式系统的共享语义是很困难的。使用远程服务时,服务员将所有访问串行化,因此能够实现任何集中的共享语义。
- 远程服务风范仅仅是本地文件系统接口在网络上的扩充。这样,机间接口是本地顾客和文件系统之间的接口的映射。
容错和可扩充性
无状态服务和有状态服务
服务员为顾客请求服务时保存顾客有关信息为有状态
有状态服务员需要恢复协议
无状态服务的约束:使用坚定的无状态服务的代价是需要较长的请求报文,并使得处理请求的速度较慢,此外,无状态服务在设计分布式文件系统时要加上一些约束。
- 因为每个请求要能识别目标文件,所以需要一个唯一的、全系统范围的、低层的命名。对每个请求,将远程名翻译成本地名更使处理该请求的速度降低;
- 由于顾客会重发对文件操作的请求,所以这些操作必须是幂等的(idempotent),一个幂等操作即使连续执行了多次,其效果仍相同。
需要有状态服务的场合:
- 如果使用远程网和网际网,收到报文的次序可能与其发送的次序不同,此时有状态的面向虚拟电路的服务更为可取,因为使用所维持的状态可以把报文正确地排序。
- 如果服务员使用服务员发动的方法进行缓存一致性检验,则不能提供无状态服务,因为它维持一个哪些文件被哪些顾客缓存的纪录。
可用性与文件复制
- 可恢复性:当对某个文件的操作失败,或由顾客夭折此操作时,如果文件能转换到原来的一致状态,则说此文件是可恢复的。
- 坚定性:如果当某个存储器崩溃和存储介质损坏时某个文件能保证完好,则说此文件是坚定的。
- 可用性:如果无论何时一旦需要就可访问,甚至在某个机器和存储器崩溃,或者在发生通信失效的情况下,某个文件仍然可被访问,则这种文件叫做是可用的。
文件复制是一个冗余措施。这里指的是不同机器上的文件复制,而不是同一机器上不同介质上的文件复制(如镜像磁盘)。复制文件可以增强其可用性。多机复制也能改进性能,因为可以选择最近的复制件给访问请求提供服务,从而获得短的服务时间
复制方案的要求
- 同一文件的不同复制件应该位于不同的机器上,这些机器中某一台发生故障不影响其他机器。
- 应对用户隐匿复制细节,把一份复制件名字变换成指定的复制件是命名方案的任务。
- 文件的所有复制品代表同一逻辑实体,所以对任何复制件的更新必须反映到所有其他复制件。
- 不能放弃文件数据的一致性,因此使用复制来增加可用性时还要使用复杂的更新传播协议。
可扩充性
设计大规模系统考虑的问题
- 有界资源(bounded resources)原理:“从系统的任何部分来的服务要求应该限于一个常数,此常数和系统中的节点数无关”。负载和系统规模成比例的任何服务员,一旦系统扩充到超过某一范围则必然阻塞,再增加资源也缓解不了这个问题,此服务员的能力限制了系统的扩充。
- 广播是一种使网络中的每个机器都参加的活动。在广播基础上建立的机构对超大型系统很明显不实际。
- 网络拥挤和延迟是大规模系统的主要障碍。一个办法是使用缓存、提示和实施放松的共享语义等措施,使跨越机器的交互作用最少。
- 不应当使用集中控制方案和集中的资源建立可扩充的和容错的系统。
- 分散化的一个重要方面是系统的管理。分配管理职责时,应有利于自治性和对称性,不干扰分布式系统的连贯性和一致性。
- 将系统划分为若干半自治的小组。每个小组包括一些机器和一个专用的小组服务员。为了尽量减少跨越小组的文件访问,大多数时间,每个机器的请求应由其小组服务员满足。
用多线程实现文件服务员
- 单个进程服务员当然不好,因为一旦有一个请求需要磁盘输入输出时,整个服务将被推迟到输入输出完成为止。
- 每个顾客分配一个服务进程,但是这样要求CPU完成进程切换付出很大代价。
- 使用线程服务员,同一个进程里的多个线程之间只有很少的非共享状态。线程的切换和线程的创建比起进程的切换和进程的创建要便宜得多。这样阻塞一个线程并切换到另一个线程是解决一个服务员为多个请求服务问题的一个合理方法。
- 使用线程方案实现服务的优点有二:一是一个输入输出请求仅推迟一个线程而不是整个服务;二是容易实现诸线程共享数据结构。
安全性
保护和加密对于在分布式系统中实施安全性是不可缺少的部分,它的主要作用是防止未经授权的数据发布和数据修改。这一机制的关键是协议的握手类型,每一方都要证明自己的身份。当前,多数系统使用下列两种不同的方法之一: 一个认证服务器,它物理上安全地维护一个用户口令列表。 如 网络文件系统(NFS)那样,使用的公共密钥机制,维护一个以用户口令加密后的确认密钥的公共可读数据库。