一种结合引用引用时间图和容器位表的垃圾回收方法与流程

文档序号:12304879阅读:192来源:国知局
一种结合引用引用时间图和容器位表的垃圾回收方法与流程

本发明属于计算机信息存储技术领域,具体涉及一种针对备份系统中基于数据重复数据删除技术的垃圾回收方法。该方法使用两个数据结构引用时间图和容器位表。引用时间图保存每个数据块的最新引用版本号,容器位表记录每个数据容器相对于上一个备份版本的引用状态。在回收阶段通过引用时间图和容器位表生成最终的引用时间图进行回收。与已有的方法不同的是,该方法在回收阶段,并不需要访问备份数据的元数据,而用备份阶段得到的引用时间图和容器位表就可以进行回收,以相对较低的空间代价来大幅提高垃圾回收处理速度。此外,在多次数据备份中,本垃圾回收方法需要增加的空间开销非常小。



背景技术:

在重复数据删除系统的垃圾回收中,如何在保证垃圾回收性能的前提下有效控制垃圾回收的时间开销和空间开销一直是个备受关注的问题。用户一般会为备份数据设置一个保留时间,过时的数据应该被回收再利用。但是在重复数据删除系统中,垃圾回收变得复杂,因为每个数据块都可能被多个备份流所引用。回收的时候需要额外的元数据来跟踪数据被引用的次数,或者大量的读取备份数据的元数据来判断可以回收的数据块,这增大了垃圾回收的回收难度。

常见的垃圾回收方法主要包括引用计数、标记回收、组标记回收方法。引用计数是对每个数据块维持一个引用计数值,对数据块进行备份和删除分别会对相应计数值进行加减操作,当计数值变成0,数据块就可以被回收。引用计数的缺点是可靠性差,存在计数值的重复更新导致的计数值不正确问题。标记回收方法需要扫描所有的文件谱然后扫描指纹索引,标记那些不在文件谱中出现而在指纹索引中出现的数据块,在空闲的时间统一进行回收。标记回收的优点是元数据少,缺点是标记时间太长。组标记回收是标记回收的改进方法,它在标记回收的基础上使用大量的元数据来保存每个备份版本的位图,回收的时候不用扫描文件谱,缺点是元数据量太大。

针对已有解决方案的问题,本发明提出一种结合引用引用时间图和容器位表的垃圾回收方法,用于提高基于重复数据删除技术的备份系统中垃圾数据的回收性能。与已有的方法不同的是,该方法在回收阶段,并不需要访问备份数据的元数据,而用已有的引用时间图和容器位表进行回收。该方法以相对较低的空间代价来大幅度提高垃圾回收处理速度。此外,在多次数据备份中,本垃圾回收方法需要增加的空间开销非常小。



技术实现要素:

本发明提出一种垃圾回收方法,用于提高基于重复数据删除技术的备份系统中垃圾数据的回收性能。该方法记录每个数据块的最新引用版本和每个数据容器相对于上一个备份版本的引用状态,分别称为引用时间图和容器位表。通过引用时间图和容器位表生成最终的引用时间图进行回收。与已有的方法不同的是,该方法在回收阶段,并不需要访问备份数据的元数据,而是用已有的引用时间图和容器位表就可以进行回收,以相对较低的空间代价来大幅度提高垃圾回收处理速度。此外,在多次数据备份中,本垃圾回收方法需要增加的空间开销非常小。

本发明提出的垃圾回收方法,主要包括四个模块:数据去重模块,引用时间图模块,容器位表模块以及回收模块。数据去重模块主要是对备份数据集采用分块算法进行划分,并采用哈希函数计算数据块的指纹值,并对整个备份数据集的数据块指纹进行管理,该模块维护一个指纹索引表用于判断数据块是否为重复的数据块。

在容器位表模块中,维持一个当前版本数据容器相对之前版本的引用状况位图。对于去重模块中的数据块,根据其引用状态得到数据容器相对之前版本容器的引用情况,如果是完全引用,用11表示;如果是部分引用,用10表示;如果是新增引用,用01表示;如果是完全不引用,用00表示。生成完容器位表之后,将其存储到磁盘。

引用时间图模块中,对每一个数据块都维持一个数据块最新引用版本号。根据去重模块中的得到的数据块的重复情况执行不同的更新操作。如果是新的数据块,就直接添加到引用时间图的尾部,并且数据块的最新引用时间为当前版本号。如果是完全引用,为了减少对备份性能的影响,在备份阶段暂不处理引用时间图;如果是部分引用,在引用时间图中,被引用数据块对应的引用时间更新为当前版本。如果是完全不引用,则不需要修改引用时间图。更新完引用时间图后,将其存储到磁盘。

