碎片整理方法、装置及设备与流程

文档序号:12157657阅读:660来源:国知局
碎片整理方法、装置及设备与流程

本发明涉及数据存储技术领域,特别涉及一种碎片整理方法、装置及设备。



背景技术:

众所周知,磁盘在使用一段时间后,随着反复地文件写入和删除,磁盘中连续的空闲空间越来越小,从而使同一文件不能被整体存储在连续的空闲空间,而是被分散成多个碎片,保存到磁盘的不同空闲空间中。如图1所示,在大小为32KB和16KB的文件删除后,形成48KB的空闲时间,然而这48KB的空闲存储空间并不连续。如果要新写入大小为48KB的文件,则需将其拆分成2块,分别写入到两个空间中。这样,后续在读取这个48KB的文件时,便需要分别到两个不同的空间去读取。相较于到单个空间读取而言,增加了磁头的来回移动次数,致使读写性能急剧下降。时下为了避免上述情况的发生,一般均会对磁盘定期进行碎片整理。

现有技术在进行磁盘碎片整理时,文件系统会遍历由本地文件的元数据形成的B+树结构,在B+树结构中遍历到一个文件后,根据该文件所包含的每一个数据块所在chunk(分片)的有效数据占用率来判断是否进行磁盘碎片整理,如果需要进行磁盘碎片整理,则将该chunk中存储的数据块迁移至目标chunk,并将相应元数据中该数据块的位置信息进行更新。其中,B+树结构如图2所示,文件系统会为存储的每一个文件分配一个FID(File Identifier,文件标识),之后根据该FID将该文件的元数据插入B+树结构。在图2中Leve17用来保存文件的元数据,该元数据包括FID以及文件所包含的全部数据块的位置信息,其中数据块的位置信息指向Leve18中的数据块。而chunk是文件系统在进行空间分配时将磁盘按照固定大小划分出来的,比如4MB大小一个chunk。通常情况下,逻辑上两个连续的chunk,其在物理磁盘上位置也是相邻的。其中,文件系统在B+树结构中遍历到一个文件后,获取该文件所包含的每一个数据块所在chunk的有效数据占用率;如果一个数据块所在chunk的有效数据占用率低于预设门限(比如20%),则需进行磁盘碎片整理,具体整理过程可如图3所示。在图3中数据块1所在chunk的有效数据占用率低于预设门限,则将数据块1写入目标chunk,然后对数据块1的位置信息进行更新;对于数据块2,其所在chunk的有效数据占用率高于预设门限,则不需进行整理。这样假设在进行整理前仅有图4所示的一个空闲的chunk,在通过上述方式进行整理将磁盘碎片集中到一个chunk后,便有三个空闲的chunk。

现有技术至少存在以下问题:

上述碎片整理方法需要遍历整个元数据的B+树结构,当磁盘占用率高时,这种整理方式的效率很低。比如对于一个4T磁盘来讲,假设文件大小平均为32KB,则这个磁盘可写入12万个小文件;如果仅有1千个小文件需要进行迁移,即存储这1千个小文件的至少一个chunk的有效数据占用率低于预设门限,则在迁移这1千个文件时,由于若直接遍历上述至少一个chunk并进行迁移,无法获取这1千个小文件的元数据信息,进而对元数据信息进行更新,因此还需要采取遍历整个元数据的B+树结构的方式,读取全部12万小文件的元数据,以逐个小文件进行判断并处理,致使上述碎片整理方式较为繁琐和复杂,会消耗大量时间。



技术实现要素:

本发明实施例提供了一种碎片整理方法、装置及设备。所述技术方案如下:

第一方面,提供了一种碎片整理方法,所述方法包括:

获取存储器中chunk的有效数据占用率,所述chunk中存储有数据块及所述数据块的元数据索引;

若所述chunk的有效数据占用率低于预设门限,则获取所述数据块的元数据索引,其中,所述元数据索引中,包括所述数据块所属文件的FID和所述数据块的原位置信息;

在根据所述数据块的原位置信息确定所述数据块为有效数据块后,将所述数据块作为待迁移的数据块,为所述数据块分配目标chunk,将所述数据块迁移至所述目标chunk;

根据所述FID,查找所述数据块所属文件的元数据信息,将所述元数据信息中包含的所述数据块迁移前的所述原位置信息更新为所述数据块迁移后的目的位置信息。

