的位置信息和小文件的数据长度。
[0195]通过步骤205至209的描述,使打包文件中存储的小文件的实际容量不会大于预先设定的打包文件的存储容量,保证了文件系统的稳定性。
[0196]参见图6,为小文件在打包文件中的存储形式,包括:模数、名字、数据长度、创建时间、数据内容和校验和;其中,模数是固定数值的数字串,用于表示小文件的起始位置;名字是小文件的文件名;数据长度是小文件的数据大小;创建时间是小文件在文件系统中的创建时间;数据内容是小文件的数据;校验和是对小文件的模数、名字、创建时间和数据长度进行哈希计算后得到的数字串,用于校验小文件存储数据的准确性,计算得到的校验和放置在小文件数据内容的后面,用于表示小文件的终止位置。
[0197]模数是固定数值的数字串,所以可以明确表示小文件在打包文件中的起始位置,而且与小文件属性信息一起通过哈希计算,得到小文件的校验和,还提供了一种校验小文件的高效方式。
[0198]小文件的数据内容不参与校验和计算,大幅降低校验数据量;打包文件中存有小文件属性信息,通过遍历所有的打包文件可以找到所有小文件属性信息,可以在数据崩溃后对数据进行恢复;小文件的小文件属性信息放在小文件数据前面,校验和放在小文件数据后面,只要小文件的检验和正确,文件系统就可以确定小文件从数据开始到结束全部恢复到文件存储子系统中。
[0199]步骤210、根据小文件的文件名计算小文件的属性值,其中,属性值包括:文件名哈希值。
[0200]哈希值一般的长度是32比特,所以在文件系统中,哈希值的数量最多有232种可能性,但在一些情况下,比如:当文件系统中存储的小文件数量大于文件名哈希值的数量232最大值时,就可能在索引子系统中就会存储有文件名哈希值相同的多个小文件索引文件,所以通过哈希值就不能唯一确定小文件了,那么就会给小文件的查询带来不便。
[0201]因此,在步骤210中,为了使文件名哈希值还可以唯一标识小文件,分别采用第一哈希算法和第二哈希算法对小文件的文件名进行哈希运算,从而分别得到小文件的文件名的第一文件名哈希值和第二文件名哈希值;其中,第一文件名哈希值的长度小于第二文件名哈希值的长度。
[0202]这样,文件系统查询某个小文件时,在长度较短的第一文件名哈希值不能唯一确定出小文件时,可以进一步通过比对长度较长的第二文件名哈希值唯一确定出小文件,而无需对文件的文件名进行比对,就可以快速的查询到小文件。
[0203]其中,第一文件名哈希值,可以是采用一致性哈希算法计算得到的32比特的哈希值;第二文件名哈希值,可以是采用MD5 (Message Digest Algorithm,消息摘要算法第五版)计算得到的128比特的哈希值;当然,第一文件名哈希值和第二文件名哈希值也可以是采用其他的哈希算法计算得到的哈希值,这里不再--赘述。
[0204]步骤211、将计算得到的属性值和小文件的元数据作为小文件的索引文件存储到索引子系统。
[0205]步骤211包括如下具体步骤:
[0206](I)、在将计算得到的属性值和小文件的元数据作为小文件的索引文件存储到索引子系统后,获取刚存储的小文件的文件名哈希值,与之前存储在索引子系统中的多个索引文件中的文件名哈希值进行比对,确定索引子系统中是否存在与刚存储的小文件的文件名哈希值相同的小文件。
[0207](2)、当确定索引子系统中存在文件名哈希值相同的多个小文件时,为多个小文件建立索引链表。
[0208]其中,为多个小文件建立索引链表的过程包括:当索引文件子系统中存在与刚存储的小文件的文件名哈希值相同的多个小文件相对应的索引链表时,那么以刚存储的小文件的索引文件中的指针作为索引链表的头指针,指向上一个文件名哈希值相同的小文件的索引文件,从而对已有的索引链表进行更新;当索引文件子系统中不存在与刚存储的小文件的文件名哈希值相同的多个小文件相对应的索引链表时,以刚存储的小文件的索引文件中的指针作为索引链表的头指针,指向与它的文件名哈希值相同的小文件索引文件,生成具有相同文件名哈希值的多个小文件的索引链表。
[0209](3)、存储多个小文件对应的索引链表。
[0210]多个小文件具有相同文件名哈希值,是指多个小文件的索引文件中记录的文件名哈希值相同。
[0211]在比对文件名哈希值以形成索引链表的过程中,由于文件名的第一文件名哈希值的长度较短,容易出现哈希值相同的情况,所以,文件系统必须对文件名的第一文件名哈希值进行比对。而由于文件名的第二文件名哈希值的长度较长,不容易出现哈希值相同的情况,所以文件系统可以不对文件名的第一文件名哈希值进行比对,以减少文件系统的开销。
[0212]通过将文件名哈希值相同的索引文件形成索引链表,从而对索引子系统中存储的海量索引文件进行分类,再在这些具有相同第一文件名哈希值的索引文件中通过第二文件名哈希值进行小文件的查询,就可以快速的找出小文件,而无需对索引子系统中的所有索引文件进行查询,大大提高了查询小文件的效率。
[0213]索引子系统中存储有文件系统中存储的所有小文件的索引文件,索引子系统存储在文件系统的非易失性存储介质上,在文件系统所在的服务器掉电或异常关机时,保证了索引文件不会丢失。本实施例将索引子系统存储在文件系统的非易失性存储介质中,在文件系统启动时无须扫描全部小文件,仅仅通过扫描索引文件就可以完成快速建立索引的过程,而且,当文件系统想要查询小文件时,只需将索引子系统中存储的索引文件读取到内存中,就可以进行小文件的查询工作,方便快捷。
[0214]在内存不足或者索引子系统中存储的索引文件数量庞大而导致的索引文件读取速度慢时,为了能够及时的向用户返回查询小文件的结果,本实施例提出的小文件存储方法还包括以下步骤:
[0215]步骤212、获取小文件的索引文件在索引子系统中的位置信息。
[0216]小文件的索引文件在存储到索引子系统中后,文件系统就可以根据小文件的索引文件在索引子系统中的存储地址,得到小文件的索引文件在索引子系统中的位置信息。
[0217]步骤213、从小文件的文件名哈希值中取出预设位数的数字串,作为小文件的快速查询信息。
[0218]小文件的快速查询信息,可以是从第一文件名哈希值中取出的预设位数数字串;也可以是从第二文件名哈希值中取出的预设位数数字串。
[0219]小文件的快速查询信息,是计算得到的小文件的文件名哈希值数字串的一部分。具体从文件名哈希值中取出多少预设位数的数字串作为快速查询信息,文件系统的制造商可以在文件系统出厂之前进行设定,也可以由具有不同存储需求的用户根据文件系统中要存储的文件数量确定,增加了文件系统的实用性,方便了客户使用。
[0220]比如:文件系统的制造商可以预先设定从小文件的文件名哈希值中取出20位数字串作为小文件的快速查询信息。而用户要在文件系统中存储从1900年到现在的全世界的专利申请文件,可能会存储上亿个文档,由于存储的数据量较大,用户就可以设定从小文件的文件名哈希值中取出25位数字串,作为小文件的快速查询信息。但当用户要在文件系统中存储某个学校的期中期末考试试卷的文档时,那么,也就是在文件系统中存储几千个文档,由于存储的数据量相对较小,用户就可以设定从小文件的文件名哈希值中取出10位数字串,作为小文件的快速查询信息。
[0221]步骤214、将位置信息和快速查询信息在预设的快速查找表中进行关联存储。
[0222]通过步骤212至步骤214的描述,在索引子系统中的快速查找表中存储小文件的位置信息和快速查询信息的关联关系,在计算得到小文件的文件名哈希值后,可以在存储在磁盘中存储的快速查找表中查询目标文件,无需内存读取索引文件就可以直接给用户反馈查询结果,方便了用户使用。而且,从小文件的文件名哈希值中取出预设位数的数字串,作为快速查询信息,使得生成的快速查找表的文件很小,方便文件系统读取,进一步提高了文件系统对小文件的查询效率。
[0223]当小文件的索引文件已经存储到索引子系统中,并已经建立小文件的索引文件的位置信息和快速查询信息的关联关系,但由于系统异常未将已经建立的小文件索引文件的位置信息和快速查询信息的关联关系存储到快速查找表中时,本实施例可以通过查找快速查找表中的索引文件的最大偏移地址,那么从这个最大偏移地址开始的关联信息即为未同步到快速查找表中的数据。那么就将已经建立小文件的索引文件的位置信息和快速查询信息的关联关系同步到快速查找表中索引文件的最大偏移地址的位置处,完成了数据的断点恢复操作。
[0224]断点恢复的优势是:恢复速度快,因为恢复的数据只有最后一次同步时间到系统异常过程中的部分数据。
[0225]快速查找表的查询准确率与快速查找表中设定的快速查询信息的长度有关,快速查询信息的长度越长,那么快速查找表就越大,则查询准确率越高。同时,快速查找表会随着文件的写入而更新,为了保证数据的正确性,快速查找表的第一个和最后一个元素用于校验,保证整个表被同步到文件系统中。
[0226]参见图7,为本实施例中索引子系统和打包文件的索引示意图,其中,快速查找表、索引文件和打包文件的具体内容同上所述,这里不再赘述,由图7可以看出,通过简单的快速查找表、索引文件就可以确定小文件在打包文件中的位置,从而定位用户查询的文件系统中存储的小文件,提高了文件系统对小文件的查询效率。
[0227]通过以上描述,本实施例提供一种小文件存储方法,在将小文件存储到打包文件后,计算小文件的文件名的哈希值,并在小文件的索引文件中存储文件名哈希值,利用文件名哈希值替代现有技术中索引文件中存储的文件名,而哈希值是基于文件名的数字串,比文件名更简单,更适于后续文件查找过程中使用,这种索引文件的内容保障了后续文件查找的效率。
[0228]实施例3
[0229]对应于上述小文件存储方法,本实施例还提供一种小文件查询方法,用于文件系统,参见图8,该方法包括以下步骤:
[0230]步骤300、接收用户的小文件查询请求,小文件查询请求包括所述用户欲查询的小文件的文件名;其中,小文件包括文件大小小于预设阈值的文件。
[0231]用户发出的小文件查询请求中携带有小文件的属性信息,小文件的属性信息包括但不限于:小文件的文件名、数据长度和创建时间。所以文件系统在接收到小文件查询请求后,就可以从小文件的属性信息中获取到小文件的文件名。
[0232]步骤301、根据接收到的小文件的文件名,计算小文件的文件名哈希值。
[0233]文件名哈希值包括:第一文件名哈希值和第二文件名哈希值;第一文件名哈希值的长度小于第二文件名哈希值的长度。
[0234]文件系统根据预设的哈希算法对接收到的小文件的文件名进行哈希计算,计算小文件的文件名哈希值。
[0235]文件名哈希值可以是32比特、64比特或者128比特长度的数字串,替代现有的文件名,用于存储在小文件的索引文件中标识小文件。
[0236]由于第一哈希值的长度小于第二哈希值的长度,那么第一哈希值,可以是采用一致性哈希算法计算得到的32比特的哈希值;第二哈希值,可以是采用MD5 (Message DigestAlgorithm,消息摘要算法第五版)计算得到的128比特的哈希值;当然,第一哈希值和第二哈希值也可以是采用其他的哈希算法计算得到的哈希值,这里不再--赘述。
[0237]第一哈希值是32比特长度,所以有232种不同的情况,而第二哈希值是128比特长度,所以就有2128种不同的情况,所以,在文件系统中,索引文件中记录的第一文哈希值可能会出现相同的情况,而第二哈希值出现相同情况的概率较小。
[0238]步骤302、通过计算得到的文件名哈希值查询索引子系统中的索引文件,根据查询结果定位小文件的位置;其中,索引文件包括小文件的文件名对应的属性值和小文件的元数据,该属性值包括:文件名哈希值;该元数据包括小文件所在打包文件标识、小文件在打包文件中的位置信息和小文件的数据长度。
[0239]为了根据计算得到的文件名哈希值和文件系统的索引子系统,获取到小文件,步骤302具体包括:通过计算得到的文件名哈希值与索引子系统中存储的小文件的索引文件中记录的文件名哈希值进行对比,从而找出文件名哈希值对应的小文件的索引文件,根据找出的小文件的索引文件中记录的小文件的元数据,获取小文件。
[0240]小文件的元数据包括小文件所在打包文件标识、小文件在打包文件中的位置信息和小文件的数据长度。
[0241]在通过计算得到的文件名哈希值与索引子系统中存储的小文件的索引文件中记录的文件名哈希值进行对比的过程中,可能会找到多个与计算得到的文