一种分布式文件系统中目录的存取方法

文档序号:6436449阅读:373来源:国知局
专利名称:一种分布式文件系统中目录的存取方法
技术领域
本发明涉及分布式文件系统中目录项的组织方式,具体来说,涉及一种分布式文件系统中目录的存取方法。
背景技术
随着网络技术的飞速发展,各种网络应用对于存储的需求越来越大。网络应用的存储需求大致分为两种,一种是大文件为主的存储需求,如视音频网络应用,这类应用的特点是文件数目不多,但是单个文件的大小通常是GB甚至TB级别;另外一种以小文件为主的存储需求,如网上商城等,这类需求的特点是单个文件不大,但是文件数量巨大。为了满足存储的需求,分布式文件系统被引入到各种网络应用中,这其中具有代表性的是是Google的Google FS, Hadoop的HDFS等。这类分布式文件系统的特点是对于大文件的操作有比较好的性能,但是如果单个目录下有数量巨大的小文件,则此类文件系统的检索目录项的效率则很难令人满意,尤其是对于非热点目录,即当前内存中没有缓存时,其延迟更为明显。究其原因,主要是由于当目录中的目录项数目较多时,目录文件的大小相对较大,检索时需要将所有目录内容全部读入磁盘,导致磁盘操作过多,浪费了大量时间;另一面,当目录项较多时,内存检索通常采用构建二叉树的方式来进行,建树所需要的时间会随着目录项数目的增加而变大。

发明内容
本发明旨在公开一种分布式文件系统中高效的目录项组织方法,来解决分布式文件系统中,当单个目录下存储有海量目录项时,目录项检索效率低下的问题。一种分布式文件系统中目录的存取方法,将单个目录中的目录项存储于同一个文件中,划分出目录子集,根据所述目录项的名称进行哈希运算,将目录项分配到目录子集中。优选的,所述目录子集的个数为IOM或其整数倍。优选的,所述目录子集分块进行条带化存储,每个条带大小为256KB。优选的,所述目录子集的条带在访问时采用内存映射直接映射到虚拟内存区域。优选的,所述条带内的目录项采用二叉树方式存储。优选的,所述条带头部存储条带内目录项的索引信息,所述索引信息只存储实际目录项在条带内的相对偏移,访问时去相应偏移中读取目录项。优选的,所述索引按照目录项名称排序,对于条带内空闲的空间,虚拟出空闲空间目录项,并按空闲空间大小排序。优选的,所述条带在初始化时,计算出该条带可以承载的最大目录项数目,在条带头部预留相应数目的空间存储索引信息。优选的,初始化时,所述条带只有一个空闲目录项,该目录项为整个条带。优选的,所述目录项需要添加时,首先根据字符串哈希计算出目录项所在的目录子集,然后遍历该子集中的所有条带;在条带的空闲目录项中二分查找,得到能够容纳目标目录项的最小空闲项,然后修改原空闲目录项大小,并将目标目录项初始化后,将其偏移插入到合法目录项的索引集合中。优选的,所述空闲目录项如果比需要添加的目录项大很多,需要将该目录项拆分成一个新的空闲目录项和用于存储目标的目录项。优选的,所述目录项在进行查找操作时,首先计算目录项子集,然后遍历该子集的各个条带块,根据合法目录项索引二分查找,直到找出目标目录项。优选的,所述目录项需要删除时,需要先通过索引得到对应的目录项,然后修改其目录项内容,并根据前后目录项的性质,确定是否与前后的空闲目录项合并,如果不能合并,则生成一个新的空闲目录项,否则与前后空闲目录项合并;之后将目标目录项索引从合法目录项索引集合中删除,并将新生成的空闲目录项加入到空闲目录项索引集合当中去。在本发明中,目录的内容使用文件来存储,对于目录中的目录项,通过对目录项名称进行哈希,将目录项分为若干子集。对于不同的子集,其在目录文件中按照条带化的方式进行存储,条带的大小相对较大,以使读取磁盘时能够充分利用底层文件系统的预读功能。对于每个子集的条带块中的所有目录项,采用二叉树的方式进行存储,以避免初次读取时需要建立二叉树。对于所有的条带块,采用内存映射(mmap)的方式进行访问,避免每次访问磁盘数据时进行内存分配、调用系统文件读写系统调用所带来的开销。


