物理设备之间的映射关系。
作为本地存储系统的组织管理者,主机文件系统实现依赖于相应的操作系统平台,呈现出不同的组织结构和操作形式。在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索引结构示意图
EOFMovie.mpgLec.docMusic.mp3EOFEOF
图 1.7 FAT的索引结构
在实际运行中,文件系统的核心元数据(如FAT表,Superblock)记录存储系统的全局逻辑视图,是所有存取过程所共享的,因此其访问频率是极高的。为了提高这些数据结构的存取性能必须对其进行cache;但另一个方面它们如果不可访问或者不一致,整体存储系统中的数据都不能正常存取,因此保证其完整性也是至关重要的。而cache数据在掉电后丢失,这样就造成最近的元数据和磁盘保存的元数据不一致的问题,原因主要是cache中保存的元数据没有及时更新到磁盘。但另一个方面,如果每次更新强制写磁盘,考虑到元数据操作往往涉及很多小的I/O读写,如目录查询等操作,因此带来很多额外开销,特别是在具有较高延迟时间的网络存储环境中。在NAS系统中文件组织的元数据是存放在NAS设备端,当用户读写NAS中的数据时,必须通过网络获得NAS中的元数据。当涉及到大量的文件创建和删除操作时,命令通过网络传输,性能会严重下降。因此元数据的组织对于系统整体性能和可用性是极其重要的。
另一方面,一般系统初始化是构建核心的数据结构(如FAT表)建立文件目录视图到逻辑卷块线性地址的映射,这些核心的存储结构一旦在系统运行时发生改变,整个系统就会崩溃。另外部分系统的元数据往往受限于设计容量,其扩展性较差,例如FAT32就限制文件的大小。逻辑卷管理层的引入在一定程度上增加了系统的在线扩展性,例如在线的分区扩充,这已不需要系统重新启动,又如使用活动磁盘的概念可以在线的扩展存储容量。又如使用VFS接口和iFS可安装文件系统可以在文件系统级进行适当在线扩充,而且能够融合更多的异构文件系统。但这种扩充性是在不改变本地文件系统结构的前提下完成的。
4. OSD协议
随着数据结构和应用负载的多样化,为了高效使用底层存储设备和系统的特性,必须为存储系统设计新的接口模式满足性能优化的要求。块和文件存取接口分别为应用访问块设备和文件系统提供标准的存取操作语义,一直是存储系统最为流行和通用的接口标准。它充分屏蔽了不同存储系统内部结构和应用程序的差异。然而现有的接口标准不能充分表达应用程序的特殊I/O需要,也不能反映存储设备和系统的许多特性。事实上具有不同存取模式的应用,例如连续流媒体点播(大的连续读)和联机事务处理(小读小写)应用在使用两个接口时不能反映各自的特性;而应用也无法区分底层磁盘阵列是采用的RAID1模式还是RAID0组织模式。
另一个方面,正如前面提到的,文件逻辑地址到块设备物理地址映射的文件分配元数据信息由文件系统维护,而随着存储系统中文件和目录数量的急剧增加,大量用户的并发访问产生更加密集的元数据操作,对于文件系统提出了巨大的挑战;而同时现在存储设备具有越来越强的处理能力,那么把文件的元数据操作放到底层设备上进行处理有效减少主机文件系统的负担。但是在原有两种接口体系下,无法实现这种机制。
一方面为了扩展现有标准接口语义的不足;另一方面也使得存储系统上下层能够更加充分的交换数据的属性,进而实现数据存储的自管理、共享和安全性;同时把数据对象的空间管理移到底层存储设备负责,以便于更好的提高存储服务质量,基于对象的存储接口协议因此被提出,具有以下的特性:
? 提高设备和数据的共享能力:通过设计平台无关的元数据组织格式,把数据空间管
理功能移到设备;系统仅仅需要建立所有存储对象的命名空间,通过唯一的名字访问数据对象;
? 提供扩展性和安全性:存储设备可以直接处理客户的请求;数据对象可以建立用户
级粒度的安全存取策略; ? 提高性能:应用程序可以提供额外信息用于优化数据存取过程,并能够建立满足服
务质量策略;同时存储设备也能够对于不同数据类型进行优化放置。 ? 提高存储管理能力:存储设备能够对于内部的数据对象进行自管理,为不同的数据
对象建立相应的存储策略,使得数据管理更加智能化,减少管理员负担。 1995年卡内基梅隆大学的NASD项目首次提出了存储对象的概念,随后标准草案于1999年提交给存储网络工业协会(SNIA ,Storage Networking Industry Association),并于2004成为ANSI标准。对象存储设备(OSD,Object-based Storage Device)标准对现有SCSI协议进行了扩展,集成低层存储、空间管理和安全功能到存储设备,以保证可扩展、自管理,可保护异构共享存储系统;OSD对象包含数据和属性,包括用户数据在设备上的空间信息,并增加了对象ID、对象属性及其操作和对象存取密钥等。事实上这一标准还在不断增加新的内容,例如异常处理和恢复能力以及引入信息生命管理等。
1.4.2 存取路径
设计和理解存储系统涉及到许多具体的细节,一个最为重要的方法就是分析数据的存取路径。事实上存取路径包括物理过程和逻辑过程,前者是数据在硬件部件上实际流动的过程,而后者是软件对于数据的处理过程。存取路径是指请求和数据在存储系统中传递的通道。而存取路径就是从数据请求到物理存储设备之间的交互通道。之所以称之为交互通道,其原因在于它不是单向的,而是双向的,无论是读还是写过程都需要数据和命令的传输,这两个方面的过程往往占据双向过程中的某一边。
网络文件请求网络存储设备网络文件协议驱动程序本地文件请求系统环境I/O重定向文件系统卷管理器设备驱动程序接口NIC设备驱动程序I/O控制器设备驱动程序网络存储设备主机I/O总线存储网络设备网络接口卡主机I/O控制器存储I/O总线(到设备)局域网服务器
图 1.8数据请求的物理存取路径
正如在前面讨论计算机系统存储层次结构,物理存取路径的起点或终点是内存,典型物理路径包括系统主机总线、主机I/O总线、主机I/O控制器或者主机总线控制器(HBA),I/O总线或者网络连接、存储设备和外部存储系统,最后是实际的存储介质。需要指出由于存储设备和外部存储系统自身也是一台计算设备,因此它们具有和上述主机内部的物理路径类似的内部物理路径。而数据或者命令在物理路径上流动都需要部件的处理单元参与,并且主机
对于存储设备或者系统发出I/O指令(不仅限于处理器的指令集,包括应用程序的I/O请求)触发实际的数据存取过程。
图 1.8显示了同一个主机中两种不同应用分别针对网络存储设备和本地存储设备访问的物理存取路径。事实上,对于网络存储设备的访问物理存取过程还必须包含网络和远程存储设备的内部物理路径,考虑到不同的网络存储设备有不同的内部存取路径,因此只是简单表明网络存储设备。
实际运行时,并不是每次数据存取过程都需要上述全部物理部件的参与。在DAS结构中,数据不需要经过网络传输。考虑在上述物理部件中基本上都存在buffer或者cache,如果需要读的数据已经存在于内存之中,相应的的物理存取过程也许仅仅涉及内存操作。
当前对于技术的发展,交换型的数据通道也可能取代传统总线型的物理数据通道成为物理路径的一部分,例如Infiniband高速网络在高性能存储下系统中就可以起到系统主机总线的作用,而光纤通道FC也在SAN系统中占据了传统I/O总线的位置。
而逻辑存取路径主要涉及存储过程中的软件。逻辑存取路径的软件部分可以包括应用软件、操作系统、文件系统和数据库、卷管理器和设备驱动程序,以及存储设备的嵌入式系统软件等。下面用一个例子来说明逻辑存取路径,如果某个程序需要读取本地磁盘中的一个文件并且该文件还没有被系统缓存,程序通过操作系统提供的系统调用发出读文件请求,而文件系统响应应用程序的请求,通过请求中的文件路径获取该文件所在的卷号和分配表,并对分配表记录逻辑地址发出页请求,由于文件不在内存缓冲区,页请求被发送给卷对应的设备驱动程序,设备驱动程序把页请求转化为对于磁盘驱动器的I/O请求,而磁盘响应驱动程序的请求,把逻辑地址转换为实际的物理地址并读取数据,之后数据再通过请求路径传递给应用程序。而写文件过程的路径和上面一样,只是首先把数据传递给磁盘,而确认信息通过相同的路径返回应用程序。一般把从应用程序到存储设备的过程定义为下行过程,而把存储设备到应用程序的过程定义为上行过程。因此很多研究把应用程序到存储设备软件层次称为I/O功能“栈”。
应用程序文件目录结构文件分配表逻辑卷管理器设备驱动程序主机适配器存储设备控制器本地物理存储设备网NAS/OSD设备iSCSI设备络基于主机的磁盘阵列独立磁盘阵列块设备(磁盘)块设备(磁盘) 图 1.9数据请求的逻辑存取路径
I/O栈的每一层往往提供请求/响应接口,实际的过程分为同步I/O和异步I/O。例如设
备驱动程序为维护一个请求队列,文件系统发出I/O请求会进入请求队列,当任务完成后,驱动程序通过回调方式返回数据给文件系统。同样磁盘驱动器也有相同的过程。
大部分数据请求开始于某一个应用程序,这个应用可以是数据库操作、Email服务、Web服务或者系统管理应用。这些应用由用户发起完成特定的功能或者服务,它们通常通过标准的存取接口访问存储设备或者系统。事实上,还有许多I/O请求是由操作系统本身发起的,例如虚拟存储器中的页交换过程。
实际上,物理存取路径和逻辑存取路径是一致的,是实际存取路径在物理和逻辑上的不同表现形式。如果物理存储路径需要通过TCP/IP网络到远程NAS设备存取数据,逻辑存取路径包括本机的TCP/IP协议栈和远程NAS的TCP/IP协议栈。正是由于软件和硬件相互合作才能完成数据请求。
下面以iSCSI为例,分析实际的数据存取路径。Linux的SCSI驱动程序的实现分为三个模块:SCSI上层,SCSI中层,SCSI底层。可以用iSCSI模块替换三层模块中的任意一层来对SCSI命令进行封装并通过TCP/IP网络传输。可以通过替换Linux的SCSI驱动的中层模块来对iSCSI协议进行解释和封装。如图 1.10所示,(1)当用户向一个iSCSI target设备发出访问请求时,应用程序通过系统调用访问文件系统,(2)文件系统首先解释这个IO命令,分析IO命令所在的设备和地址。然后它把这个请求发送给SCSI上层驱动程序,(3)SCSI上层驱动程序把相应的IO命令转化为SCSI命令,并发给iSCSI Initiator,(4)iSCSI Initiator把SCSI命令封装打包,通过网络发送到iSCSI Target模块,(5)当iSCSI Target模块收到iSCSI命令包后,它把iSCSI命令包中的SCSI命令发送到SCSI的底层驱动程序,(6)由SCSI底层驱动程序完成IO请求。把数据按原路返回给用户。
用户态用户应用①文件系统网络协议栈iSCSI的Target②SCSI上层③iSCSI的Initiator⑤SCSI底层④网络协议栈核心态SCSI磁盘⑥ 图 1.10访问iSCSI Target设备的I/O流程
总之,如果说存储接口为存储系统划分了几个横向具有标准接口的断面,那么一条存取路径就是纵向贯穿存储层次连接从请求发起的应用到数据源的通道。在读数据过程中,读请求顺着特定路径达到物理存储设备,数据准备好后,数据沿着特定道路返还给用户;在写数据过程中,数据沿着特定的路径到达物理存储设备,数据写到物理存储设备后,确认信息返回给用户。
I/O请求的响应时间就是数据和请求命令(或者写确认)在存取路径往返的总延迟。因此一种减少响应时间的方法就是缩短实际的存取路径,而在存储系统每层的接口处设计cache机制提供请求在本层的命中率,从而减少I/O请求的响应时间。
在大容量存储系统中应用发出的文件需要从多个存储结点获取数据,那么一条存取路径往往在主机系统I/O栈的底层分裂为几个相对独立(横向和纵向)的子I/O路径(I/O路径