发明名称 一种基于主从分布式文件系统的海量小文件存储方法
摘要 本发明公开了一种基于主从分布式文件系统的海量小文件存储方法,目的是解决主从分布式文件系统存储海量小文件产生的问题。技术方案是先部署并初始化海量小文件存储系统,然后客户端的SmallFileAPI根据从键盘接受的指令对小文件进行创建或读取。系统创建小文件时,SmallFileAPI根据从客户端获得的小文件路径新建小文件的数据文件,并写入小文件数据,同时在数据结点上创建小文件索引;系统读取小文件时,根据小文件路径获取其父目录对应的数据结点信息,并向其中任一数据结点发送索引请求,最后根据索引信息从数据文件中读取小文件数据。采用本发明可以解决海量小文件存储元数据庞大的问题,提高海量小文件存储系统写效率,且可保证系统的可靠性。
申请公布号 CN103020315B 申请公布日期 2015.08.19
申请号 CN201310009182.4 申请日期 2013.01.10
申请人 中国人民解放军国防科学技术大学 发明人 王蕾;何连跃;徐叶;李姗姗;戴华东;吴庆波;丁滟;黄辰林;付松龄
分类号 G06F17/30(2006.01)I 主分类号 G06F17/30(2006.01)I
代理机构 国防科技大学专利服务中心 43202 代理人 郭敏
主权项 一种基于主从分布式文件系统的海量小文件存储方法,其特征在于包括以下步骤:第一步,部署海量小文件存储系统,海量小文件存储系统由主从分布式文件系统以及主从分布式文件系统各个结点上用于处理海量小文件的软件组成;这些软件包括元数据结点上的索引位置维护模块、数据结点上的小文件索引模块、客户端缓存模块以及客户端操作小文件专用接口SmallFileAPI;索引位置维护模块为每个目录分配数据结点,对目录与数据结点的映射关系进行排序,向客户端返回管理该小文件索引的数据结点,即小文件目录所分配到的数据结点;索引位置维护模块采用索引位置映射表来保存目录与数据结点的映射关系;索引位置映射表由目录、主数据结点、主数据结点更新标志、第一副本数据结点、第一副本数据结点更新标志、第二副本数据结点、第二副本数据结点更新标志七项组成;这三个更新标志的取值为“Y”和“N”两种;“Y”表示数据结点上该目录下的小文件索引是最新的,不需要进行更新,“N”表示不是最新,需要更新;索引位置维护模块创建队列waitArrangeQueue,其队列项为目录路径,用来记录未能够成功分配数据结点的目录,以等待分布式文件系统有新的数据结点加入时,索引位置维护模块对waitArrangeQueue中的目录进行重新分配;索引位置维护模块还在磁盘上创建两个空文件,分别为文件dirToDatanode和文件waitArrangeDir,文件dirToDatanode用来存储索引位置映射表的内容,waitArrangeDir用来存储队列waitArrangeQueue的内容;客户端的缓存模块的容量初始化为M,每个缓存记录存储目录对应的索引位置映射表项以及小文件的数据文件输入输出信息,M为正整数;小文件索引模块接收客户端对索引创建或查询的请求,根据索引位置映射表中更新标志判断是否需要加载小文件索引数据,将小文件索引或创建是否成功的结果返回给客户端;小文件索引模块启动时创建小文件索引数据结构Index,它是根据目录路径用B‑树进行排序的数据结构,其结点是目录下小文件索引记录的集合,同样也是一个B‑树,以小文件名为序;小文件索引记录代表一个小文件的索引,包含小文件的路径名、小文件的数据文件路径以及小文件在数据文件中的偏移量;SmallFileAPI是完成客户端与海量小文件存储系统数据交互的软件,包括创建和读取小文件的操作;第二步,对海量小文件存储系统进行初始化,包括以下步骤:2.1初始化索引位置映射表,方法是从文件dirToDatanode中读取索引位置映射表的数据,如果dirToDatanode文件为空,索引位置映射表将初始化为空表;2.2初始化等待队列waitArrangeQueue,方法是从文件waitArrangeDir中读取队列数据,如果waitArrangeDir文件为空,waitArrangeQueue将初始化为空队列;2.3初始化索引数据结构Index,将Index初始化为一个空的B‑树;第三步,客户端的SmallFileAPI根据从键盘接受的指令对小文件进行操作,如果是创建小文件,执行第四步,如果是读取小文件转第八步;第四步,SmallFileAPI从客户端获得创建小文件的路径,然后获取小文件路径所指示的目录即小文件目录下的数据文件和小文件目录对应的索引位置映射表项,方法是:4.1客户端的SmallFileAPI查询缓存模块中是否包含小文件目录的相关信息,小文件目录的相关信息包括为该目录对应索引位置映射表项和小文件数据文件的输入输出信息,如果能够从缓存模块中获得,转第五步;若在缓存模块中未找到,执行步骤4.2;4.2客户端的SmallFileAPI根据小文件的路径,提取小文件目录的路径,如果该小文件目录不存在,则创建小文件目录,同时元数据节点的索引位置维护模块为该目录分配三个数据结点,将目录与三个数据结点的映射关系作为映射表的表项插入到索引位置映射表中;索引位置维护模块为该目录分配三个数据结点的具体方法为:4.2.1索引位置维护模块从元数据结点维护的全部数据结点信息中随机获得三个数据结点,如果成功获取三个数据结点,将这三个数据结点的更新标志初始化为Y,转步骤4.2.3,如果未找到三个数据结点,执行步骤4.2.2;4.2.2将未能够分配数据结点的目录加入到队列waitArrangeQueue中,将waitArrangeQueue的内容保存到waitArrangeDir文件中,向客户端返回操作失败的信号,转十三步,结束操作;4.2.3索引位置维护模块将索引位置映射表保存到dirToDatanode文件中;4.3令变量X=1;4.4若小文件目录下的数据文件dataX不存在则由元数据结点在小文件的目录下创建dataX;4.5若小文件目录下的数据文件dataX存在,客户端的SmallFileAPI向元数据结点请求获取小文件目录下的数据文件dataX的输出信息,如果成功获取dataX输出信息,执行步骤4.6;如果未成功获取dataX输出信息,令X增1,若X<=P,转4.4,若X>P,向客户端返回错误信息,转第十三步;P为在该目录下能创建的数据文件个数,P为正整数,P的值由用户自行设置;4.6客户端的SmallFileAPI向元数据节点的索引位置维护模块提出查询小文件目录对应的数据结点请求,索引位置维护模块查询索引位置映射表并将该小文件目录对应的这条表项返回给客户端;4.7客户端的SmallFileAPI将该小文件目录对应的索引位置映射表项和该小文件的数据文件输出信息记录到缓存模块,如果缓存模块已满,则通过LRU算法即最近最少使用算法进行淘汰;第五步,客户端将小文件作为一个数据记录写到4.5所得到的数据文件dataX中,并且返回小文件在数据文件中的偏移量,即数据记录在数据文件中的位置;第六步,数据结点的小文件索引模块创建小文件索引;客户端向4.6获得的索引位置映射表项的三个数据结点中的主数据结点发送小文件路径、存储小文件的数据文件的名称、小文件在数据文件中的偏移量以及数据结点更新标志并提出创建小文件索引的请求,如果该主数据结点出现故障,向客户端返回故障结果,转第十三步,如果主数据结点正常,则主数据结点接到请求后由小文件索引模块进行如下工作:6.1小文件索引模块根据主数据结点的更新标志判断是否需要对该目录下的小文件索引进行更新操作,更新标志位Y执行6.2,更新标志为N转至6.3;6.2小文件索引模块在分布式文件系统中读取路径为/index/小文件目录路径.index和/index/小文件目录路径.log两个文件,小文件目录路径.index文件称为索引文件,存放该目录下所有小文件索引记录,这些索引记录以B‑树数据结构对小文件路径名进行排序后保存;小文件目录路径.log称为日志文件,存放对该目录下小文件索引的操作记录,由操作类型和索引记录组成;根据小文件目录路径.index文件和小文件目录路径.log读取索引数据,步骤如下:6.2.1小文件索引模块读取小文件目录路径.index的数据,根据这些数据生成B‑树作为结点插入到内存的索引数据结构Index中;6.2.2小文件索引模块依次读取小文件目录路径.log中索引的操作记录,按照这些操作记录重新进行操作;6.2.3小文件索引模块重命名小文件目录路径.index为小文件目录路径.index.tmp,新建索引文件命名为小文件目录路径.index,并将Index中该小文件目录对应的所有索引记录保存到新建的索引文件中,删除后缀为.tmp的索引文件;6.3清空小文件目录路径.log文件内容,并由小文件索引模块获取该小文件目录路径.log的写操作信息,准备进行写日志操作;6.4小文件索引模块将从客户端获取的小文件路径名、数据文件名、偏移量信息生成索引记录,查询索引数据结构Index,将索引记录按小文件路径名排序插入到Index树中的对应位置,将创建索引的操作写到通过6.3获得的小文件目录路径.log中;6.5小文件索引模块向客户端发送小文件创建成功的信号;第七步,客户端的缓存模块修改小文件目录对应的缓存记录中主数据结点的更新标志,主数据结点的更新标志修改为N,其余第一副本数据结点和第二副本数据结点的更新标志修改为Y,转第十三步;第八步,客户端的SmallFileAPI根据小文件路径获得小文件目录,根据小文件目录查找客户端缓存模块,若找不到小文件目录对应的数据结点信息则执行第九步,如果查找到了小文目录对应的数据结点信息,则转第十步;第九步,客户端的SmallFileAPI向元数据结点的索引位置维护模块提出查询目录索引位置的请求,索引位置维护模块查询索引位置映射表将该小文件目录对应的索引位置映射表项返回给客户端,客户端将获取的信息记录到缓存模块中;第十步,客户端的SmallFileAPI选择三个数据结点中的任意一个发送查询小文件索引的请求,如果更新标志为Y,则小文件索引模块对小文件目录下所有小文件的索引进行更新,具体步骤如下:10.1小文件索引模块读取小文件目录路径.index的数据,并生成B‑树作为结点插入到索引数据结构Index中;10.2小文件索引模块依次读取小文件目录路径.log的索引操作记录,按照这些操作记录重新进行操作;10.3数据结点通过小文件索引模块查询Index将小文件的索引记录返回给客户端;第十一步,客户端的SmallFileAPI根据小文件的索引记录中数据文件名,查询客户端缓存模块,获取数据文件的输入信息,如果没有则利用分布文件系统读文件接口获取小文件的数据文件输入信息,并记录到缓存模块;第十二步,客户端的SmallFileAPI根据小文件的索引记录中小文件在数据文件中的偏移量从数据文件的中读取小文件的数据;第十三步,客户端的SmallFileAPI判定是否仍有指令输入,若有,转第三步;若无,结束。
地址 410073 湖南省长沙市开福区德雅路109号