在第一方面的第一种可能的实现方式中,在将所述数据块迁移至目标chunk中后,还会在目标chunk中写入所述数据块的元数据索引,以便后续过程中当目标chunk的有效数据占用率低于预设门限时,方便根据写入在目标chunk中的元数据索引再次在数据块迁移后对上述元数据信息进行更新,详细过程如下:

将所述目的位置信息以及所述FID作为所述数据块的元数据索引写入所述目标chunk中。更进一步地,基于TLV(Type Length Value,类型长度值)格式,在所述目标chunk中写入所述目的位置信息以及所述FID,得到所述数据块的元数据索引,其中,所述目的位置信息包括所述数据块的长度值、以及所述数据块迁移后的目的存储地址。

结合第一方面,在第一方面的第二种可能的实现方式中,所述获取存储器中分片chunk的有效数据占用率之前,所述方法还包括:

为所述chunk设置一个位图文件,所述位图文件中的每一个数值位用于标识所述chunk中对应空间的被占用情况;

其中,当所述位图文件中一个数值位的取值为第一常数时,表征所述数值位指示的空间已被有效数据占用;当所述位图文件中一个数值位的取值为第二常数时,表征所述数值位指示的空间未被有效数据占用。

结合第一方面的第二种可能的实现方式,在第一方面的第三种可能的实现方式中,所述获取存储器中分片chunk的有效数据占用率,包括:

统计所述位图文件中取值为所述第一常数的数值位个数;

获取所述位图文件中数值位总个数;

计算所述取值为所述第一常数的数值位个数与所述数值位总个数之间的比值,得到所述chunk的有效数据占用率。

结合第一方面的第二种可能的实现方式,在第一方面的第四种可能的实现方式中,所述原位置信息中包括所述数据块迁移前的原存储地址和所述数据块的长度值,所述方法还包括:

根据所述原存储地址和所述长度值,在所述chunk的位图文件中确定所述数据块占用空间对应的至少一个数值位;

若所述至少一个数值位中每一个数值位的取值均为所述第一常数,则确定所述数据块为有效数据块。

结合第二种至第四种可能的实现方式,在第一方面的第五种可能的实现方式中,所述方法还包括:

若所述chunk的有效数据占用率低于预设门限,则在将所述chunk中每一个有效数据块均写入分配的对应目标chunk后,分别将所述chunk的位图文件中每一个数值位赋值为所述第二常数。

结合第一方面,在第一方面的第六种可能的实现方式中,所述根据所述文件标识,查找所述数据块所属文件的元数据信息,包括:

在元数据树结构中查找存储有所述FID的元数据节点,所述元数据节点中存储了所述数据块所属文件的元数据信息,所述元数据信息中至少包括所述文件的FID和所述文件包含的每一个数据块的位置信息;

其中,所述元数据树结构中以元数据节点形式记录了本地存储的全部文件的元数据信息。

第二方面,提供了一种碎片整理装置,所述装置包括:

第一获取模块,用于获取存储器中chunk的有效数据占用率,所述chunk中存储有数据块及所述数据块的元数据索引;

第二获取模块,用于若所述chunk的有效数据占用率低于预设门限,则获取所述数据块的元数据索引,其中,所述元数据索引中,包括所述数据块所属文件的FID和所述数据块的原位置信息;

分配模块,用于在根据所述数据块的原位置信息确定所述数据块为有效数据块后,将所述数据块作为待迁移的数据块,为所述数据块分配目标chunk,将所述数据块迁移至所述目标chunk;

查找模块,用于根据所述FID,查找所述数据块所属文件的元数据信息;

更新模块,用于将所述元数据信息中包含的所述数据块迁移前的所述原位置信息更新为所述数据块迁移后的目的位置信息。

在第二方面的第一种可能的实现方式中,所述装置还包括:

写入模块,用于基于TLV格式,在所述目标chunk中写入所述目的位置信息以及所述FID,得到所述数据块的元数据索引,其中,所述目的位置信息包括所述数据块的长度值、以及所述数据块迁移后的目的存储地址。

结合第二方面,在第二方面的第二种可能的实现方式中,所述装置还包括:

设置模块,用于为所述chunk设置一个位图文件,所述位图文件中的每一个数值位用于标识所述chunk中对应空间的被占用情况;

