第一章 海量网络存储系统概述 下载本文

以维持在一个较低的水平,具有更高的性能/价格比。另一个显著的特点是,他们的应用往往建立应用级的存储集群,也就是这种集群结构是基于特定的应用,而不是构建通用分布式文件系统,例如构建上百个结点的邮件集群,或者如Google一样,建立面向搜索服务的应用集群系统。而且在这些系统之中,单部件的失效率远远大于高性能计算领域的集群系统,但通过廉价部件的冗余技术提高系统的可用性。

1.4 存取路径和接口

存取接口对于存储系统具有重要的意义,它能够在操作语义上面抽象和规范出存储系统的行为,一方面把不同存储设备系统通过统一的接口集成起来,为存储虚拟化提供条件;另一方面能够让应用程序对于存储设备的访问是透明的,不必了解设备的特殊性。

而存取路径是数据和命令在存储设备和系统内的物理和逻辑移动路线,它展示了存储系统内各个部件相互协调工作的实际过程,也是对于存储系统设计与分析必不可少的方法。

1.4.1 存取接口

1. 块级接口

对于存储空间的组织,线性编址是最基础、最方便的组织方式,线性空间中的每一个数字对应一个唯一的存储单元地址,那么对于地址的寻址操作对应于线性空间中的数值操作。如果每个存储单元都是一个字节,那么最大的存储空间就是地址空间大小;而如果每个存储单元都具有相同的数据块,那么最大的存储空间就是存储空间大小和块大小的乘积。当请求要求特定存储单元中的数据时,只需知道该存储单元的地址就可以唯一定位该存储单元,从而可以方便的存取相应存储单元中的数据。

现代计算机中内存空间一般都是按照字节编址,目前物理内存一般为几个GB到几十个GB,其需要的地址通过5个字节就可以表示了。事实上处理器位长和字节的乘积就是理论上处理器直接寻址空间的最大尺度,如果考虑到指令中不仅包括地址内容,还要包括指令编码,实际的直接寻址空间将远远小于上述最大寻址范围。因此指令的直接寻址范围显然受到CPU字长的限制。

外部存储系统有比内存地址更大的存储空间,远远超过处理器指令直接寻址的范围。必须使用间接寻址扩充处理器寻址的空间。例如使用数据块的概念实现二级间接寻址,对于由数据块为单位组成的存储空间,数据的地址由块地址和块内偏移决定,块内地址可以是一个独立的线性空间,所以块地址和块内地址这两项都可以用数字表示。通过这种方式使得处理器的寻址空间增大。间接寻址往往使用特殊的寻址操作或者直接由硬件实现,操作可以通过程序结合相应数据结构(必须有两级地址信息)共同完成。理论上这种间接寻址的概念可以无限扩展到多级,如果每级的地址空间都是N,那么m级后,地址空间可以增加到N的m次方。

一个基于固定块的线性地址空间给存取操作带来极大的方便,上层看到的就是一段连续的地址构成的存储空间视图。并且由于每个块在逻辑上是独立无关的,所有块逻辑上没有什么差别。这有效地屏蔽了底层物理存储设备的细节,对于上层程序而言对于线性空间的操作就是对于实际物理设备的操作。在存储系统中往往把这个逻辑地址称为LBA(Logical Block Address)。但逻辑结构并不是真正物理数据存放结构,数据存储的物理介质还是以磁盘为主的存储设备,因此必须建立数据逻辑组织结构到磁盘物理结构的映射,并且这种映射应该是高效和可靠的。由于物理磁盘组织结构由磁道、扇区和柱面等构成,而设备驱动程序对于磁盘操作的接口应该是逻辑块,所以这一映射是由磁盘驱动器完成。事实上这一映射关系通常

由物理存储驱动器固件(firmware)完成的,当某一物理扇区失效时,firmware会把逻辑地址重新映射到一个空余的新扇区,而上层程序完全不知道这个改变。