在回收模块中,根据用户指定的回收版本和回收方式,执行不同的操作。首先从磁盘读取引用时间图和容器位表。根据最新容器位表的状态对引用时间图做更新。生成实际的引用时间图如果容器对应的标志位为11,表示完全引用,则对容器内所有的数据块的最新引用时间更改为当前版本。如果是01或者10,分别表示新增引用和部分引用,因为在备份过程中已经更新,所以不需要对引用时间图进行修改。如果为00,表示当前版本没有引用,则递归查找之前备份版本容器位表中对应位置的容器位表状态标识,直到找到对应容器位表为非00的状态,完成相应数据容器对应的引用时间图更新。根据用户给定的回收方法,如果是单个版本回收方法,首先由回收版本t之前的所有容器位表进行或操作得到一个合并的容器位表,如果数据容器在合并后的容器位表中为00状态,表明这个容器在之前所有备份版本中都没有被引用。然后遍历生成的实际的引用时间图。回收该数据容器中引用时间为t的数据块。如果是批量回收,则引用时间小于等于t的所有数据块都可以被回收。

本发明主要分成主要分为备份阶段与垃圾回收相关的数据预处理过程和垃圾回收阶段的垃圾回收过程。备份阶段与垃圾回收相关的数据预处理过程具体为:

(1)对需要备份的数据集使用数据块变长算法或定长算法进行分块,然后采用哈希算法计算每个数据块的指纹。

(2)对步骤(1)中得到的数据块指纹和已有的指纹表进行对比,如果不存在该指纹,则标记对应的数据块为新数据块;反之若存在该指纹,标记该数据块为重复数据块。

(3)对步骤(2)中处理完成的每一个数据块,如果是新的数据块,对其添加引用时间图的尾部,更新数据块的引用时间为当前版本号。如果是重复的数据块,其引用时间图暂不更新。

(4)在步骤(3)结束后更新容器位表。容器位表是对每个数据容器,用两个比特位标记容器相对之前版本内部数据块的引用情况。如果数据容器内的所有数据块在当前版本中都被引用,则是全部引用状态,用11标记;如果数据容器内只有部分数据块被当前版本引用,则是部分引用状态,就用10标记,如果数据容器内只所有数据块被没有被当前版本引用,则是完全没引用状态,就用00标记,对于步骤(3)中新的数据块,标记为新增引用状态,对应的容器位表用01标记,完成容器位表更新操作,这样就生成当前版本容器的容器位表。

(5)引用时间图的更新。对于是全部引用状态的数据容器,其对应的引用时间图暂不更新,而在垃圾回收过程进行更新。对于部分引用状态的数据容器,数据容器内部部分被引用的数据块对应的引用时间图将被更新成当前版本。对于完全不引用状态的数据容器,则不用更新其引用时间图。而状态为新增引用的数据容器,在步骤(3)中就已完成其对应引用时间图的更新。

(6)在备份结束前,将对应的引用时间图和容器位表存储到磁盘上。备份结束。

垃圾回收阶段的垃圾回收过程具体步骤为:

(1)开始垃圾回收,读取在备份阶段与垃圾回收相关的数据预处理过程中存储的引用时间图和最新版本的容器位表。

(2)根据最新版本容器位表更新引用时间图。

(2.1)如果容器位表中数据容器对应的状态为11,表示完全引用,容器内所有的数据块对应的引用时间图更新为最新版本号;

(2.2)如果容器位表中数据容器对应的状态为00,表示当前版本没有引用,则递归查找之前备份版本容器位表中对应位置的容器位表状态标识,直到找到对应容器位表为非00的状态,具体为:

(a)若找到容器位表状态为01或10的容器,其引用时间图在权利要求书中备份阶段与垃圾回收相关的数据预处理过程步骤(3)和步骤(5)中已完成更新,所以不用更新引用时间图。

(b)如如果找到的状态是11,记录11状态容器位表版本号,其对应数据容器内所有数据块都更新为此版本号。

(2.3)如果是01或者10,因为其对应数据容器的引用时间图已经在备份阶段回收数据预处理过程完成了,所以不做处理。按照上面过程更新得到可用于垃圾回收的引用时间图。

(3)用户给出回收版本t。

(3.1)如果是单个版本回收方法,首先由回收版本t之前的所有容器位表进行或操作得到一个合并的容器位表,如果数据容器在合并后的容器位表中为00状态,表明这个容器在之前所有备份版本中都没有被引用。然后遍历通过步骤(2)生成的引用时间图。回收该数据容器中引用时间为t的数据块。

(3.2)如果是批量回收方法,引用时间中最新引用时间小于等于t的所有数据块都可以被回收。

(4)释放步骤(2)所生成的实际引用时间图,垃圾回收结束。

附图说明

图1为本发明的模块结构示意图;

图2为本发明的引用时间图结构示意图;

图3为本发明的容器位表结构示意图;

图4为本发明的备份阶段回收相关数据预处理过程流程示意图;

图5为本发明的垃圾回收阶段的垃圾回收过程流程示意图;

具体实施方式