其中,当所述位图文件中一个数值位的取值为第一常数时,表征所述数值位指示的空间已被有效数据占用;当所述位图文件中一个数值位的取值为第二常数时,表征所述数值位指示的空间未被有效数据占用。

结合第二方面的第二种可能的实现方式,在第二方面的第三种可能的实现方式中,所述第一获取模块,用于统计所述位图文件中取值为所述第一常数的数值位个数;获取所述位图文件中数值位总个数;计算所述取值为所述第一常数的数值位个数与所述数值位总个数之间的比值,得到所述chunk的有效数据占用率。

结合第二方面的第二种可能的实现方式,在第二方面的第四种可能的实现方式中,所述原位置信息中包括所述数据块迁移前的原存储地址和所述数据块的长度值,所述装置还包括:

确定模块,用于根据所述原存储地址和所述长度值,在所述chunk的位图文件中确定所述数据块占用空间对应的至少一个数值位;若所述至少一个数值位中每一个数值位的取值均为所述第一常数,则确定所述数据块为有效数据块。

结合第二种至第四种可能的实现方式,在第二方面的第五种可能的实现方式中,所述装置还包括:

赋值模块,用于若所述chunk的有效数据占用率低于预设门限,则在将所述chunk中每一个有效数据块均写入分配的对应目标chunk后,分别将所述chunk的位图文件中每一个数值位赋值为所述第二常数。

结合第二方面,在第二方面的第六种可能的实现方式中,所述查找模块,用于在元数据树结构中查找存储有所述FID的元数据节点,所述元数据节点中存储了所述数据块所属文件的元数据信息,所述元数据信息中至少包括所述文件的FID和所述文件包含的每一个数据块的位置信息;

其中,所述元数据树结构中以元数据节点形式记录了本地存储的全部文件的元数据信息。

第三方面,提供了一种碎片整理设备,所述设备包括:内存和处理器,所述内存存储有程序代码,所述处理器用于调用所述程序代码,执行以下操作:

获取存储器中chunk的有效数据占用率,所述chunk中存储有数据块及所述数据块的元数据索引;

若所述chunk的有效数据占用率低于预设门限,则获取所述数据块的元数据索引,其中,所述元数据索引中,包括所述数据块所属文件的FID和所述数据块的原位置信息;

在根据所述数据块的原位置信息确定所述数据块为有效数据块后,将所述数据块作为待迁移的数据块,为所述数据块分配目标chunk,将所述数据块迁移至所述目标chunk;

根据所述FID,查找所述数据块所属文件的元数据信息,将所述元数据信息中包含的所述数据块迁移前的所述原位置信息更新为所述数据块迁移后的目的位置信息。

本发明实施例提供的技术方案带来的有益效果是:

在向chunk写入数据时,同时会写入数据块的元数据索引,这样在进行磁盘碎片整理时,若一个chunk的有效数据占用率小于预设门限,则在对该chunk中存储的数据块进行整理时,基于写入的元数据索引可快速将数据块迁移至目标chunk和迅速锁定数据块所属文件对应的元数据信息,这样根据写入在chunk中的元数据索引作为关键字,可直接在存储的海量元数据信息中快速查询到这个数据块的元数据信息,进而将该元数据信息中该数据块的位置信息进行更新,实现了无需遍历过程便可对元数据信息中数据块的位置信息进行修改的目的,上述磁盘碎片整理方式操作方便,大大节约了时间,提升了整理效率。

附图说明

为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1是本发明背景技术提供的一种磁盘空间的示意图;

图2是本发明背景技术提供的一种元数据树结构的示意图;

图3是本发明背景技术提供的一种元数据树结构的示意图;

图4是本发明背景技术提供的一种磁盘空间的示意图;

图5是本发明实施例提供的一种元数据索引的存储示意图;

图6是本发明实施例提供的一种元数据索引的组成示意图;

图7是本发明实施例提供的一种碎片整理设备的结构示意图;

图8是本发明实施例提供的一种碎片整理方法的流程图;

图9是本发明实施例提供的一种碎片整理装置的结构示意图。

具体实施方式

下面将结合附图对本发明实施方式作进一步地详细描述。

在对本发明实施例进行详细地解释说明之前,先对本发明实施例后续过程中可能涉及到的一些名词进行解释。

