发明名称 并行文件系统中资源的管理和分配方法
摘要 并行文件系统中资源的管理和分配方法属于SAN区域网络存储领域。其特征是:通过将存储资源分成多个分配组(Allocate Group,AG),并行分配,降低了单个分配组对其他分配组的影响,提高了并行文件系统的吞吐率、可靠性和管理效率,每个AG可以由单个磁盘分区或者多个磁盘按照Raid形式构成,多个AG之间也可以使用副本策略,通过存储资源的两层虚拟化,提高系统的性能、可用性和可靠性,每个分区使用B+树进行空间分配,并存储自己的B+树数据,与传统SAN文件系统相比降低了并行文件系统元数据服务器的压力,提高了分配效率,在通过B+树实现的目录树中索引文件元数据和目录元数据,保持文件元数据存储的局部性,与传统SAN文件系统相比提高了元数据访问的性能。
申请公布号 CN101567003B 申请公布日期 2012.05.16
申请号 CN200910085706.1 申请日期 2009.05.27
申请人 清华大学 发明人 舒继武;王磊;易乐天;薛巍
分类号 G06F17/30(2006.01)I;H04L29/08(2006.01)I 主分类号 G06F17/30(2006.01)I
代理机构 北京众合诚成知识产权代理有限公司 11246 代理人 朱琨
主权项 并行文件系统中资源的管理和分配方法,其特征在于,所述方法是一种Linux SAN并行文件系统资源的管理和分配方法,依次含有以下步骤:步骤(1)构建一个所述的Linux SAN并行文件系统,以下简称并行文件系统;所述并行文件系统是由不少于一个客户端,不少于一个存储设备,不少于一个元数据服务器MDS,和存储区域网络SAN组成,所述客户端和所述元数据服务器之间的TCP/IP网络是控制通路,传输元数据和控制信息,所述客户端、所述元数据服务器与起所述存储设备作用的磁盘阵列之间的所述SAN网络是数据通路,所述元数据服务器和所述客户端直接通过所述数据通路在所述磁盘阵列上进行数据访问,在所述存储设备上,有两种磁盘:一种是数据磁盘,至少存储数据、磁盘的状态和空间分配信息,另一种是元数据服务器MDS磁盘,至少存储元数据、所述数据磁盘的信息、所述元数据服务器MDS磁盘的信息、以及所述并行文件系统的结构、状态信息,其中:所述数据磁盘分为至少一个分配组AG,而每个所述分配组又至少分为两个磁盘分区,其中,第一个所述磁盘分区包括保留区、分配组超级块ASB、第一B+树(1)的和第二B+树(2)的根节点Tree Root,其中,所述分配组超级块ASB包括分配组号AGN、设备标识DID、第一B+树(1)的和第二B+树(2)的根节点的地址B+Tree Root[2]、所述分配组AG状态信息AG State Information、以及所述两个B+树空闲列表Free List,简称FL,在所述的两个B+树中,每个节点是所述分配组AG中数据存储和检索的一段基本数据空间单元,简称一个块,所述两个B+树的索引中的每一项是由所述分配组AG的多个连续空闲块组成的一段空闲空间,所述分配组AG上的所述每段空闲空间通过所述两个B+树中的所对应的区间Extent来索引,每个所述区间Extent由两项组成:第一项是所述 该段空闲空间所在的所述磁盘分区的起始块号start,第二项是所述该段空闲空间覆盖的块的数量,用该段空闲空间的长度Len表示,初始时,所有空闲空间的索引Extent全部保存在所述两个B+树中,其中所述第一B+树(1)用所述区间Extent的起始块号作为键值,所述第二B+树(2)用所述区间Extent的第二项所述该段空间的长度作为键值,在所述分配组超级块ASB中,所述分配组AG的状态信息State Information是指所述分配组AG的空闲空间或非空闲空间,所述空闲列表Free List由一个块地址数组和三个变量组成,其中包括:所述空闲空间组成的可分配块在所述数组中的起始位置first,用地址标识,下同,末尾位置last,可分配的块的个数count,所述的空闲列表Free List所管理的块由所述两个B+树进行分配和释放,除了所述第一个磁盘分区外,其余每个磁盘分区包括:保留区和超级块SB,该超级块SB包括:所述的AGN和DID;所述元数据服务器MDS磁盘包括:保留区、主超级块MSB,位图Bitmap,日志Journal,分配组链表信息AGLI以及目录树根节点Inode Root;所述主超级块MSB包括:文件系统状态File System State,日志地址Journal Address,AG链表根节点AGLH的地址AGIP,以及目录树根节点地址Inode Address,其中,所述文件系统状态File System State包含文件系统的块大小Block Size、挂载标识Mounted Flag、元数据服务器MDS磁盘空间大小MDS Block Size以及空闲空间大小MDS Free Size,所述分配组AG链表根节点AGLH的地址AGIP包括:所述分配组链表根节点AGLH,AG链表位图AGLB,以及所述分配组链表AG List,其中,所述分配组链表根节点AGLH包括分配组总数AGCount、所有AG的可用空间大小AGs Total Blocks以及空闲空间大小AGs Free Blocks,所述分配组链表AG List由AG信息AGI以数组的形式组成,每个所述AG信息AGI包含一个分配组AG的信息,其中,包括分配组号AGN,不少于一个的分配中磁盘分区的设备标识DID,每个所述AG的信息AGI,线性且连 续保存在所述元数据服务器MDS磁盘上,位置由所述AG链表位图AGLB所索引,所述目录树根节点Inode Root由目录B+树来管理的,所述目录B+树索引的每一项是一个节点Inode,所有文件和目录都是由Inode表示,该Inode的键值是由所述文件或者目录所在父目录的文件名的哈希值、所述文件或者目录的名称的哈希值、所述文件或者目录的类型Type组成,所述类型Type包括:文件类型、目录类型、元数据类型,其中,所述文件类型的Inode用于存储文件的布局信息,即从管理空闲空间的两个B+树中分配出来的区间Extent,所述目录类型的Inode用于存储包含在当前目录下的所述文件的文件名和目录的目录名,元数据类型的Inode包含该节点Inode对应的文件或者目录的元数据信息,该节点Inode对应的文件或者目录的Inode地址,以及该节点Inode对应的文件或者目录的Inode类型Type,其中所述的元数据信息是指由IEEF制定的POSIX标准定义的元数据信息;在所述客户端设有:客户端模块和交互层模块,其中,所述客户端模块设有虚拟文件系统VFS层的调用接口,并进行数据和元数据的缓存,对于所述VFS层的函数调用,则按以下方式判断:若是和所述元数据服务器的交互操作,则生成相应的请求通过函数调用发送到底层的所述交互层模块,所述函数调用包括该文件系统客户端使用的所有请求操作,以及当前请求的索引,若是对所述数据磁盘进行数据访问的操作,则生成相应的数据访问请求发送到底层的SAN驱动模块,所述交互层模块通过远程过程调用协议实现所述客户端和所述元数据服务器MDS之间的通信;在所述元数据服务器中,设有SAN文件系统管理模块,简称管理层模块,交互层模块和元数据文件系统模块,其中:所述交互层模块和所述管理层模块相连,当向所述管理层模块发送以下各种请求:系统状态管理请求,操作状态管理请求,元数据访问请求以及空间 管理请求,所述管理层模块则把生成的相应请求发送到所述元数据文件系统模块中;元数据文件系统模块设有以下接口:Linux内核中的本地文件系统的内核调用接口,接收所述元数据访问的请求;元数据文件系统提供第一调用接口,供所述管理层模块调用,其中管理的信息包括:空闲空间的大小、AGN、起始地址以及相应的区间Extent链表;元数据文件系统模块还设有第二模块接口,从所述元数据服务器的SAN驱动模块中调用需要释放的区间Extent,以及所述并行文件系统的包括主超级块MSB在内存中的数据结构MSB_Core的指针i_private,以及以下数据结构:MSB_Core,AGLH_Core,AGLH,AGI_Core,以及AGI,其中:MSB_Core包括目录树根节点Inode_Root和所述AGLH内存中数据结构AGLH_Core的指针AGLH_point;AGLH_Core包括AGLH在所述元数据服务器MDS磁盘的地址AGLH_disk_point和所述AGI以下两个链表指针:AGI链表指针AGI_List_point和所述AGI哈希表指针AGI_hash_point;AGI_Core包括:所述AGI在所述元数据服务器MDS磁盘的地址AGI_disk_point,所述AGI链表指针AGI_List_point,AGLI_Core指针AGLI_Core_point,可访问磁盘分区在内存中的数据结构的数组Block_Device_Array,所述两个B+树在数据磁盘上地址,所述空闲空间列表FreeList在数据磁盘上的地址Free_List,以及该AG的磁盘分区的所述DI D在内存中的数组Device_Lable_List;AGI,包括所述AGN和DID;步骤(2)按以下步骤启动所述并行文件系统:步骤(2.1)初始化所述元数据服务器MDS磁盘;步骤(2.2)加载所述元数据服务器需要的所述各种模块,挂载所述元数据服务器MDS磁盘;步骤(2.3)在所述元数据服务器MDS磁盘上加载新的AG;步骤(3)所述并行文件系统按以下步骤响应客户端应用程序的读写请求;步骤(3.1)所述并行文件系统按以下步骤响应一个客户端应用程序的读请求:步骤(3.1.1)客户端的应用程序发出读请求到所述客户端模块;步骤(3.1.1.1)所述客户端模块首先查看是否缓存了相应文件的元数据,如果缓存了,直接跳到步骤(3.1.3);步骤(3.1.1.2)所述客户端模块如果没有缓存相应元数据,则通过所述交互层模块和所述管理层模块,将元数据访问请求发送到所述元数据文件系统模块;步骤(3.1.2)所述客户端模块接受元数据访问请求后,进行如下处理;步骤(3.1.2.1)所述元数据文件系统模块首先检查此元数据是否被缓存,如果缓存了,跳转到步骤(3.1.2.2.3);步骤(3.1.2.2)所述元数据文件系统模块首先访问所述元数据服务器MDS磁盘;步骤(3.1.2.2.1)所述元数据文件系统模块根据被访问文件的路径名生成相应的所述目录树B+树的键值;步骤(3.1.2.2.2)所述元数据文件系统模块读取所述目录树B+树的根节点,根据所述键值,查找对应文件的元数据;步骤(3.1.2.2.3)所述元数据文件系统模块读取此文件的布局信息,并通过所述管理层模块、所述交互层模块返回给所述客户端模块;步骤(3.1.3)所述客户端模块获取文件布局信息,并读取数据信息,步骤(3.1.3.1)所述客户端模块分析获取的文件布局信息,并查找需要的数据所在的区间Extent信息;步骤(3.1.3.2)所述客户端模块通过所述区间Extent信息获取所需要数据所在的AG;步骤(3.1.3.2.1)所述客户端模块检查本地设备列表是否缓存了所要访问的AG的所有数据磁盘的DID,如果缓存了所述数据直接跳到步骤(3.1.3.3);步骤(3.1.3.2.2)如果没有所需设备的DID,那么所述客户端模块通过所述交互层模块、所述管理层模块发送相应AG的设备列表信息请求到所述元数据文件系统模块,获取属于相应AG的所有磁盘的DID;步骤(3.1.3.2.3)所述客户端模块通过已获得的DID,扫描所有磁盘的DID,找到与已获得的DID相同的属于所述相应AG的所有磁盘;步骤(3.1.3.2.4)所述客户端模块通过所述SAN驱动模块访问相应AG的所有磁盘;步骤(3.1.3.3)所述客户端模块在AG的磁盘上读取相应的数据信息;步骤(3.1.4)所述客户端模块将读取的数据返回给应用程序,结束此次读请求;步骤(3.2)所述并行文件系按以下步骤统响应一个客户端应用程序的写请求:步骤(3.2.1)所述客户端模块生成文件写请求;步骤(3.2.1.1)所述客户端模块首先检查已经获得文件元数据信息是否有空闲空间可以使用,如果没有跳转到步骤(3.2.1.3);步骤(3.2.1.2)所述客户端模块检查文件元数据信息空闲空间是否够用,如果够用,调转到步骤(3.2.4);步骤(3.2.1.3)如果文件元数据信息空闲空间不够用,所述客户端模块生成相应的文件空间申请请求通过所述交互层模块和所述管理层模块发送到所述元数据文件系统模块,同时使用文件元数据信息已有的空闲空间;步骤(3.2.2)所述元数据文件系统模块根据文件的写请求生成相应的空间分配请求进行操作;步骤(3.2.2.1)所述元数据文件系统模块首先检查当前的整个文件系统的空闲空间是否满足所需要的空闲空间大小,如果不满足,则返回错误,终止上述写请求;步骤(3.2.2.2)所述元数据文件系统模块检查空闲空间分配请求的相应的AG是否满足所需要的空闲空间大小,如果满足,选择此AG进行空间分配,否则选择一个其他可以满足此空闲空间请求的AG,跳转到步骤(3.2.3);步骤(3.2.2.3)如果所有单个AG都不满足上述空闲空间请求,所述元数据文件系统模块选取多个AG进行空间分配,并根据每个AG的大小生成相应的空间请求;步骤(3.2.3)所述元数据文件系统模块选取AG进行空间分配;步骤(3.2.3.1)所述元数据文件系统模块查看当前AG的空闲空间是否满足需要分配的大小;步骤(3.2.3.2)所述元数据文件系统模块检查当前AG的Free List是 否有满足空闲空间B+树进行空间管理所需要的空间;步骤(3.2.3.3)所述元数据文件系统模块根据分配请求查找当前AG的对应的空闲空间B+树,找到符合的Extent,在当前B+树中删除或添加相应的Extent;步骤(3.2.3.4)所述元数据文件系统模块同步两个空闲空间B+树,进行两个空闲空间B+树平衡;步骤(3.2.3.5)所述元数据文件系统模块修改当前AG和MDS上的ASB和MSB,记录空间变化;步骤(3.2.3.6)所述元数据文件系统模块将此区间Extent的信息计入元数据服务器MDS磁盘的响应的文件的Inode,但是不修改该文件的长度信息;步骤(3.2.3.7)所述元数据文件系统模块将得到的区间Extent填入相应的返回列表,并将所述列表通过交互层模块发送到所述客户端模块;步骤(3.2.4)所述客户端模块获得文件空闲空间信息,开始写入数据信息;步骤(3.2.4.1)所述客户端模块分析获取的文件空闲空间信息,并查找需要的数据所在的区间Extent;步骤(3.2.4.2)所述客户端模块通过区间Extent信息获取所需要数据所在的AG;步骤(3.2.4.2.1)所述客户端模块检查本地设备列表是否缓存了所要访问的AG的所有磁盘的DID,如果缓存了直接跳到步骤(3.2.4.3);步骤(3.2.4.2.2)如果没有所需设备的DID,所述客户端模块那么发送相应AG的磁盘列表信息请求到MDS,请求相应的磁盘的DID;步骤(3.2.4.2.3)所述客户端模块通过已获得的DID,扫描所有磁盘的DID,找到与已获得的DID相同的属于所述相应AG的所有磁盘;步骤(3.2.4.2.4)所述客户端模块通过SAN驱动模块访问相应AG的所有磁盘;步骤(3.2.4.3)所述客户端模块在相应的AG的磁盘上写入相应的数据;步骤(3.2.5)元数据服务器MDS根据客户端的访问信息,修改相应文件的Inode中的元数据;步骤(3.2.5.1)如果客户端继续写,跳转到步骤(3.2.1.1);步骤(3.2.5.2)如果数据写完,所述客户端模块将已经使用的新生成的文件元数据信息和文件空闲空间信息通过所述交互层模块发送给所述管理层模块;步骤(3.2.5.3)如果有文件空闲空间信息,所述管理层模块发送空间释放请求到所述元数据文件系统模块进行空间释放;步骤(3.2.5.3.1)所述元数据文件系统模块检查Free List是否有满足空闲空间B+树进行空间管理所需要的空间;步骤(3.2.5.3.2)所述元数据文件系统模块根据分配请求查找对应的空闲空间B+树中相应的区间Extent的插入位置,进行删除或添加相应的区间Extent;步骤(3.2.5.3.3)所述元数据文件系统模块同步两个空闲空间B+树,进行空闲空间B+树平衡;步骤(3.2.5.3.4)所述元数据文件系统模块修改对应AG的所述ASB和MSB上的空间信息;步骤(3.2.5.4所述元数据文件系统模块修改相应文件的Inode信息,将文件的大小信息更新为当前的返回值;步骤(3.2.6)所述客户端模块返回操作完成信息到应用程序,结束所 述写请求。
地址 100084 北京市100084-82信箱