图1为本发明的模块示意图。主要模块包括去重模块100,垃圾回收模块200,容器位表模块300以及引用时间图模块400。去重模块100主要是对备份数据集采用分块算法进行分块,计算指纹值并判断指纹是否重复。容器位表模块300主要是根据去重模块中数据块的引用情况,得到数据容器相对以前版本的四种引用状态:完全引用、部分引用、新增引用和完全不引用,分别采用2位比特11、10、01、00表示。引用时间图模块400主要是记录数据块的最新引用时间。根据去重模块100的数据块的引用情况执行不同操作。对于部分引用,直接更新数据容器内部分被引用的数据块为当前版本号;对于新增引用,容器内所有的数据块引用时间都为当前版本号。完全不引用和完全引用在备份期间不做修改,而是在回收模块200中做更新。回收模块200主要负责根据用户指定回收版本和回收方式执行回收操作。首先根据容器位表模块300的容器位表以及引用时间图模块400的引用时间图进行更新,生成实际的引用时间图。

图2为本发明的引用时间图结构,主要包括元数据和引用时间信息。元数据包括容器id号和数据块个数,容器的id号,唯一标识数据容器。数据块个数记录当前数据容器中数据块数量。引用时间信息则包含容器中每个数据块最新被引用的版本号。图3为本发明的容器位表结构。头部包含一个4byte大小的备份版本号,后面则用两位比特位唯一标识该备份版本中每个数据容器相对之前的引用状态,11表示完全引用、10表示部分引用。01表示新增引用,00表示完全不引用,其长度与容器的个数有关。

图4为本发明的备份阶段与垃圾回收相关的数据预处理过程流程图,具体步骤如下。

(1)对引用时间图和容器位表进行初始化。

(2)对需要备份的数据集使用数据块分块算法进行分块,然后采用哈希算法计算每个数据块的指纹。

(3)对步骤(2)中得到的数据块指纹和已有的指纹索引表进行对比,如果不存在该指纹,则标记对应的数据块为新数据块;反之若存在该指纹,标记该数据块为重复数据块。

(4)对步骤(3)中处理完成的每一个数据块,如果是新的数据块,对其添加引用时间图的尾部,更新数据块的引用时间为当前版本号。如果是重复的数据块,其引用时间图暂不更新。

(5)在步骤(4)结束后更新容器位表。容器位表是对每个数据容器,用两个比特位标记容器相对之前版本内部数据块的引用情况。如果数据容器内的所有数据块在当前版本中都被引用,则是全部引用状态,用11标记;如果数据容器内只有部分数据块被当前版本引用,则是部分引用状态,就用10标记,如果数据容器内只所有数据块被没有被当前版本引用,则是完全没引用状态,就用00标记,对于步骤(4)中新的数据块,标记为新增引用状态,对应的容器位表用01标记,完成容器位表更新操作,这样就生成当前版本容器的容器位表。

(6)引用时间图的更新。对于是全部引用状态的数据容器,其对应的引用时间图暂不更新,而在垃圾回收过程进行更新。对于部分引用状态的数据容器,数据容器内部部分被引用的数据块对应的引用时间图将被更新成当前版本。对于完全不引用状态的数据容器,则不用更新其引用时间图。而状态为新增引用的数据容器,在步骤(4)中就已完成其对应引用时间图的更新。

(7)在备份结束前,将对应的引用时间图和容器位表存储到磁盘上。备份结束。

图5为本发明的垃圾回收阶段的垃圾回收过程流程示意图,具体步骤如下:

(1)开始垃圾回收,读取在备份阶段与垃圾回收相关的数据预处理过程中存储的引用时间图和最新版本的容器位表。

(2)根据最新版本容器位表更新引用时间图。

(2.1)如果容器位表中数据容器对应的状态为11,表示完全引用,容器内所有的数据块对应的引用时间图更新为最新版本号;

(2.2)如果容器位表中数据容器对应的状态为00,表示当前版本没有引用,则递归查找之前备份版本容器位表中对应位置的容器位表状态标识,直到找到对应容器位表为非00的状态,具体为:

(a)若找到容器位表状态为01或10的容器,其引用时间图在权利要求书中备份阶段与垃圾回收相关的数据预处理过程步骤(3)和步骤(5)中已完成更新,所以不用更新引用时间图。

(b)如如果找到的状态是11,记录11状态容器位表版本号,其对应数据容器内所有数据块都更新为此版本号。

(2.3)如果是01或者10,因为其对应数据容器的引用时间图已经在备份阶段回收数据预处理过程完成了,所以不做处理。按照上面过程更新得到可用于垃圾回收的引用时间图。

(3)用户给出回收版本t。

(3.1)如果是单个版本回收方法,首先由回收版本t之前的所有容器位表进行或操作得到一个合并的容器位表,如果数据容器在合并后的容器位表中为00状态,表明这个容器在之前所有备份版本中都没有被引用。然后遍历通过步骤(2)生成的引用时间图。回收该数据容器中引用时间为t的数据块。

(3.2)如果是批量回收方法,引用时间中最新引用时间小于等于t的所有数据块都可以被回收。

(4)释放步骤(2)所生成的实际引用时间图,垃圾回收结束。

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