图1是本发明中条带分块的结构2是本发明中条带内部结构图
具体实施例方式下面结合附图做具体描述如下(1)对于单个目录,其所有目录项存储于同一个文件,对于所有的目录项,对其名称进行哈希,将其分为N个子集(本发明中,N选10M)。(2)对于各个子集,分块进行条带化存储,存储方式如图1。本方案中,每个条带大小选取256K,和Linux虚拟文件系统的预读窗口大小一致。对于每一个目录条带块,采用内存映射将其映射到一片虚拟内存区域,这样可以直接进行访问,不需要繁琐的管理结构和读取构建操作。(3)每个条带块内部的目录项,采用二叉树的方式进行存储,其结构见图2。如图2所示,在每个条带块的头部,存储着块内所有目录项的索引信息。每个索引只存储实际目录项在块内部的相对偏移,实际访问时,根据索引,去相应偏移中去读取对应的目录项。所有的索引,按照目录项名称的顺序进行排序,对于条带块中空闲的空间,虚拟出特殊的目录项,对这些目录项,根据空闲空间的大小进行排序。(4)对于每个条带块,在初始化时,计算出该条带块可能承载的最大目录项数目,在条带块头部预留相应数目的空间来存储索引信息。但初始时,整个条带块只有一个空闲的目录项,该目录项涵盖整个条带块。(5)当需要在条带块中添加目录项时,首先根据字符串哈希计算出目录项所在的
4目录项子集,然后遍历该子集中的所有条带块在条带块的空闲目录项中二分查找,得到能够容纳目标目录项的最小空闲项,如果空闲目录项比需要添加的目录项大很多,为了不浪费空间,需要将该目录项拆分成一个新的空闲目录项和用于存储目标的目录项。然后修改原空闲目录项大小,并将目标目录项初始化后,将其偏移插入到合法目录项的索引集合中,由于是采用mmap的方式操作目录块,因此该修改能最终反映到磁盘中去。(6)当需要查找目录项时,类似添加,首先计算目录项子集,然后遍历该子集的各个条带块,根据合法目录项索引二分查找,直到找出目标目录项。(7)删除目录项时,需要先通过索引得到对应的目录项,然后修改其目录项内容,并根据前后目录项的性质,确定是否与前后的空闲目录项合并,如果不能合并,则生成一个新的空闲目录项,否则与前后空闲目录项合并。之后,将目标目录项索引从合法目录项索引集合中删除,并将新生成的空闲目录项加入到空闲目录项索引集合当中去。
权利要求
1.一种分布式文件系统中目录的存取方法,其特征在于将单个目录中的目录项存储于同一个文件中,划分出目录子集,根据所述目录项的名称进行哈希运算,将目录项分配到目录子集中。
2.如权利要求1所述的方法,其特征在于所述目录子集的个数为1024或其整数倍。
3.如权利要求1所述的方法,其特征在于所述目录子集分块进行条带化存储,每个条带大小为256KB。
4.如权利要求3所述的方法,其特征在于所述目录子集的条带在访问时采用内存映射直接映射到虚拟内存区域。
5.如权利要求3所述的方法,其特征在于所述条带内的目录项采用二叉树方式存储。
6.如权利要求5所述的方法,其特征在于所述条带头部存储条带内目录项的索引信息,所述索引信息只存储实际目录项在条带内的相对偏移,访问时去相应偏移中读取目录项。
7.如权利要求6所述的方法,其特征在于所述索引按照目录项名称排序,对于条带内空闲的空间,虚拟出空闲空间目录项,并按空闲空间大小排序。
8.如权利要求3所述的方法,其特征在于所述条带在初始化时,计算出该条带可以承载的最大目录项数目,在条带头部预留相应数目的空间存储索引信息。
9.如权利要求8所述的方法,其特征在于初始化时,所述条带只有一个空闲目录项, 该目录项为整个条带。
10.如权利要求1所述的方法,其特征在于所述目录项需要添加时,首先根据字符串哈希计算出目录项所在的目录子集,然后遍历该子集中的所有条带;在条带的空闲目录项中二分查找,得到能够容纳目标目录项的最小空闲项,然后修改原空闲目录项大小,并将目标目录项初始化后,将其偏移插入到合法目录项的索引集合中。
11.如权利要求10所述的方法,其特征在于所述空闲目录项如果比需要添加的目录项大很多,需要将该目录项拆分成一个新的空闲目录项和用于存储目标的目录项。
12.如权利要求1所述的方法,其特征在于所述目录项在进行查找操作时,首先计算目录项子集,然后遍历该子集的各个条带块,根据合法目录项索引二分查找,直到找出目标目录项。
13.如权利要求1所述的方法,其特征在于所述目录项需要删除时,需要先通过索引得到对应的目录项,然后修改其目录项内容,并根据前后目录项的性质,确定是否与前后的空闲目录项合并,如果不能合并,则生成一个新的空闲目录项,否则与前后空闲目录项合并;之后将目标目录项索引从合法目录项索引集合中删除,并将新生成的空闲目录项加入到空闲目录项索引集合当中去。
全文摘要
在本发明中,目录的内容使用文件来存储,对于目录中的目录项,通过对目录项名称进行哈希,将目录项分为若干子集。对于不同的子集,其在目录文件中按照条带化的方式进行存储,条带的大小相对较大,以使读取磁盘时能够充分利用底层文件系统的预读功能。对于每个子集的条带块中的所有目录项,采用二叉树的方式进行存储,以避免初次读取时需要建立二叉树。对于所有的条带块,采用内存映射(mmap)的方式进行访问,避免每次访问磁盘数据时进行内存分配、调用系统文件读写系统调用所带来的开销。
文档编号G06F17/30GK102385623SQ20111032829
公开日2012年3月21日 申请日期2011年10月25日 优先权日2011年10月25日
发明者刘新春, 杨浩, 王勇, 苗艳超, 邵宗有, 马振杰, 马照云 申请人:曙光信息产业(北京)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1