在存储系统中,存储设备提供的线性空间也往往被称为逻辑卷,它是对于物理磁盘提供线性存储空间的一种抽象,文件系统将其视为有边界的、由固定大小块组成的、可随机存取的存储空间。事实上一个逻辑卷可以映射到多个物理设备的物理空间(如磁盘阵列),或者一个物理设备包含多个逻辑卷(在一个磁盘上建立多个分区),并且逻辑卷中的块大小可以和物理设备的物理块大小不同,卷管理器将这些逻辑块映射到物理存储介质上的物理块。

传统文件系统中,使用分区的概念把磁盘提供的线性存储空间分割成若干用户可见的逻辑空间。事实上,当操作系统格式化磁盘等块设备时,就在上面建立了可操作和管理的线性地址空间,其空间大小对应着分区大小。一旦分区建立,系统能很难在线的对分区进行修改,例如扩容等。逻辑卷管理器的引入,可以在线的进行块地址空间的合并、重映射和减小操作。

正是因为基于块的线性存储空间的逻辑简单性和通用性。块接口是当前存储系统,特别是底层存储设备的基本操作语义,为上层提供简单的视图。而当前实际系统中,最为流行和常用的块接口协议为小型计算机系统接口SCSI协议族。SCSI通常用来连接外围存储设备和前端计算机,它的数据传输是以块方式进行。SCSI起初由Shugart Associates和NCR公司于1981年开发,作为磁盘控制器接口的一部分,称作SASI。这个规范被提交给ANSI X3T9以后,ANSI X3T9委员会对此进行了进一步地发展,并改名为SCSI,此后,ANSI X3T9委员会继续对它进行开发,直到1986年6月,SCSI变成了ANSI的官方标准。自那以后,ANSI X3T9委员会仍然不断地完善SCSI规范。SCSI-1是最初版本的SCSI,具有8位总线,数据传输率为40 Mbps(5MB/s),它为磁盘、磁带和其他的外围设备定义物理接口、传输协议和标准命令;SCSI-2 是基于CCS的SCSI-1改进版本,增加了多线程命令,更多的设备命令和传输协议清除功能,由18条基本命令组成,传输率和带宽都得到增强。Fast SCSI 的传输率为10 MB/s,当采用16位总线时,传输率为20 MB/sec(Fast-Wide SCSI)。由Adaptec及SCSITA于1992年制定具有首个并行接口的SCSI-3,进一步提高的带宽(Ultra-2/Ultra-160/Ultra-320),可以把物理层、通讯协议和SCSI命令集单独分开,例如分别定义了硬盘命令(SBC:Block Command)、磁带设备的流命令(SSC)和多媒体命令(MMC)等命令级。SCSI-3通过即插即用(plug-and-play)解决了以前版本中终结器和延迟问题。由ANSI INCITS T10技术委员会开发的串行SCSI命令(SAS:Serial Attached SCSI)提供更快速的传输速度以及更简单的配置,采用点对点的连接,并允许多个端口集成到单个控制器,第二代SAS为磁盘阵列中的每个驱动器提供了600MB/s的传输速度。

2. 文件存取接口

如果说线性地址空间的整数地址方便计算机处理,那么对于应用而言,特别是对于人类而言,无意义特别是具有很大位数的数值是难以理解和记忆的。就像人类习惯用一个名词去定义一些具有丰富内涵的概念,应用程序和用户也往往给数据集取一个名字以方便的识别。而这个数据集在文件系统中以文件的方式存在。文件作为一组具有逻辑关联的数据的集合,是数据的逻辑容器。因此文件也可以是一个单独的数据寻址单元,而文件内的数据组织可以是线性的地址空间就像块内地址一样,不同的是文件内部字段之间往往是一种逻辑关联,因此对于文件而言,“理解”数据是非常重要的,事实上对于文件数据的“理解”是通过应用程序来执行的。不同应用程序操作的文件往往具有特定的格式,这种格式往往决定了在形式上相同的数据之间的语义差别,因此从另一个角度看格式也应该是文件属性的一部分,通过文件名显示说明其格式类型能够更好的反映文件内部数据的语义含义,实际系统中往往通过文件的后缀表达其文件格式类型。例如可以通过一个媒体播放器播放一个以wmv为后缀的流媒体文件。