chunk(分片),在本发明实例中,文件系统在进行空间分配时会将磁盘按照固定大小(比如4MB大小)来划分,即一个4MB大小的空间称之为一个chunk。即,磁盘在逻辑上划分成chunk,chunk可以存储数据块,chunk中的位置用逻辑地址描述。逻辑地址和物理地址对应,因此,逻辑地址相邻的数据块,在写入磁盘后,物理地址也是相邻的。

元数据索引,也称之为反向索引,本发明实施例在向一个chunk写入数据时,同时还会写入元数据索引。其中,元数据索引中至少包括数据块所属文件的FID、以及该数据块的位置信息。其中,该位置信息可包括该数据块的存储地址、以及该数据块的长度值。需要说明的是,此处的存储地址指代该数据块的起始存储地址。当然,上述位置信息除了采取数据块的存储地址结合数据块的长度值这种形式外,还可采取起始存储地址结合终止存储地址的方式,本发明实施例对此不进行具体限定。本发明实施例仅以存储地址结合长度值的方式进行举例说明。

当一个文件较大时,通常情况下在存储该文件时,会将该文件切分为多个部分分别存储到多个不同的chunk中。切分得到的多个部分可分别作为一个数据块存储在多个不同的chunk中。其中,一个文件包含的各个数据块可大小一致,也可不一致,本发明实施例对此不进行具体限定。

此外,在本发明实施例中,每一个数据块均对应一个原位置信息和目的位置信息。其中,该数据块迁移前的原存储地址和该数据块的长度值统称为该数据块的原位置信息。上述提及的原存储地址指代该数据块在迁移前存储在原始chunk时的存储地址。同理,将该数据块迁移后的目的存储地址和该数据块的长度值统称为该数据块的目的位置信息。目的存储地址指代该数据块在迁移后存储在目标chunk时的存储地址。本发明实施例仅以原存储地址和目的存储地址、原位置信息和目的位置信息的方式,对数据块在进行迁移前后的存储位置进行区分。

对于一个chunk中的各个数据块,在对各个数据块的元数据索引进行存储时,可采取下述几种方式实现:在各个数据块之前存储对应的元数据索引,或者,在各个数据块之后存储对应的元数据索引,或者,将各个数据块的元数据索引统一存储在该chunk的头部,或者,将各个数据块的元数据索引统一存储在该chunk的尾部。举例来说,图5示出了元数据索引在chunk中的一种存储方式。如图5所示,在chunk中写入元数据索引时,可在每一个数据块的前面存储位置分别写入对应的元数据索引,也即在每一个数据块的起始存储位置处写入每一个数据块的元数据索引。比如,在图5中数据块1的元数据索引便写在该chunk中的起始位置处。其中,FID是非负整数。打开文件或新建文件时,内核均会返回一个文件标识。读写文件也需要使用文件标识来指定待读写的文件。

在本发明实施例中,可以将元数据索引集中写在一个chunk的头部或尾部是因为一个数据块的元数据索引通常仅有几十字节大小,远远低于硬盘的最小扇区大小,一般情况下最小扇区为512字节大小或者4096字节大小。所以为了避免一个扇区仅写入一个元数据索引,进而造成空间浪费,本发明实施例将多个数据块的元数据索引进行合并,例如按照图6所示将2个数据块的元数据索引进行合并。其中,元数据索引的存储采用TLV(Type Length Value,类型长度值)格式。

由于硬盘在使用一段时间后,随着反复地文件写入和删除,空闲空间越来越小且常常不连续,容易形成碎片,因此此时需要进行碎片整理。其中,碎片整理过程常常会涉及到数据块的迁移,也即对于有效数据占用率小于预设门限的chunk来说,会将该chunk中存储的数据块进行迁移。在本发明实施例中,由于将每一个数据块的元数据索引均写入到了chunk中,所以在进行磁盘碎片整理时,若一个chunk的有效数据占用率低于预设门限,则在迁移该chunk存储的数据块时,直接根据每一个数据块的元数据索引便可以在图2所示的元数据树结构(B+树结构)中快速查找到对应的元数据节点,并将该元数据节点中存储的该数据块的原存储地址修改为迁移后的目的存储地址。其中,该元数据节点中存储了该数据块所属文件的FID和该文件包含的全部数据块的位置信息。这样在进行磁盘碎片整理时,无需遍历整个元数据树结构,提升了碎片整理效率。

