分布式文件系统概述(一)杨栋yangdonglee@2006-12摘要文件系统是操作系统用来组织磁盘文件的方法和数据结构。
传统的文件系统指各种UNIX平台的文件系统,包括UFS、FFS、EXT2、XFS等,这些文件系统都是单机文件系统,也称本地文件系统。
随着网络的兴起,为了解决资源共享问题,出现了分布式文件系统。
分布式文件系统是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。
本文1简要回顾了本地文件系统,然后按照发展例程大致介绍了2006年之前各时期主要的分布式文件系统,最后从设计目标、体系结构及关键技术等方面比较了各个分布式文件系统的异同。
目前很火的Hadoop文件系统、S3文件系统都是从NFS等早期文件系统一步步演化而来的,了解分布式文件系统的历史,有助于大家更加深刻地领会分布式文件系统的精髓。
1本文写于2006年底,借鉴了别人的大量资料,目的是为了与同学们分享分布式文件系统的发展史。
笔者在硕士期间跟随中科院计算所的孟老师、熊老师和唐荣锋进行分布式文件系统的研究和开发。
分布式文件系统源远流长,本文只是选择了其发展史上的部分实例进行简单描述,由于笔者水平十分有限,错误之处难免很多,各位同学发现问题之后麻烦回复邮件到yangdonglee@,我会尽全力完善,或者请各位同学自行修正。
笔者目前在百度进行云计算方面的研究和开发,希望有兴趣的同学一起进行探讨。
目录1.引言 (5)2.本地文件系统 (5)2.1FFS (6)2.2LFS (6)2.3Ext3 (7)3.分布式文件系统 (7)3.1 发展历程 (7)3.2分布式文件系统分类 (8)3.2.1 实现方法 (8)3.2.2研究状况 (8)3.3 NFS (9)3.3.1概述 (9)3.3.2 体系结构 (9)3.3.3 通信机制 (10)3.3.4进程 (10)3.3.5 命名 (10)3.3.6 同步机制 (11)3.3.7 缓存和复制 (11)3.3.8 容错性 (12)3.3.9 安全性 (13)3.4 AFS、DFS、Coda和InterMezzo (13)3.5 SpriteFS和Zebra (14)3.6xFS (16)3.6.1 概述 (16)3.6.2 体系结构 (16)3.6.3 通信 (16)3.6.4 进程 (17)3.6.5 命名 (18)3.6.6 缓存 (19)3.6.7 容错性 (19)3.6.8 安全性 (19)3.7Tiger Shark和Frangipani (20)3.7.1TigerShark (20)3.7.2Frangipani (21)3.8PVFS (21)3.8.1 概述 (21)3.8.2 存取机制 (21)3.8.3 管理机制 (23)3.8.4 存在问题 (25)3.8.5 PVFS2 (25)3.9DAFS (27)3.9.1 概述 (27)3.9.2 文件访问方式 (28)3.9.3 客户端实现 (28)3.10GFS、GPFS、Storage Tank和Lustre (29)3.10.1GFS (30)3.10.2GPFS (31)3.10.3Storage Tank (33)3.10.4Lustre (34)3.11Ceph (36)3.11.1 概述 (36)3.11.2 设计理念 (37)3.11.3 体系结构 (39)3.11.4 关键技术 (39)3.11.5 客户端操作 (41)3.11.6 容错性 (41)4.分布式文件系统之比较 (42)4.1设计目标 (42)4.2体系结构 (42)4.2.1 数据访问方式 (42)4.2.2 系统服务器的方式 (43)4.2.3 文件与系统服务器的映射 (44)4.3命名机制 (44)4.4同步机制 (45)4.5缓存一致性 (45)4.6可扩展性 (46)4.7容错性 (46)4.8安全性 (47)4.9关键技术 (47)5.总结 (48)参考文献 (50)1.引言最初的分布式文件系统应用发生在20世纪70年代,之后逐渐扩展到各个领域。
从早期的NFS到现在的Lustre,分布式文件系统在体系结构、系统规模、性能、可扩展性、可用性等方面经历了较大的变化。
文件系统是操作系统的一个重要组成部分,通过对操作系统所管理的存储空间的抽象,向用户提供统一的、对象化的访问接口,屏蔽对物理设备的直接操作和资源管理。
根据计算环境和所提供功能的不同,文件系统可划分为四个层次,从低到高依次是:单处理器单用户的本地文件系统,如DOS的文件系统;多处理器单用户的本地文件系统,如OS/2的文件系统;多处理器多用户的文件系统,如Unix的本地文件系统;多处理器多用户的分布式文件系统。
本地文件系统(Local File System)是指文件系统管理的物理存储资源直接连接在本地节点上,处理器通过系统总线可以直接访问。
分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。
高层次的文件系统都是以低层次的文件系统为基础,实现了更高级的功能。
随着层次的提高,文件系统在设计和实现方面的难度也会成倍提高。
但是,现在的分布式文件系统一般还是保持与最基本的本地文件系统几乎相同的访问接口和对象模型,这主要是为了向用户提供向后的兼容性,同时保持原来的简单对象模型和访问接口。
但这并不说明文件系统设计和实现的难度没有增加。
正是由于对用户透明地改变了结构,满足用户的需求,以掩盖分布式文件操作的复杂性,才大大增加了分布式文件系统的实现难度。
在计算机性能不断提升的同时,计算机部件的平均价格却在不断下降。
用户可以用更低的成本,购买更好、更快、更稳定的设备。
存储系统、文件系统面临的新挑战也随之而来:如何管理更多的设备,提供更好的性能,更加有效地降低管理成本等。
各种新的存储技术和分布式文件技术层出不穷,以满足用户日益增长的需求。
因此,有必要分析对比当前主流的分布式文件系统在体系结构、缓存一致性、可扩展性、安全等方面的长处和不足。
2.本地文件系统本地文件系统通常仅仅位于一个磁盘或一个磁盘分区上,它只能被唯一的主机访问,不能被多个主机共享。
本地文件系统通常含有四类信息:超级块:用来描述文件系统整体信息的,含有整个文件系统中数据块和inode的相关信息;inode:用来描述文件和目录的属性和文件块在块设备上的位置信息;文件内容:是用户的数据,是无结构的;目录内容:是目录项,是有结构的。
超级块通常位于磁盘(或分区)上的固定位置。
根据文件系统类型,可定位超级块;通过超级块可定位根目录的inode,从而可读出根目录的内容。
通过在文件系统名字空间的逐级名字解析,可得到指定文件的ino。
根据ino可定位文件的inode在磁盘上的位置,从而读出文件的inode。
根据inode中的块映射信息,最后定位指定的文件块,从而读出或写入数据。
归结起来,单机文件系统所含的信息可以分为三类,它们是文件数据、文件系统元数据和存储元数据。
早期的UNIX文件系统运行在PDP-11上,拥有简单规范的文件系统特性。
文件系统的输入/输出由内核缓存;数据传输和同步操作没有对齐限制。
所有到磁盘的传输以512字节块为单位,能够置于文件系统数据区域的任何位置。
Inode区与内容存储区相分离,导致查找速度慢(磁臂在inode区与块存储区之间往复移动,尤其长路径名)。
当在VAX-11上和其他UNIX增进一起使用的时候,最初的512字节UNIX文件系统不能提供许多应用所需的数据输出率,这要求文件系统提供比早期512字节UNIX系统更高的带宽。
UNIX快速文件系统(FFS)是传统UNIX文件系统的一种重新实现,通过更加复杂的分配策略,充分提高了输出率,效率提高了一个数量级。
FFS将磁盘卷划分为若干个柱面组(cylinder group),每个柱面组占若干连续的柱面,作为相对独立的文件卷管理;采用较大的磁盘块以减少I/O间址并提高I/O效率;FFS打破了文件名长度最多为14字节的限制,文件名长度可达255字节;也支持符号连接(symbolic link),这种连接可以跨文件卷或主机。
2.2 L FS由于磁盘寻道时间的限制,许多文件系统存在着瓶颈。
Berkely设计了一种全新的文件系统,即日志结构的文件系统(log-structured file system),试图解决这个问题。
促成LFS设计的想法是:CPU越来越快,RAM内存越来越大,磁盘高速缓存的容量迅速增加。
因此,无需访问磁盘,从文件系统的高速缓存中就可能满足所有读请求。
将来大多数磁盘访问是写操作。
某些文件系统使用的预读机制,即把数据块在实际需要前调入内存,对文件系统性能的改进不再那么重要了。
LFS的设计人员决定重新设计UNIX的文件系统,他们希望即使在有大量小块随机写的情况下,也能获得磁盘的全部带宽。
基本思想是把整个磁盘作为日志。
所有写操作都存放在内存的缓冲区中,并定期地收集到一个单独的段中,作为日志尾部的相邻段写回磁盘。
因此,每个段都含有inode、目录块、数据块等,并且是他们的混合体。
在每段起始位置还有一个摘要,给出了该段中的内容。
如果段的平均长度大约为1MB,那么几乎所有的磁盘带宽都能利用。
在这一设计中,inode依然存在,并且和UNIX中的inode具有相同结构。
但是这些inode 并不放在磁盘的固定位置,而是分散在日志之中。
一旦找到inode,可以用通常的方法找到相应块。
为了查找inode,需要维护一张inode映照表,它以inode号为下标,其中第i项指向磁盘上第i个inode。
这张映照表存放在磁盘中,但它同样使用缓存机构,所以在大多时候,最常用的部分将保存在内存中。
LFS的工作方式为:所有写的数据开始时都存放在缓冲区中,并且定期地把这些缓冲区中的数据以一个段的形式写到磁盘中,放在日志的尾部。
打开一个文件首先要在inode映照表中查找该文件的inode,一旦找到了inode,也就知道了相应块的地址,所有的块也存放在段中,即日志的某个地方。
真正的磁盘都有有限的容量,最终日志将占满整个磁盘,这时新段不能被写到日志中。
许多现有段都包含一些不再使用的块。
LFS中有一个清理(cleaner)线程循环地浏览和压缩磁盘。
Ext3 文件系统是直接从Ext2文件系统发展而来,它也秉承了FFS与LFS的主要特点。
目前Ext3文件系统已经非常稳定可靠,它完全兼容Ext2文件系统,用户可以平滑地过渡到一个日志功能健全的文件系统。
Ext3日志文件系统的思想就是对文件系统进行的任何高级修改都分两步进行。
首先,把待写块的一个副本存放在日志中;其次,当发往日志的 I/O 数据传送完成时(即数据提交到日志),块就写入文件系统。