仅通过文件名管理文件是低效率的,一方面无法反映文件之间的关系;另一方面如果文

件很多的话,也是难以管理的。就像人类习惯把一系列概念进行分类和组织一样。如果说文件是数据的一个基本集合,那么通过引入目录的概念对大量文件进行归类,往往具有某种相关性的文件存放在特定的目录,目录之间也可以嵌套。文件和目录一起构成了命名空间,而这种命名空间显然具有树形的特点。文件系统以树形结构的方式对文件和目录进行组织,其本质是用文件名(路径也是文件名字的一部分)确定文件的存储位置,文件空间到底层线性块地址空间的转化就成了文件系统必须完成的一项任务。文件系统对于上层应用提供基于文件目录的树形存储空间结构,然后把每个文件目录映射到下层存储设备的物理存储空间,同时提供对两层存储空间的管理和操作。

由于文件名的长度在实际的文件系统中都有限制,例如windows系统中文件名不能超过255个字符;另一方面,一个文件包含的数据集往往具有多种含义,这些又很难仅通过文件名表达。因此通过文件名对于数据集的含义进行描述是有限制的。

现在大部分文件系统可以为文件定义许多静态属性,如创建时间、文件大小和所有者等,但仍然无法描述文件的动态属性,例如,无法统计特定用户在特定时段内存取次数最多的文件。对于这些关系存储性能优化的动态属性统计和表达,现在的文件系统往往无能为力。另一方面,在现代文件系统中,文件寻址和表达文件含义的属性没有直接关系,系统主要仍然是通过绝对地址在文件目录树中进行寻址。由于用户往往按照数据集的含义记忆文件,随着系统中文件的增加和每个文件内涵的增加,用户越来越难以确定自己所需文件所在的位置,很多情况下依赖于对于文件目录树的关键字搜索。因此如何对于海量文件进行高效组织和基于内容的寻址是当前文件系统研究的重点之一。

文件目录是一种对大量数据集及其相关性的组织抽象,文件目录结构是存储系统展现给用户或者上层应用的逻辑视图,和线性块存储空间相比,一方面,树形的文件目录存储空间更容易让人们理解不同数据集之间的组织关系,方便对于数据集的组织和管理;另一方面应用程序或者用户对于文件和目录的操作无需了解所在存放存储设备的特性,也无需关心具体的存取过程。因此文件目录抽象容易被用户理解和操作。

另外,由于在文件目录树中两个子树在路径上是逻辑无关的,因此可以把多个子树通过挂接到所设置连接点构造成一个更大的逻辑树,这一特性使得文件目录树非常方便扩展,例如NAS存储系统通过输出的文件目录结构给用户使用。

IEEE制定的POSIX(Portable Operating System Interface)是应用程序访问文件系统的API标准,也就是前面提到的文件级存取接口及其操作集。POSIX虽然最早为UNIX操作系统设计,但目前几乎所有的文件系统都遵守这一标准或者能够与之兼容。最早的POSIX标准制定于1988年,之后又修订过多次,最新的标准为(IEEE Std 1003.1-2008),其中对于文件和目录操作部分几乎没有改动,这也成为事实上的标准文件操作语义集。

3. 文件地址到块地址的映射 上面两节,分别讨论了块接口和文件接口。存储设备通过块接口给上层展现出基于块的线性地址空间;而文件目录结构给应用和用户提供了一种具有树结构的文件组织视图。事实上经常认为文件目录接口为高层存取语义,而数据块接口为低层存取语义,相对于数据块存取语义,文件目录存取语义具有更丰富的内涵,更容易让人操作和理解。现在的问题是如何实现文件逻辑地址到存储设备物理地址的对应关系和具体操作过程。