图7是本发明实施例提供的一种碎片整理设备的结构示意图。参见图7,该设备包括内存701和处理器702,内存701存储有程序代码,处理器702用于调用程序代码,执行以下操作:

获取存储器中chunk的有效数据占用率,所述chunk中存储有数据块及所述数据块的元数据索引;

若所述chunk的有效数据占用率低于预设门限,则获取所述数据块的元数据索引,其中,所述元数据索引中,包括所述数据块所属文件的FID和所述数据块的原位置信息;

在根据所述数据块的原位置信息确定所述数据块为有效数据块后,将所述数据块作为待迁移的数据块,为所述数据块分配目标chunk,将所述数据块迁移至所述目标chunk;

根据所述FID,查找所述数据块所属文件的元数据信息,将所述元数据信息中包含的所述数据块迁移前的所述原位置信息更新为所述数据块迁移后的目的位置信息。

在另一个实施例中,处理器702用于调用程序代码,执行以下操作:

基于类型长度值TLV格式,在所述目标chunk中写入所述目的位置信息以及所述FID,得到所述数据块的元数据索引,其中,所述目的位置信息包括所述数据块的长度值、以及所述数据块迁移后的目的存储地址。

在另一个实施例中,处理器702用于调用程序代码,执行以下操作:

为所述chunk设置一个位图文件,所述位图文件中的每一个数值位用于标识所述chunk中对应空间的被占用情况;

其中,当所述位图文件中一个数值位的取值为第一常数时,表征所述数值位指示的空间已被有效数据占用;当所述位图文件中一个数值位的取值为第二常数时,表征所述数值位指示的空间未被有效数据占用。

在另一个实施例中,处理器702用于调用程序代码,执行以下操作:

统计所述位图文件中取值为所述第一常数的数值位个数;

获取所述位图文件中数值位总个数;

计算所述取值为所述第一常数的数值位个数与所述数值位总个数之间的比值,得到所述chunk的有效数据占用率。

在另一个实施例中,处理器702用于调用程序代码,执行以下操作:

根据所述原存储地址和所述长度值,在所述chunk的位图文件中确定所述数据块占用空间对应的至少一个数值位;

若所述至少一个数值位中每一个数值位的取值均为所述第一常数,则确定所述数据块为有效数据块。

在另一个实施例中,处理器702用于调用程序代码,执行以下操作:

若所述chunk的有效数据占用率低于预设门限,则在将所述chunk中每一个有效数据块均写入分配的对应目标chunk后,分别将所述chunk的位图文件中每一个数值位赋值为所述第二常数。

在另一个实施例中,处理器702用于调用程序代码,执行以下操作:

在元数据树结构中查找存储有所述FID的元数据节点,所述元数据节点中存储了所述数据块所属文件的元数据信息,所述元数据信息中至少包括所述文件的FID和所述文件包含的每一个数据块的位置信息;

其中,所述元数据树结构中以元数据节点形式记录了本地存储的全部文件的元数据信息。

本发明实施例提供的设备,在向chunk写入数据时,同时会写入数据块的元数据索引,这样在进行磁盘碎片整理时,若一个chunk的有效数据占用率小于预设门限,则在对该chunk中存储的数据块进行整理时,基于写入的元数据索引可快速将数据块迁移至目标chunk和迅速锁定数据块所属文件对应的元数据信息,这样根据写入在chunk中的元数据索引作为关键字,可直接在存储的海量元数据信息中快速查询到这个数据块的元数据信息,进而将该元数据信息中该数据块的位置信息进行更新,实现了无需遍历过程便可对元数据信息中数据块的位置信息进行修改的目的,上述磁盘碎片整理方式操作方便,大大节约了时间,提升了整理效率。

图8是本发明实施例提供的一种碎片整理方法的流程图。参见图8,本发明实施例提供的方法流程包括:

801、周期性获取存储器中每一个chunk的有效数据占用率。

在本发明实施例中,硬盘的空间管理一般采用bitmap(位图文件)来标识chunk中的哪些空间被占用。一个chunk的有效数据占用率,指代该chunk中当前用于存储有效数据的空间占该chunk中全部空间的比例。其中,有效数据是相对于无效数据而言的。无效数据指代那些已经删除或者迁移,但却还在占用chunk的存储空间,未进行空间释放的数据。以每4KB的空间大小使用一个bit为例,则一个4MB大小的chunk需要128字节用于空间管理。遍历每个chunk的128字节bitmap,便可以计算每个chunk的有效数据占用率,详细过程如下。

文件系统会为每一个chunk均设置一个位图文件,该位图文件中的每一个数值位用于标识chunk中对应空间的被占用情况。也即,前4KB的空间占用情况用该空间字符串中的第一个数值位标识,紧接着下4KB的空间占用情况同样用该空间字符串中的第二个数值位标识,依次类推,最后4KB的空间占用情况用该空间字符串中的第128*8个数值位标识。其中,当一个数值位的取值为第一常数(通常取值为1)时,表征该数值位指示的chunk空间已被有效数据占用;当一个数值位的取值为第二常数(通常取值为0)时,表征该数值位指示的chunk空间未被有效数据占用。综上,在周期性获取每一个chunk的有效数据占用率时,通常采取下述方式实现:

第一步、对于每一个chunk,文件系统会每隔预设时长统计一次该位图文件中取值为1的数值位个数。

其中,预设时长的大小可为10s、20s或其他数值等,本发明实施例对预设时长的大小不进行具体限定。

第二步、获取该位图文件中数值位总个数。

在本发明实施例中以每4KB的空间大小使用一个bit,每一个chunk的大小为4MB为例,则一个位图文件中数值位总个数为128*8。

第三步、计算取值为1的数值位个数与数值位总个数之间的比值,得到该chunk的有效数据占用率。

以取值为1的数值位个数为64*8为例,则该chunk的有效数据占用率为64/128=50%。

802、判断每一个chunk的有效数据占用率是否低于预设门限;若一个chunk的有效数据占用率低于预设门限,则执行下述步骤803;若一个chunk的有效数据占用率高于预设门限,则对该chunk的处理流程至此结束。

其中,预设门限的大小可为10%或20%等,本发明实施例对预设门限的大小不进行具体限定。在得到每一个chunk的有效数据占用率后,将其与上述预设门限进行比对,便可以得到有效数据占用率低于预设门限的全部chunk。对于一个chunk来说,若其有效数据占用率小于预设门限,则证明该chunk中的空闲空间要远远大于被占用空间。这样若存在多个有效数据占用率均小于预设门限的chunk,则会在硬盘上形成很多不连续的空闲空间。为此需要进行碎片整理,以将磁盘碎片集中到一起,从而使得硬盘中的空闲空间尽可能连续,详细过程参见下述步骤803。

803、若一个chunk的有效数据占用率低于预设门限,则获取该chunk中的每一个数据块以及每一个数据块的元数据索引。

其中,该元数据索引中至少包括该数据块所属文件的文件标识、该数据块在该chunk中进行存储时的原存储地址以及该数据块的长度值。在本发明实施例中,将该数据块的原存储地址和该数据块的长度值统称为该数据块的原位置信息。其中,一个文件通常包括多个数据块。

在本发明实施例中,若元数据索引集中存储在chunk的头部,则在从chunk头部解析到每一个数据块的元数据索引后,首先根据得到的元数据索引和上述步骤801中提及的位图文件来判断每一个数据块是否为有效数据块。判断一个数据块是否为有效数据块的宗旨便是判断用于存储该数据块的存储空间当前是否被占用;若存储该数据块的存储空间当前被占用,则表明该数据块为有效数据块。其中,存储空间的占用情况,可以通过位图文件中对应数值位的取值来确定,详细过程如下:

对于该chunk中的每一个数据块,根据该数据块的原存储地址和长度值,在该chunk的位图文件中确定该数据块占用空间对应的至少一个数值位;若该至少一个数值位中每一个数值位的取值均为1,则确定该数据块为有效数据块。若该至少一个数值位中存在取值为0的数值位,则确定该数据块为已经释放的数据块。

举例来说,以数据块的原存储地址为chunk中8KB的存储位置,数据块的长度值为24KB为例,则该数据块在该chunk中的占用空间为8KB至32KB的存储位置,该占用空间对应位图文件中第3个数值位至第8个数值位。若第3个数值位至第8个数值位这5个数值位每一个的取值都为1,则证明该数据块为有效数据块;否则,证明该数据块为已经释放的数据块。