文件系统对于文件的物理存取由两次映射完成,一是从用户的文件视图到文件系统的逻辑卷,二是从逻辑卷到具体的物理存储设备。这种映射是建立在系统的核心数据结构和相关的存取操作基础之上的,核心数据结构构成了系统的静态组织结构,包括文件分区表、MFT表、i节点、super 节点等等,每种文件系统可能都有不同的结构方式。另一个方面是加之在这些数据结构上操作,例如从inode结构中获取每个文件数据块的磁盘逻辑地址,又如文件通过系统调用方式存取文件分区表。通过这些核心数据结构和相应的操作完成文件目录到

物理设备之间的映射关系。

作为本地存储系统的组织管理者,主机文件系统实现依赖于相应的操作系统平台,呈现出不同的组织结构和操作形式。在WINDOWS平台的FAT类型文件系统中,文件系统通过FAT表来管理和分配磁盘的存储空间,在NTFS文件系统中使用MFT结构来管理磁盘的存储空间。而在UNIX平台的系统中使用inode作为在磁盘组织文件的重要数据结构。

下面我们以FAT32为例,看文件如何映射到物理地址之中。

FAT文件系统将一个分区划分为四部分,每个分区可以看成独立的逻辑卷,整个分区依次包括引导区(BOOT区)、文件分配表区(FAT区)、根目录区域(ROOT区)和数据区(DATA区)。引导区和文件分配表区又合称为系统区。引导区从第一扇区开始,使用了三个扇区,定义了该分区每扇区字节数,每簇对应的扇区数等重要参数和引导记录。这些记录之后还留有若干保留扇区。而FAT16文件系统的引导区只占用一个扇区,没有保留扇区。区共保存了两个相同的文件分配表,以保证在一个损坏时,另一个依然可以工作。文件分配表实际上是数据区中所有簇的位图文件,文件系统对数据区的存储空间是按簇进行划分和管理的,簇是空间分配和回收的基本单位。每簇的使用情况用32位二进制填写,未被分配的簇相应位置为零;坏簇相应位置填入特定值;正常已分配的簇相应位置具有非零值,如果该簇是文件的最后一簇,填入的值为FFFFFF0FH,如果该簇不是文件的最后一簇,填入的值为该文件占用的下一个簇的簇号,这样,正好将文件占用的各簇构成一个簇链,保存在FAT表中。0000000H、00000001H两簇号不使用,其对应的两个DWORD位置(FAT表开头的8个字节)用来存放该盘介质类型编号。FAT表的大小就由数据区共有多少簇所决定,取整数个扇区。FAT16文件系统的根目录区(ROOT区)是从FAT区之后紧接着的32个扇区,最多保存512个目录项,作为系统区的一部分。根目录区在FAT32系统中存在分区中的任何位置,因为根目录已改为根目录文件,采用与子目录文件相同的管理方式,可看作是数据区的一部分。一般情况下从第二簇开始使用,大小视需要增加,因此根目录下的文件数目不再受最多512的限制。目录表作为文件的寻址入口,记录文件的第一个簇地址。

图 1.6为UNIX的文件inode索引结构{Bar, 2003 #7},通过这种结构文件内的连续地址空间可以映射到逻辑分区中的块地址区域,除外inode还记录文件的属性。图 1.7为FAT的文件索引结构{尤晋元, 2001 #8},它是FAT文件系统管理文件和磁盘的核心结构,保存所有文件的分配信息(通过簇链表示)。

除了建立核心数据结构之外,文件系统还建立cache用于缓存元数据和文件数据、存储空间的分配和回收等管理机制。

数据块文件属性??数据块地址????2????32????332??1211??3

图 1.6 UNIX系统中inode索引结构示意图