需要说明的是,引入元数据索引后,在删除数据块中存储的数据时并不需要修改该数据块的元数据索引,仅需修改位图文件中对应数值位的取值即可,所以删除处理同未引入元数据索引之前的处理方式相同。

804、对于该chunk中的一个有效数据块,为该有效数据块分配目标chunk,并将该数据块写入该目标chunk,同时在该目标chunk中写入该数据块的元数据索引。

在本发明实施例中,在为数据块分配目标chunk时可从空闲chunk中选取,也可以从当前有效数据占用率大于预设门限的chunk中选取,本发明实施例对此不进行具体限定。在进行有效数据块的迁移时,可将多个有效数据块迁移到一个chunk中,也即各个有效数据块之间目标chunk可相同,也可迁移到不同的chunk中。比如,将多个有效数据块均迁移到一个空闲chunk中。在将多个有效数据块迁移完毕后,需要统计一下这个chunk当前的有效数据占用率;若当前的有效数据占用率低于预设门限,则还需再将存储在这个chunk中的数据块进行迁移。

针对迁移到空闲chunk的情况,在一个数据块进行迁移后,可并不立即进行有效数据占用率的统计,而是等待一段时间后若还未有其他数据块写入,则再进行有效数据占用率的统计。举例来说,在一段时间内若不停地有数据块写入一个原本空闲的chunk中,则每一次写入数据块后均进行计时,若在设定的计时周期内未再有数据块写入,则进行有效数据占用率的统计。

每一次在新写入数据块后,目标chunk的当前写入位置均要向后偏移,直至该目标chunk写满为止。此外,在将该数据块写入到新分配的目标chunk时,同时也会将该数据块的元数据索引写入到目标chunk中。

需要说明的是,此时元数据索引中该数据块的地址应为该数据块迁移后的目的存储地址。需要说明的是,本发明实施例中提及的原存储地址与该数据块迁移前的chunk地址相关,比如迁移前chunk地址为4MB的存储位置,该数据块在该chunk中的偏移量为1MB,则该数据块的原存储地址为5MB的存储位置。目的存储地址同样与该数据块迁移之后的chunk地址相关,比如迁移之后chunk地址为8MB的存储位置,该数据块在该chunk中的偏移量同样为1MB,则该数据块的目的存储地址为9MB的存储位置。

也即,文件系统会获取该数据块的长度值、目的存储地址以及文件标识;基于TLV格式,将该长度值、目的存储地址以及文件标识写入在目标chunk中,完成该数据块的元数据索引在目标chunk中的写入过程。

805、根据该数据块所属文件的文件标识,查找该数据块所属文件的元数据信息,将该元数据信息中包含的该数据块的原位置信息更新为该数据块在该目标chunk中存储时的目的位置信息。

在本发明实施例中,会使用图2所示的元数据树结构来保存文件的元数据信息。元数据树结构中以元数据节点形式记录了本地存储的全部文件的元数据信息。其中,本地存储的一个文件可能包括多个数据块,而各个数据块可能存储在不同的chunk中。一个文件的元数据节点中会存储该文件的元数据信息,其中元数据信息中至少包括该文件的文件标识和该文件包含的每一个数据块的位置信息。由于在将数据块进行迁移之后,元数据树结构中存储的还是该数据块迁移前的位置信息,因此需要对该数据块的位置信息进行更新,为此需先根据该数据块所属文件的文件标识,在元数据树结构中锁定存储该文件的元数据信息的元数据节点,之后将该数据块在迁移前的原位置信息更新为该数据块在目标chunk中存储时的目的位置信息。由于本发明实施例是采取数据块的存储地址和数据块的长度值方式来标识位置信息,而在迁移前后数据块的长度值是不会改变的,因此实质上是对存储地址进行更新,也即将数据块迁移前的原存储地址更新为迁移后的目的存储地址。

对于一个chunk来说,可以重复执行上述步骤802至步骤805,直至该chunk中的全部有效数据块均写入新的chunk为止。需要说明的是,在将一个chunk中每一个有效数据块均写入分配的对应目标chunk后,分别将该chunk的位图文件中每一个数值位赋值为0,表明该chunk当前为一个空闲chunk。

本发明实施例提供的方法,在向chunk写入数据时,同时会写入数据块的元数据索引,这样在进行磁盘碎片整理时,若一个chunk的有效数据占用率小于预设门限,则在对该chunk中存储的数据块进行整理时,基于写入的元数据索引可快速将数据块迁移至目标chunk和迅速锁定数据块所属文件对应的元数据信息,这样根据写入在chunk中的元数据索引作为关键字,可直接在存储的海量元数据信息中快速查询到这个数据块的元数据信息,进而将该元数据信息中该数据块的位置信息进行更新,实现了无需遍历整个元数据树结构便可对元数据信息中数据块的位置信息进行修改的目的,上述磁盘碎片整理方式操作方便,大大节约了时间,提升了整理效率。

参见图9,本发明实施例提供了一种碎片整理装置,该装置包括:

第一获取模块901,用于获取存储器中chunk的有效数据占用率,所述chunk中存储有数据块及所述数据块的元数据索引;

第二获取模块902,用于若所述chunk的有效数据占用率低于预设门限,则获取所述数据块的元数据索引,其中,所述元数据索引中,包括所述数据块所属文件的FID和所述数据块的原位置信息;

分配模块903,用于在根据所述数据块的原位置信息确定所述数据块为有效数据块后,将所述数据块作为待迁移的数据块,为所述数据块分配目标chunk,将所述数据块迁移至所述目标chunk;

查找模块904,用于根据所述FID,查找所述数据块所属文件的元数据信息;

更新模块905,用于将所述元数据信息中包含的所述数据块迁移前的所述原位置信息更新为所述数据块迁移后的目的位置信息。

在另一个实施例中,该装置还包括:

写入模块906,用于基于类型长度值TLV格式,在所述目标chunk中写入所述目的位置信息以及所述FID,得到所述数据块的元数据索引,其中,所述目的位置信息包括所述数据块的长度值、以及所述数据块迁移后的目的存储地址。

在另一个实施例中,该装置还包括:

设置模块907,用于为所述chunk设置一个位图文件,所述位图文件中的每一个数值位用于标识所述chunk中对应空间的被占用情况;

其中,当所述位图文件中一个数值位的取值为第一常数时,表征所述数值位指示的空间已被有效数据占用;当所述位图文件中一个数值位的取值为第二常数时,表征所述数值位指示的空间未被有效数据占用。

在另一个实施例中,所述第一获取模块901,用于统计所述位图文件中取值为所述第一常数的数值位个数;获取所述位图文件中数值位总个数;计算所述取值为所述第一常数的数值位个数与所述数值位总个数之间的比值,得到所述chunk的有效数据占用率。

在另一个实施例中,所述原位置信息中包括所述数据块迁移前的原存储地址和所述数据块的长度值,该装置还包括:

确定模块908,用于根据所述原存储地址和所述长度值,在所述chunk的位图文件中确定所述数据块占用空间对应的至少一个数值位;若所述至少一个数值位中每一个数值位的取值均为所述第一常数,则确定所述数据块为有效数据块。

在另一个实施例中,该装置还包括:

赋值模块909,用于若所述chunk的有效数据占用率低于预设门限,则在将所述chunk中每一个有效数据块均写入分配的对应目标chunk后,分别将所述chunk的位图文件中每一个数值位赋值为所述第二常数。

在另一个实施例中,所述查找模块904,用于在元数据树结构中查找存储有所述FID的元数据节点,所述元数据节点中存储了所述数据块所属文件的元数据信息,所述元数据信息中至少包括所述文件的FID和所述文件包含的每一个数据块的位置信息;

其中,所述元数据树结构中以元数据节点形式记录了本地存储的全部文件的元数据信息。

本发明实施例提供的装置,在向chunk写入数据时,同时会写入数据块的元数据索引,这样在进行磁盘碎片整理时,若一个chunk的有效数据占用率小于预设门限,则在对该chunk中存储的数据块进行整理时,基于写入的元数据索引可快速将数据块迁移至目标chunk和迅速锁定数据块所属文件对应的元数据信息,这样根据写入在chunk中的元数据索引作为关键字,可直接在存储的海量元数据信息中快速查询到这个数据块的元数据信息,进而将该元数据信息中该数据块的位置信息进行更新,实现了无需遍历整个元数据树结构便可对元数据信息中数据块的位置信息进行修改的目的,上述磁盘碎片整理方式操作方便,大大节约了时间,提升了整理效率。

需要说明的是:上述实施例提供的碎片整理装置在进行碎片整理时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的碎片整理装置与碎片整理方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。

本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。

以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1