用于数据去重复的可缩放块存储的制作方法

文档序号:6439508阅读:132来源:国知局
专利名称:用于数据去重复的可缩放块存储的制作方法
技术领域
本发明涉及存储数据的方法,尤其涉及用户数据去重复的可缩放存储方法和系统。
背景技术
数据去重复,也称为数据优化,是减少需要存储在盘上或需要通过网络上进行传送的数据的物理字节量的动作,而不会损害原始数据的保真性和完整性。数据去重复减少了存储数据所需的存储容量,并且可因此导致存储硬件成本和数据管理成本方面的节省。 数据去重复提供了处理快速增长的数字存储数据的解决方案。数据去重复可根据用于消除各持久存储文件之内或之间的重复的一项或多项技术来执行。例如,根据一项技术,在一个或多个文件中出现多次的唯一数据区域可被标识, 并且这些所标识的唯一数据区域的单一副本可被物理地存储。可存储对这些所标识的唯一数据区域(也称为数据“块”)的引用,引用指示了包含这些唯一数据区域的各文件以及在这些文件中的位置。该技术一般称为单一实例化。除了单一实例化以外,还可执行对数据的压缩。其他数据减少技术也可被实现为数据去重复解决方案的一部分。管理根据数据去重复技术来存储的数据存在各种困难。例如,由于由数据去重复所施加的数据碎片,在访问根据去重复来存储的文件时存在等待时间。该等待时间限制了对数据去重复解决方案的采用,尤其是在主存储数据上的采用,因为在主存储数据中用户期望对文件的无缝的、快速的访问。而且,数据去重复算法可在专用装置上运行,或者在存储和服务数据的设备(例如,文件服务器)上运行。在文件服务器的示例中,数据去重复可能不是该设备的主要功能,并且因此可能需要数据去重复技术是高效的,以免过度消耗设备资源(例如,存储器、输入/输出(I/O)机制、中央处理单元(CPU)能力等)。而且,由于数字数据量的以非常高的速度增长,存储设备(例如,存储盘)的大小以及与计算设备相关联的总存储容量也必须增大,从而导致不能对增加的存储量进行很好地缩放的数据去重复技术的困难。

发明内容
提供本发明内容是为了以精简的形式介绍将在以下具体实施方式
中进一步描述的一些概念。本发明内容并不旨在标识所要求保护主题的关键特征或必要特征,也不旨在用于限制所要求保护主题的范围。提供了用于本地化存储中的数据块、用于定位所存储的数据块、用于存储数据流、 以及用于重组织已存储的数据流的方法、系统和计算程序产品。例如,提供了用于本地化存储中的数据块的各种实现。数据流被解析成数据块序列。确定数据块序列中的任何一个数据块是否被存储在包括多个数据块的块容器中。以相邻的排列并以块容器中与数据流中的顺序相同顺序来存储数据块序列中被确定为没有存储在块容器内的数据块。为数据块序列中的每一数据块生成元数据。数据块序列中的数据块的元数据包括该数据块在数据流中的偏移、指向该数据块在块容器内的位置的指针、以及该数据块的位置指示符。为包括所生成的元数据的数据流生成流映射。将该流映射存储在流容器中。而且,提供了用于可靠地定位存储中的数据块的实现。对数据块的请求被接收。该请求包括数据块的标识符。数据块标识符包括块容器标识符、局部标识符、块容器阶段值、 和第一块偏移值。块容器标识符用于定位块容器。如果块容器的阶段指示匹配于块容器阶段值,则可使用第一块偏移值在块容器中定位数据块。如果块容器的阶段指示不匹配于块容器阶段值,则使用与块容器相关联的重定向表来定位数据块。可搜索重定向表以得到包括本地标识符的匹配的条目。该条目包括与第一块偏移值不同的第二块偏移值。从块容器检索在第二块偏移值处的数据块。在其他方面,提供用于存储数据流和对数据流进行碎片整理的实现。存储对重复数据块的最小可允许数的指示。累积来自数据流的数据块的序列。如果所累积的数据块序列是重复序列(例如,如果该数据块序列匹配所存储的数据块序列),但其具有小于最小可允许数的长度,则将该数据块序列作为新数据块相邻地存储在块容器中。此外,指向新数据块的指针被存储在数据流的流映射中。如果所累积的数据块序列被确定为是重复序列且具有大于或等于最小可允许数的长度,则将指向之前存储的数据块序列的指针存储在数据流的流映射中(而不是将该所累积的序列作为新数据块来存储)。此外,提供用于存储数据流和对数据流进行碎片整理的各实现。存储碎片因子。碎片因子指示所接收的数据流的指定部分所允许的最大碎片量。接收包括多个数据块的数据流的一部分。确定多个数据块中的多个数据块序列。每一个所确定的数据块序列包括相邻存储在块容器中的、重复已存储的数据块序列的数据块序列。将多个数据块分段成与碎片因子相对应的数目的数据块组。指向数据块组的第一分组中的各数据块的已存储数据块序列的指针被存储。将多个数据块中除数据块组的第一分组中的那些数据块以外的数据块存储在块容器中。而且,提供了用于重组织已存储数据流的实现。将各数据流作为(块容器中的)数据块以及作为包括指向相应的数据块的指针的流映射来存储。可设定各数据流的优先级。 对多个数据流中的已存储数据块的重组织是根据优先顺序来确定的。存储多个数据流中的数据块的第二块容器是根据所确定的重组织来生成的。流映射中的各指针被修改成指向存储在第二块容器中的各数据块。在重组织的一个实现中,数据流被选择。通过转移比所选数据流具有更低优先级的数据流中的至少一个数据块,由所选的数据流的流映射的指针所指向的一个或多个数据块被重定位为比之前更相邻。计算机程序产品在此还被描述为用于管理块存储、用于将数据块以相邻的方式存储在块存储中、用于可靠地定位存储中的数据块、用于存储数据流和/或管理数据流的碎片、用于重组织存储中的已存储数据流、以及用于此处所描述的其他实施例。下面将参考各个附图,详细描述本发明的进一步特点和优点,以及本发明的各实施例的结构和操作。值得注意的是,本发明不仅限于此处所描述的特定实施例。本文呈现这些实施例仅用于说明性的用途。基于本文所包含的描述,其它实施例对于相关领域的技术人员将是显而易见的。


结合到本说明书并构成本说明书的一部分的附图示出了本发明,且与描述一起, 进一步用于说明本发明的原理,并允许那些精通相关的技术人员实施和使用本发明。图1示出了根据一示例实施例的数据去重复系统的框图。图2示出根据一示例实施例的块存储的框图。图3和5示出了根据示例实施例的块存储的框图。图4示出根据一示例实施例的包括在流映射中的元数据的框图。图5示出根据一示例实施例的图3的块存储,且还指示被流映射引用的一些数据块。图6示出了根据一示例实施例的数据流存储系统的框图。图7示出了根据一示例实施例的用于存储数据流的流程图。图8示出根据一示例实施例的元数据生成器的框图。图9示出了根据一示例实施例的用于分配位置指示符的流程图。图10根据一实施例示出图解将数据流存储在数据存储中的示例的框图。图11根据一示例实施例示出包括再水合(rehydration)模块的块存储接口的框图。图12示出根据一示例实施例的块容器的框图。图13示出了根据一示例实施例的数据块标识符的框图。图14示出根据一实施例的其中数据流被存储在数据存储中的图10的示例,并且还图解将数据块从数据存储中移除的效果。图15示出根据一示例实施例的重定向表的框图。图16示出了根据一示例实施例的用于存储数据流的流程图。图17示出了根据一示例实施例的数据块重定向系统的框图。图18示出了根据一示例实施例的用于将数据块定位到块存储中的流程图。图19示出根据一示例实施例的用以访问块存储以再水合数据流的再水合模块的框图。图20示出了根据一示例实施例的用于存储数据流的流程图。图21示出根据一示例实施例的用于以优化形式将数据流存储在块存储中的数据流存储系统的框图。图22示出了根据另一示例实施例的用于存储数据流的流程图。图23示出根据一示例实施例的用于以优化形式将数据流存储在块存储中的数据流存储系统的框图。图M-25示出根据示例实施例的用于重组织已存储数据流的流程图。图沈示出根据一示例实施例的用于重组织存储在块存储中的数据块的存储重组织系统的框图。图27示出了可用于实现本发明的各实施例的示例计算机的框图。当结合其中相同的参考字符标识对应的元素的附图时,本发明的特征和优点将从以下阐述的详细描述中变得更加显而易见。在附图中,相同的参考标号一般指相同的、功能上相似的和/或结构上相似的元素。其中元素第一次出现的附图由对应的参考标号中最左侧的数字指示。
具体实施例方式I.介绍本说明书公开了包括本发明的特征的一个或多个实施例。所公开的实施例只例示了本发明。本发明的范围不仅限于所公开的实施例。本发明由所附的权利要求进行定义。说明书中对“一个实施例”、“实施例”、“示例实施例”等等的引用表示所描述的实施例可包括特定特征、结构或特性,但是,每一个实施例可以不一定包括该特定特征、结构, 或特征。此外,这些短语不一定指相同的实施例。此外,当参考一个实施例描述特定特征、 结构或特性时,假定在精通本技术的人员学识范围内,可以与其他实施例一起实施这样的特征、结构或特性,。在本说明书中,优化数据指已被优化的数据或者已由各数据去重复技术(诸如块的单一实例化和压缩等)中的一种或多种进行了去重复的数据。经优化的流指被去重复后的流,或换言之,它们的数据已使用数据去重复技术来优化。II.示例实施例实施例提供用于数据去重复的技术。这些实施例允许减少要被存储或者要被传输的数据的量(例如,字节数),而不损害数据的保真性和完整性。例如,各实施例允许减少访问优化数据时的等待时间的量。而且,各实施例使诸如计算机器/设备等资源能够被更高效地使用,从而降低了资源消耗。此外,各实施例提供用于数据去重复技术,这些技术能够随着所存储的数字数据的量的增长而缩放。例如,在一实施例中,提供了用于数据去重复的可缩放块存储。这种块存储允许用于最小化优化数据访问中的等待时间的各种技术,并减少数据去重复、再水合和垃圾信息收集期间的机器资源消耗(例如,存储器和盘I/O)。各示例实施例在以下子节中进一步详细描述。A.示例性数据去重复实施例在各实施例中,可优化要存储的数据,以减少数据所需的存储的量。例如,数据流可以唯一数据块的形式来存储。数据块可被定义数据流的映射引用。以这种方式中,数据流被更高效地存储,因为多个映射可引用同一已存储数据块,而不是同一数据块被存储多次。 而且,可根据需要从存储处请求优化数据(例如,通过应用程序)。在这种情况下,可根据相应的映射从已存储的数据块重新组装数据流。例如,图1示出了根据一示例实施例的数据去重复系统100的框图。如图1中所示出地,系统100包括存储系统102、数据去重复模块104、维护模块106和存储108。而且, 存储系统102包括数据流API (应用程序编程接口)110、块维护API 112、和数据访问API 114。描述系统100如下,以说明优化数据的存储以及优化数据从存储处的恢复,并且该系统并非旨在限制。系统100被配置成允许以高效的方式将数据存储在存储108中,以及允许从存储 108检索数据。例如,在一实施例中,可存在数据去重复模块104。数据去重复模块104被配置成优化接收到的数据以供存储。例如,数据去重复模块104可压缩作为数据流132来接收的接收到的数据。数据流132可包括数据文件的一部分、单个数据文件、多个数据文件、 和/或各文件和/或各文件部分的组合。如图1所示出地,数据去重复模块104生成数据块124,数据块IM可以是数据流132的已压缩和已分段版本。数据流API 110提供允许存储系统102接收数据块124的接口。数据块IM可包括形成数据流132的多个数据块,数据块IM从该数据流132生成。数据流API 110可以相关领域的技术人员所公知的任何合适方式来配置。数据流APIllO可输出由块存储接口 116来接收的数据块124。如图1所示,存储108耦合到存储系统102。块存储接口 116是API 110、112和 114与存储108之间的接口。例如,块存储接口 116可接收数据块124,并可将数据块124 中的数据块存储在存储108中。例如,如图1所示,存储108包括块存储118。块存储接口 116可将数据块124中的接收到的数据块,如数据块128,存储在块存储118中。数据访问API 114提供允许应用程序请求存储系统102中的数据的接口。例如, 如图1所示,数据访问API 114可接收数据流请求120。数据访问API 114可以相关领域的技术人员所公知的任何合适的方式来配置。数据访问API 114可输出由块存储接口 116来接收的数据块120。块存储接口 116可从存储108(例如,从块存储118)请求数据块,这些数据块与数据流请求120中所请求的数据流相对应。块存储接口 116可从存储108处接收所请求的数据块,如数据块130,并可将包括数据块130的数据流提供给数据访问API 114。 数据访问API 114可将数据流(例如,一个或重新组装的文件)作为数据流响应122而提供给发出请求的应用程序。而且,可呈现维护模块106来执行与存储在块存储118中的数据块有关的一个或多个类型的维护工作。例如,维护模块106可包括对存储在存储108中的数据块执行碎片整理的碎片整理模块。例如,碎片整理模块可被配置成消除存储108中的空白空间(例如,执行压缩)、将相关的数据块移入序列、和/或执行其他相关任务。在另一示例中,维护模块106可包括对存储在存储108中的数据块执行垃圾信息收集的信息收集模块。例如, 垃圾信息收集模块可被配置成删除存储108中的未被使用的数据块。在其他实施例中,维护模块106可对存储108执行附加的或另选的维护任务。如图1中所示出地,块维护API 112提供允许维护模块106与存储系统102进行交互的接口。维护模块106可生成由块维护API 112来接收的维护任务126(例如,碎片整理指令、压缩指令、数据块删除指令等)。块维护API 112可以相关领域的技术人员所公知的任何合适的方式来配置。块维护API 112可将维护任务1 提供给块存储接口 116。块存储接口 116可允许对存储在存储108中的数据块执行维护任务126。存储系统102可以任何合适的形式来实现,包括一个或多个计算机/计算设备等形式。存储108可包括一种或多种类型的存储机制,包括磁盘(例如,以硬盘驱动器)、光盘(例如,以光盘驱动器)、磁带(例如,以磁带驱动器)、和/或任何其他合适类型的存储介质。注意,数据去重复系统100是其中可实现本发明的各实施例的环境的示例。数据去重复系统100出于说明的目的而提供,并不旨在限制。可将各实施例结合在其他类型和配置的数据去重复系统中。B.允许数据块定位的示例块存储实施例
图1中的块存储118可以以任何方式存储数据块形式的数据流。例如,块存储118 可存储指示包括在数据流中的数据块的映射,并可存储所引用的数据块。在一实施例中,根据数据去重复技术,块存储118并不存储数据块的重复副本。例如,图2示出根据一示例实施例的块存储118的框图。如图2中所示出地,块存储118包括流容器202和块容器204。流容器202包括一个或多个流映射206,且块容器 204包括多个数据块208。数据块208是被一个或多个数据流(例如,图1中的数据流132) 引用的一段数据。流映射206是描述原始数据流结构与经优化数据块结构之间的映射的数据结构。流映射206直接包括或者通过间接层包括数据块位置信息,从而使得可定位所引用的数据块,并将其组装成文件流视图。数据块208和流映射206分别被存储在流容器202 和块容器204中,其可以是文件系统中的文件。在一实施例中,块存储118以块的形式存储所有数据,使得流映射206被存储成包含内部元数据(数据流元数据)的数据块,内部元数据描述了文件流到数据块208的映射、数据块地址和散列。在各实施例中,可以以各种方式来配置流容器202和块容器204。例如,图3示出了根据示例实施例的块存储300的框图。块存储300是图2中的块存储118的一个示例。 如图3中所示出地,块存储300包括存储容器302和块容器304。存储容器302是图2中的存储容器202的一个示例,且块容器304是图2中的块容器204的一个示例。在图3的实施例中,存储容器302包括文件头部306、重定向表308、和多个流映射310。图3中示出第一流映射310a和第二流映射310b以用于说明的目的,但在各实施例中,流容器302中可包括任何数目的流映射310,这包括成百的、成千的、和甚至更多数目的流映射310。块容器304 包括文件头部318、重定向表320、以及多个数据块322。图3中示出第一数据块32 和第二数据块322b以用于说明的目的,但在各实施例中,块容器304中可包括任何数目的数据块322,这包括成百的、成千的、和甚至更多数目的数据块322。图3的这些特征描述如下。在流容器302被作为文件来存储的实施例中,文件头部306是流容器302的文件头部。文件头部306可包括与流容器302相关联的信息,该信息包括流容器标识符(例如, 流容器标识号)等。重定向表308可选地存在于流容器302中。当存在时,重定向表308可存储关于流映射310中的任何一个在流容器302中的位置的改变的信息。例如,可将第一流映射310a 从流容器302删除,并且可将第二流映射310b移动至第一流映射310a的位置(例如,由于碎片整理或压缩例程)。在移动之后,可由应用程序来访问流容器302,以检索第二流映射 310b。然而,应用程序可能仍在使用第二流映射310b的之前位置。重定向表308可包括第二流映射310b的映射,该映射指示了第二流映射310b的当前位置。因此,应用程序可访问重定向表308来确定第二流映射310b的当前位置,并且因此可被允许从该新位置检索第二流映射310b。流映射310是图2中的流映射206的示例。流映射310中的每一个用于定义构成特定数据流的数据块322的序列。如图3中所示出地,流映射310中的每一个包括流头部312、元数据314和散列值316。例如,第一流映射310a被示为包括流头部312a、元数据 31 、和散列值316a,且第二流映射310b被示为包括流头部312b、元数据314b、和散列值 316b。每一个流头部312都包括与相应的流映射310相关联的信息,诸如流映射标识符(例如,流映射标识号)等。每一个元数据314都包括描述数据块322的信息,数据块322构成由相应的流映射310定义的数据流。散列值316可选地存在。散列值316是数据块322的散列值,数据块322构成由相应的流映射310定义的数据流。散列值316可被存储在流映射310中,以便提供对构成相应数据流的数据块的散列矢量的高效访问。例如,这可能对有线数据传送场景有用,在这些场景中期望对数据流散列的整个列表(所有经优化文件块的散列)的快速访问。在元数据314中可包括各种类型的信息。例如,图4示出了根据一示例实施例的元数据400的框图。元数据400是图3中的元数据314的示例。元数据400是被引用的每一个数据块322的、可被包括在流映射310中的元数据(例如,每个块的元数据)的示例。 如图4中所示出地,元数据400包括数据流偏移402、数据块标识符404和位置指示符406。 数据流偏移402指示相关联的数据块322在由特定流映射310定义的数据流中的位置。例如,数据流偏移402可指示从数据流的开始处开始的字节数,或者从数据流中相关联的数据块322所开始的其他引用点开始的字节数。数据块标识符404(也称为块id或“可靠的块定位符”)是指向块容器304中的相应数据块322的引用或指针。例如,特定数据块的数据块标识符404允许在块容器304中可靠地定位数据块。数据块标识符404可具有各种形式,包括在以下更详细描述的示例形式(例如,参考图13)。位置指示符406是表示块容器 304中的块插入次序的信息,从而允许确定哪些数据块322可被共同的流映射310引用。例如,位置指示符406允许将与相同的流映射310相关联的各数据块322相邻地存储在块容器304中,或者在相邻存储不简单时(例如,由于多个流映射310引用同一数据块322)允许将各数据块322相邻地存储在一起。位置指示符406还可被诸如块散列索引等其他数据去重复组件用来改进散列查找和插入性能。参考图3中的块容器304,在块容器304被存储为文件的实施例中,文件头部318 是块容器304的文件头部。文件头部318可包括与块容器304相关联的信息,包括块容器标识符(例如,块容器标识号)、指示块容器304的版本号的块容器阶段指示符等。重定向表320可选地存在于块容器304。当存在时,重定向表320可以与流容器 302的重定向表308处理流映射310的位置中的改变相类似的方式来存储关于数据块322 中的任何一个的块容器304中的位置中的改变的信息。数据块322是图2中的数据块208的示例。如图3中所示出地,数据块322中的每一个包括块头部3M和块数据326。例如,第一数据块32 包括块头部32 和块数据 326a,且第二数据块322b包括块头部324b和块数据326b。每一块头部312都包括与相应的数据块322相关联的信息,诸如数据块标识符等。每一块数据3 包括相应的数据,该数据可以处于压缩或非压缩形式。流映射310和数据块322分别被存储在流容器302和块容器304中,以允许数据去重复和数据去除-重复。例如,图1中的块存储接口 116可接收与数据流132相关联的数据块124,并可将数据块存储在图3中的块存储300中。例如,对于特定的数据流132,块存储接口 116可生成流映射,该流映射作为流映射310通过块存储接口 116存储在流容器 302中,流映射310引用存储在块容器304中的一个或多个数据块322。例如,图5根据一示例实施例示出图3中的块存储300,并指示被流映射310引用的一些数据块322。如图5中所示出地,第一流映射310a包括元数据314a,元数据31 包括对块容器304中的第一数据块32 和第二数据块322b的引用。因此,第一数据块32 和第二数据块322b包括在与第一流映射310a相关联的源数据流中。例如,元数据31 可包括指示第一数据块32 在由第一流映射310a所定义的源数据流中的位置的第一数据块 322a的数据流偏移402值、块容器304中第一数据块32 的数据块标识符404(例如,第一数据块32 存储在块头部32 中的数据块指示符)、以及第一数据块32 的位置指示符406。而且,元数据31 可包括指示第二数据块322b在该源数据流中的位置的第二数据块322b的数据流偏移402值、块容器304中第二数据块322b的数据块标识符404(例如, 第二数据块322b存储在块头部324b中的数据块指示符)、以及第二数据块322b的位置指示符406。在一实施例中,第一数据块32 和第二数据块322b可具有相同值的位置指示符,该相同值被生成来与由第一流映射310a所定义的源数据流相对应,并且该相同值指示第一数据块32 和第二数据块322b被相邻地(相邻地)存储在块容器304中。此外,第二流映射310b包括元数据314b,元数据314b包括对块容器304中的第二数据块322b的引用。例如,元数据314b可包括指示第二数据块322b在由第二流映射310b 所定义的源数据流中的位置的第二数据块322b的数据流偏移402值、块容器304中第二数据块322b的数据块标识符404(例如,第二数据块322b存储在块头部324b中的数据块指示符)、以及第二数据块32 的位置指示符406。元数据314b中第二数据块32 的位置指示符406具有与为第一数据块32 和第二数据块322b生成的位置指示符相同的值,因为第二数据块322b最初被存储在第一流映射310a的块容器304中。向在由第二流映射 3IOb定义的源数据流被存储在块存储300中时新近存储在块容器304中的任何其他数据块 322(图5中未示出)分配位置指示符406的新值。图1中的块存储接口 116可以将数据流存储在图3的块存储300中的各种方式来配置。例如,图6示出了根据一示例实施例的数据流存储系统600的框图。如图6中所示出地,数据流存储系统600包括数据流解析器602、块存储接口 116、流容器302、以及块容器 304。在一实施例中,可将数据流解析器602包括在图1的数据去重复模块104中。在图6 的实施例中,块存储接口 116包括数据块存储管理器604、元数据生成器606和流映射生成器608。参考图7描述图6中的这些特征如下。图7示出了根据一示例实施例的用于存储数据流的流程图700。在一实施例中,图6中的系统600可根据流程图700来操作。基于有关流程图700的讨论,进一步的结构及操作的实施例对于相关领域的技术人员将是显而易见的。流程图700和系统600描述如下。流程图700开始于步骤702。在步骤702处,将数据流解析成数据块。例如,如图 6中所示出地,数据流解析器602可接收数据流610。类似于图1中的数据流132,数据流 610可包括一个或多个文件和/或文件的各部分,数据流解析器602被配置来将数据流610 解析成被指示为数据块序列612的数据块的序列。例如,在一实施例中,数据块序列612可以以将数据块定位在数据流610中的次序来包括数据块序列。数据块序列612中的数据块可具有相同的大小或可具有不同的大小。在步骤704处,确定这些数据块中的任何一个是否是存储在块容器中的数据块的重复。例如,如图6中所示出地,数据块存储管理器604接收数据块序列612。数据块存储管理器604被配置成确定数据块序列612中的数据块中的任何一个是否已经被存储在块容器304中并因此是重复的。例如,在一实施例中,如图6中所示出地,数据块存储管理器604 可从块容器304接收数据块信息626,数据块信息6 可包括存储在块容器304中的每一数CN 102541751 A
据块322的散列值。在另一实施例中,数据块存储管理器604可从流容器302接收散列值 316 (图幻,散列值316是存储在块容器304中的数据块322的散列值。数据块存储管理器 604可为数据块序列612中的每一数据块生成散列值,并可将所生成的散列值与数据块信息626中(或者从流容器302处)接收的散列值进行比较,以确定数据块序列612中的各数据块是否已经被存储在块容器304中。在其他实施例中,数据块存储管理器604可确定数据块序列612中的哪些数据块已以相关领域的技术人员所公知的其他方式存储在块容器304中。如图6中所示出地,数据块存储管理器604生成已存储块指示616,该已存储块指示616指示了数据块序列612中的哪些数据块已被存储在块容器304中。再参考图7,在步骤706处,将被确定为不是重复的各数据块以相邻的排列并以与数据流中的顺序相同的顺序存储在块容器中。例如,在一实施例中,数据块存储管理器604 可被配制成将数据块序列612中没有被确定为已存储的各数据块存储在块容器304中。例如,在一实施例中,数据块存储管理器604可为每一新数据块生成块头部3 (例如,数据块标识符),并将每一新数据块当作具有块头部3M和块数据3 的数据块322来存储。此外, 在一实施例中,数据块存储管理器604被配置成将各新数据块以相邻的排列并以与源数据流中的顺序相同的顺序(例如,以在数据块序列612中接收的次序)存储在块容器304中。在步骤708处,生成被确定为不是重复的各数据块中的每一个的元数据,数据块的元数据包括数据流偏移、指向在块容器中的位置的指针、以及位置指示符。例如,如图6 中所示出地,元数据生成器606可接收数据块序列612和已存储块指示616。在一实施例中,元数据生成器606可被配置成生成元数据(例如,图3中的元数据314)。元数据生成器 606可为数据块序列612中的每一数据块生成元数据,该元数据包括数据流偏移402、数据块标识符404、和位置指示符406。对于被确定为已存储在块容器304中的各数据块(在步骤704中),数据块标识符404被配置成指向已存储数据块。对于在步骤708中新存储在块容器304中的各数据块,数据块标识符404被配制成指向行存储的数据块。 在各实施例中,元数据生成器606可以以各种方式被配置来生成元数据。例如,图 8示出了根据一示例实施例的元数据生成器606的框图。如图8中所示出地,元数据生成器 606包括元数据收集器802和位置指示符生成器804。如图8中所示出地,位置指示符生成器804接收数据块序列612和已存储块指示616。位置指示符生成器804被配置成为数据块序列612中没有被已存储块指示616指示为已存储在块容器304中的每一数据块生成位置指示符406。如图8中所示出地,位置指示符生成器804生成一个或多个位置指示符值 622,该值指示数据块序列612中每一数据块的位置指示符406。 元数据收集器802接收位置指示符值622、数据块序列612和已存储块指示616。 元数据收集器802收集数据块序列612中每一数据块的元数据。例如,元数据收集器802 可确定在数据块序列612中接收的每一数据块的数据流偏移402。例如,元数据收集器802 可基于在数据块序列612中接收各数据块的次序和/或接收到的数据块的长度来确定每一数据块的数据流偏移402 (例如,一数据块的数据流偏移402可被设定为数据块序列612中在该数据块之前被接收到的各数据块的长度的和,或者以其他方式来设定)。元数据收集器 802可为每一数据块生成数据块标识符404,以标识块容器304中的每一数据块。元数据收集器802向每一数据块分配在位置指示符值622中接收到的相应位置指示符值。元数据收集器802将与在数据块序列612中接收到的每一数据块相关联的元数据作为数据块元数据 620输出。在一实施例中,元数据生成器606可根据图9来分配各位置指示符值622。图9示出了根据一示例实施例的用于分配位置指示符的流程图900。流程图900开始于步骤902。 在步骤902,选择与数据流相关联的新位置指示符值。例如,当接收数据流的数据块序列 612时,位置指示符生成器804可选择新位置指示符值来与该数据流相关联。该新位置指示符值是唯一的,且与正用于之前接收的数据流的位置指示符值不同,这些之前接收的数据流已经具有存储在块容器304中的数据块。例如,新位置指示符值可以是所生成的与数据流相关联的唯一数字。位置指示符生成器804将所选位置指示符值作为所选位置指示符值 622来输出。在步骤904中,将新位置指示符值分配给在步骤704中被确定为不是重复的各数据块中的每一个的位置指示符。例如,如图8中所示出的,所选位置指示符值622是由元数据收集器802来接收的。元数据收集器802被配置成将所选位置指示符值622作为位置指示符406分配给数据块序列612中被已存储块指示616指示为尚未存储在块容器304中的第一组数据块(即,各新数据块)中的每一数据块。在步骤906中,对于在步骤704中被确定为是重复的每一个数据块,将与已存储在块容器中的匹配数据块相关联的位置指示符值分配给位置指示符。例如,已存储在块容器 304中的每一数据块322(重复数据块)具有已分配的位置指示符406,因为位置指示符值是在数据块322最初被存储在块容器304中的时候被分配给数据块322的。在一实施例中, 对于被已存储块指示616指示为已存储在块容器中的各数据块,元数据收集器802将与已存储在块容器304中的数据块相关联的位置指示符值分配给在数据块序列612中接收到的匹配/重复数据块。因此,数据块序列612中的一组或多组数据块各自可被分配与存储在块容器304中的相应数据块相关联的相应位置指示符值。再参考图7,在步骤710中,生成包括所生成的元数据的数据流的流映射。例如,如图6中所示出的,流映射生成器608接收在特定数据流的数据块序列612中接收到的每一数据块的数据块元数据620。流映射生成器608生成与包括每一所接收的数据块的数据块元数据620的数据流相关联的流映射624。此外,流映射生成器608可生成流映射拟4的流头部312,并可将所接收每一数据块的散列值316包括在流映射624中。在步骤712中,将该流映射存储在流容器中。例如,如图6中所示出地,流映射生成器608可将流映射624(例如,作为流映射310)存储(或“持久存储”)在流容器302中。图10根据一实施例示出图解将数据流存储在数据存储中的示例的框图。提供图10以用作说明的目,而不旨在限制。在图10的示例中,将第一数据流100 存储在数据存储中,接着将第二数据流1002b存储在数据存储中。示出第一数据流1002a的流链接 1008a(也称为“流指针”或“流存根(stub)”),并示出第二数据流1002b的流链接1008b。 如图10中所示出地,第一数据流100 包括四个数据块1014a-1014d。如上所述,可为第一数据流100 生成流映射1004a,并可将四个数据块10Ha-1014d存储在块容器1006中。流映射100 包括指向数据块1014a-1014d中的每一个的指针(由图10中的箭头表示)。可将数据块10Ha-1014d分类在对块容器1006而言是新的、唯一的所有数据块的单个组中。 这样,可将数据块1014a-1014d以相邻的排列并以与数据流1002a中的次序相同的次序存
13储在块容器1006中。例如,数据块10Ha-1014d可以是存储在块容器1006中的前四个数据块,或者如果一个或多个数据块已被存储在块容器1006中,则可将数据块10Ha-1014d 存储在块容器1006中紧接着这些已存储数据块的位置。向数据块1014a-1014d中的每一个分配流映射1004a中的相同位置指示符值、为第一数据流100 选择的位置指示符值。第二数据流1002b包括四个数据块1014b、1014c、10He和1014f。可为第二数据流 1002b生成流映射1004b。根据流程图700中的步骤704,可将数据块1014b、1014c、IOHe和 1014f分类成两组数据块包括块1014b和IOHc的第一组,(由于第一数据流100 的块序列)块1014b和1014c已经具有驻留在块容器1006中的副本;以及,包括块IOHe和1014f 的第二组,块IOHe和1014f是新的、唯一的数据块(其不具有已经存储在块容器1006中的副本)。由于数据块1014b和1014c已经被存储在块容器1006中,因此流映射1004b包括指向已经存储在块容器1006中的数据块1014b和1014c的指针(数据块标识符404的值)。因此,可将数据块1014b和IOHc作为指向块容器1006中的现有数据块的指针来存储,而无需存储数据块1014b和1014c的块数据。如上所述,由于数据块IOHe和1014f尚未存储在块容器1006中,因此可将数据块IOHe和1014f存储在块容器1006中。例如,由于数据块IOHe和1014f对块容器1006而言是新的、唯一的数据块,因此可将块IOHe和 1014f以相邻的排列并以与数据流1002b中的次序相同的次序存储在块容器1006中在当前存储在块容器1006中的最后一个已存储数据块(例如,数据块1014d)之后。流映射1004b 包括前四个数据块标识符1012a-1012d,这些标识符分别指向存储在块容器1006中的数据块1014b、1014c、IOHe和1014f。在流映射1004b中,向数据块1014b和IOHc分配与第一数据流100 相关联的位置指示符值(根据图9中的步骤906),且向数据块IOHe和1014f 分配为第二数据流1002b选择的位置指示符值(例如,根据图9中的步骤902和904)。注意,任何数目的附加数据流1002可以以与数据流100 和1002b类似的方式来进行存储。此外,注意,在图10的示例中,第二流映射1004b中的数据块各自被分配如下两个位置指示符值中的一个——为第二流映射1004b选择的新位置指示符值,或者与第一流映射1004a的数据块相关联的位置指示符值。在各实施例中,特定流映射的数据块可被分配任何数目的位置指示符值中的一个,这取决于与块容器中已存在的流映射的数据块相关联的不同位置指示符的数目。例如,如所描述地,可向对块容器而言为新的数据块分配为与流映射相关联的特定数据流所选择的新位置指示符值。此外,向被已经存在于块容器中的流映射所引用的任何数目的数据块分配已经存在于该块容器中的数据块的相应位置指示符值。这可意味着可向数据流中任何数目的一组或多组数据块分配相应的位置指示符值, 使得可向该数据流中的各数据块分配从两个、三个或甚至更多个不同的位置指示符值中选择的位置指示符。因此,流映射元数据中的位置指示符允许各数据块在数据流中的位置是确定的。 这是因为重复的数据块趋向于成组的出现。在新数据流包含已知数据块(已经存储在块容器中)时,存在以下合理的可能性在该新数据流中下一数据块也是重复的数据块(已经存储在块容器中)。由于各新的、原始数据被块被根据位置指示符彼此相邻地存储在块容器中,因此新数据流所引用的各已存在数据块更可能也被相邻地存储在块容器中。这有助于改进从块存储读取经优化的数据流的性能。例如,被配置成基于相应的流映射和数据块来重新组装数据流的再水合模块可对存储在块容器中的各数据块执行预读(read-ahead),以期望找到在前读缓存器中需要的下一数据块。此外,如碎片整理和压缩等块存储维护任务可执行它们的任务,同时通过在现有的相邻块在块容器中四处移动时将这些相邻块维持在一起来尝试维护原始位置。例如,在数据流被优化并且这些数据流以流映射310和数据块322的形式被存储在块存储300之后,可从块存储300处读取这些数据流。图11根据一示例实施例示出包括再水合(rehydration)模块1102的块存储接口 116的框图。再水合模块1102被配置成重新组装所请求的数据流(例如,根据图1中示出的数据流请求120来请求的数据流)。例如, 对于要响应于数据流请求120(图1)从块存储300处读取的数据流,再水合模块1102确定并接收被来自块存储300的数据流请求120的经优化文件引用(例如,在重解析位置)的流映射310。例如,再水合模块1102可将请求120的流映射标识符提供给图3中的块存储 300。块存储200基于流标识符(例如,通过扫描流映射头部312)接收相应的流映射310, 并且再水合模块1102可根据检索到的流映射310重新生成或“再水合”数据流。检索到的流映射310包括指向块容器304中包括在数据流中的数据块中的每一个的指针(图4中的数据块标识符404)。再水合模块1102使用这些指针来检索这些数据块322中的每一个。 再水合模块1102可使用包括在检索到的流映射310中的数据流偏移402(例如,外加可被包括在检索到的流映射310中的数据块长度信息)将检索到的数据块322以重新生成由再水合模块1102输出的数据流的合适次序排列成数据流1104。通过对位置指示符406的使用,可执行从块容器304中对数据块322的顺序读取。 例如,在文件流正被再水合模块1102使用串行I/O (输出/输出)请求或包括一个以上数据块边界的任何I/O请求在块存储300中访问时,流映射310允许对数据库的快速访问。这是因为在块存储300创建流映射310的时候,将各新数据块以流映射次序相邻地存储在块容器304中。因此,在由再水合模块1102的顺序数据访问期间,属于同一数据流的各数据块可能会被相邻地存储,这些相邻数据块可用单个数据访问“查找”(例如,向前或向后经过块容器以便找到要读取的下一个已存储数据块的移动)来访问和读取,并且碎片可被减少成非唯一数据块(被流映射引用的、在存储相应的数据流之前已经存在于块容器中的数据块)。顺序数据访问期间的数据访问查找限于针对在数据块或数据流中的一系列块被发现已经存储于块存储中时的情况。流映射310提供了用于可能被数据去重复系统中的其他模块(例如,被文件复制模块使用的散列值的列表)需要的经优化文件元数据(例如,元数据 314)的高效元数据容器。流映射310是简明的,并且可被高速缓存在存储器中以便快速访问。块存储300可基于LRU(至少目前使用的)算法或其他类型的高速缓存算法来高速缓存(被再水合模块1102频繁请求和再水合的经优化数据流的)被频繁访问的流映射310。C.允许可靠的定位数据块的示例性块存储的实施例如上所述地,可出于各种原因(诸如由于碎片整理技术、由于执行垃圾信息收集的压缩技术等)在块容器中移动数据块。本小节中描述了用于保持对各数据块在块容器中的移动的跟踪的各实施例。图12示出根据一示例实施例的块容器304的框图。如图12中所示出地,块容器 304大致类似于图3中的块容器304,但在文件头部318中还包括块容器标识符1202和块容器阶段指示1204。块容器标识符1202是分配给块容器304的唯一标识符(例如,标识号),用于将块容器304与可能存在于块存储300中的其他块容器区分开。块容器阶段指示1204指示块容器304的版本或阶段。例如,每当在块容器304中移动一个或多个数据块 322时,可修改阶段指示1204(例如,可将其从诸如0或其他开始值等开始阶段级别增加到下一阶段级别)。在一实施例中,块容器304可由块容器标识符1202和块容器阶段指示1204的组合(例如,可形成块容器304的文件名)来标识。在一实施例中,块容器标识符1202和块容器阶段指示1204两者都可以是整数。块容器304可具有固定的大小(即,固定数目的条目),或者可具有可变的大小。例如,在一示例实施例中,可将定义块容器304的每一块容器文件的大小设为可存储大约16000个块,并且平均数据块大小为64KB,其中块容器文件的大小被设为1GB。在另一实施例中,块容器文件可具有可另选的大小。可根据元数据400 (图4)的数据块标识符404以各种方式引用存储在块容器304 中的数据块322。例如,图13示出了根据一示例实施例的数据块标识符1300的框图。在各实施例中,流映射310可将数据块标识符1300作为数据块标识符404存储在元数据314中。 如图13中所示出地,数据块标识符1300包括数据块容器标识符1302、局部标识符1304、块容器阶段值1306和块偏移值1306。块容器标识符1302具有其中存储有数据块322的块容器304的块容器标识符1202的值。局部标识符1304是分配给数据块322的标识符(例如,数字值),该标识符对于存储有数据块322的块容器304中的被分配数据块322是唯一的(例如,是数据块的唯一的、每个容器的标识符)。块容器阶段值1306具有其中存储有数据块322的块容器304在数据块322被存储在块容器304中的时候的块容器阶段指示1204 的值。注意,分配给数据块322的局部标识符1304的值在块容器304的整个历史中(例如, 在所有阶段中)对于数据块322是唯一的,并且该值是不可变的。块偏移值1306是块容器 304中的数据块322在数据块322被添加到块容器304中的时候的偏移。因此,根据图13中的实施例,数据块322可由流映射310通过数据块标识符1300 来引用,数据块标识符1200包括块偏移值1306,该块偏移值指示块容器304中的数据块 322在它们被存储时的偏移。然而,如果随后在块容器304中移动数据块322(即,块容器 304中的数据块322的偏移改变了),则在流映射310中使用的数据块322的现有数据块标识符1300可具有针对块偏移值1306的不正确的值。这个概念在图14中示出。图14示出根据一实施例的其中数据流被存储在数据存储中的图10的示例,并且还图解了将数据块从数据存储中移除的效果。如图14中所示出地,类似于图10,第二数据流1002b具有相应的流映射1004b (例如,存储在流容器302中, 图14中未示出),并具有存储在块容器1006中的数据块1014b、1014c、IOHe和1014f。然而,与图10相反,已将第一数据流100 从块存储处移除。因此,第一流映射100 不再存在。此外,将本示例中仅被流映射1004a引用的数据块101 和1014b从块容器1006处移除(例如,通过垃圾信息收集技术)。而且,由于数据块101 和1014d不再存在于块容器1006中,从而留下了未使用空间/存储间隙,因此压缩算法已将1014b、10Hc、10He和 1014f在块容器1006中进行移动,以收回未使用空间。如图14中所示出地,数据块1014b 已被转移至块容器1006中的第一偏移位置(数据块101 之前所在的位置),数据块IOHc 已被转移至邻接着数据块1014b的另一偏移位置,数据块1014e已被转移至邻接着数据块 1014c的另一偏移位置,并且数据块1014f已被转移至邻接着数据块1014e的另一偏移位置。通过这种方式,可将块容器304中之前由数据块101 和1014d填充的存储空间收回。
然而,由于数据块1014b、1014c、10He和1014f已在块容器1006中移动过了, 因此流映射1004b中的数据块标识符1012a-1012d不再指向数据块1014b、1014c、1014e 和1014f (例如,表示指针1012a-1012d的箭头被示为指向数据块1014b、1014c、IOHe和 1014f的之前位置)。如果在再水合数据流1002b的尝试中使用流映射1004b,则该尝试将失败,因为数据块1014b、1014c、IOHe和1014f在它们之前的位置是不可获取的。因此,期望具有用于将数据块1014b、1014c、IOHe和1014f定位到它们的新偏移处的技术。在一实施例中,块存储可实现可靠的块定位器,该块定位器可用于跟踪已移动的数据块。与传统技术相反,该可靠的块定位器并不使用用于将数据块标识符映射到物理块位置的索引。传统技术使用将块标识符映射到块数据物理位置的索引。存储系统的规模 (例如,兆兆字节(TB)的100倍或更大)以及平均块大小(例如,64KB)使得这一索引非常大。如果将这一索引全部加载到存储器中,则它将消耗大量的可用存储器和处理器资源。如果不将该索引加载到存储器中,则数据访问将变得很慢,因为需要将该索引分页存储到存储器中。此处描述的各实施例并不使用这一索引,因此保留了系统资源。在一实施例中,可靠的块定位器是以重定向表的形式来实现的,诸如图3中的块容器304的重定向表320。重定向表可存储在块容器304中已移动过的数据块322的一个或多个条目。每一条目标识已移动的数据块322并具有数据块偏移值,该数据块偏移值将数据块322在块容器304中的位置指示到它的新位置处。在数据流的再水合期间可参考重定向表,以定位数据流中已移动过的任何数据块。例如,图15示出了根据示例实施例的重定向表1500的框图。如果在块容器304 中移动了数据块322,则使用重定向表1500来定位数据块322(包括作为数据块来存储的流映射)。例如,重定向表1500允许为了作为垃圾信息收集和压缩过程的一部分的空间收回而在块容器304中移动数据块,并且该重定向表1500仍可基于数据块322的原始块标识符来进行可靠的定位。如图15中所示出地,重定向表1500包括多个条目1502,诸如第一条目 150 和第二条目1502b。可将任何数目的条目1502包括在重定向表1500中,包括成百的、 成千的、以及甚至更多数目的条目1502。每一条目1502包括局部标识符1504和已改变的块偏移值1506。例如,第一条目150 包括第一局部标识符150 和第一已改变块偏移值 1506a,且第二条目1502b包括第二局部标识符1504b和第二已改变块偏移值1506b。局部标识符1504是将数据块322最初存储在块容器304时分配给数据块322的唯一局部标识符(图13中的局部标识符1304)。已改变的块偏移值1506是移动过的、具有相应的局部标识符1504的数据块322的新块偏移值。因此,可使用数据块的位置指示符来访问重定向表1500,以确定数据块的已改变块偏移值。例如,图15中的局部标识符1504a可以是分配给图14中的数据块1014b的局部标识符。可使用分配给数据块1014b的局部标识符来访问重定向表1500中的条目1502a, 以确定已改变的块偏移值1506a,该已改变的块偏移值1506a指示数据块1014b在块容器 304中的新位置。注意,重定向表1500可具有任何大小。例如,在一实施例中,重定向表1500的大小以(预先确定的数据块的最大数目-预先确定的为压缩而删除的数据块的最小数目)χ(重定向表条目的大小)为界。在一些情况下,数据块的重新定位可能很少发生。在一实施例中,在确定了数据块的已改变的块偏移值之后,可将流映射中从该流映射指向数据块的任何指针修改成该经改编的块偏移值,并且可将条目1502从重定向表1500移除。在一些情况中,通过这种方式重定向表1500可能随着时间的推移而没有条目1502。可以各种方式来将条目添加到重定向表中。例如,图16示出了根据一示例实施例的用于存储数据流的流程图1600。参考图17描述流程图1600如下。图17示出了根据一示例实施例的数据块重定向系统1700的框图。如图17中所示出地,数据块重定向系统 1700包括重定向表调节器1702和阶段增量器1704。例如,在一实施例中,可将数据块重定向系统1700实现在图1中的块存储接口 116中。基于有关流程图1600的讨论,进一步的结构及操作的实施例对于相关领域的技术人员将是显而易见的。描述流程图1600如下。流程图1600开始于步骤1602。在步骤1602,修改块容器中的内容。例如,在一实施例中,可移动图12的块容器304中的一个或多个数据块322。可通过诸如碎片整理过程、 垃圾信息收集之后的压缩过程或其他过程之类的维护任务(例如,图1中的维护模块106) 来移动这些数据块322。在步骤1604中,将一个或多个条目添加到重定向表中,该一个或多个条目指示块容器中的一个或多个数据块的由于步骤1602而改变的块偏移值。例如,如图17所示出地, 重定向表调节器1702接收已移动数据块指示1706,该已移动数据块指示1706指示根据步骤1602的维护任务而在图12的块容器304中移动过的一个或多个数据块322。可从执行步骤1602的维护任务处接收已移动数据块指示1706,并且已移动数据块指示1706可指示 块容器304的块容器标识符、每一个已移动数据块(例如,通过局部标识符1304)、以及已移动数据块在块容器304中的偏移。重定向表调节器1702被配置成将与已移动数据块指示 1706中指示的一个或多个已移动数据块322相对应的一个或多个条目1502添加至重定向表1500。例如,对于每一个已移动数据块322,重定向表调节器1702生成条目1502,该条目 1502将已移动数据块322的局部标识符指示为局部标识符1504并将该已移动数据块322 的新偏移值指示为已改变的块偏移值1506。在步骤1606,块容器头部中的阶段指示由于步骤1602而增大。例如,如图7中所示出地,阶段增量器1704接收已移动数据块指示1706,该已移动数据块指示1706指示数据块已在图12的块容器304中移动过了,如通过已移动数据块指示1706中接收到的块容器标识符来标识。因此,阶段增量器1704修改块容器304的块容器阶段指示1204。例如, 在一实施例中,块容器阶段指示1204可具有初始值0,并且每当在块容器304中移动数据块322时,都可增加块容器阶段指示1204来指示更高的阶段值。在其他实施例中,可以其他方式来修改块容器阶段指示1204。因此,当使用存储在引用流映射310中的数据块标识符(图13中的数据块标识符 1300)来查找图12的块容器304中的数据块322时,可检查块容器304的块容器阶段指示 1204以查看块容器304的当前阶段是否与数据块标识符1300中的块容器阶段值1306相同。如果它们相同,则可将数据块322定位在由数据块标识符1300中的块偏移值1306所指示的偏移处。如果不同,则读取重定向表1500来确定数据块322在块容器304中的已改变偏移值。例如,图18示出根据一示例实施例的用于定位块容器中的数据块的流程图1800。 例如,可由图11中的再水合模块1102在从流映射再水合数据流时执行流程图1800。参考图19描述流程图1800如下。图19根据一示例实施例示出再水合模块1930的框图,该再水合模块1930与流容器302和块容器304进行通信以根据数据流请求1019来再水合数据流。如图19中所示出地,再水合模块1930包括数据流组装器1902、阶段检查器1906和数据块检索器1908。基于有关流程图1800的讨论,进一步的结构及操作的实施例对于相关领域的技术人员将是显而易见的。流程图1800和系统19描述如下。在图19中,数据流组装器1902接收数据流请求1910,该数据流请求1910指示与要被再水合的数据流相对应的流映射(诸如,存储在流容器302中的流映射1904)。数据流组装器1902处理流映射1904,从而为被流映射1904引用的每一数据块生成数据块请求 1912。流程图1800开始于步骤1802。在步骤1802中,接收对数据块的请求,该请求包括数据块的标识符,该数据块标识符包括块容器标识符、局部标识符、块容器阶段值和第一块偏移值。例如,在一实施例中,由数据流组装器1902所生成的数据块请求1912可包括图 13中的数据块标识符1300,以标识所请求的数据块322。如图13中所示出地,数据块标识符1300可包括所请求的数据块322的块容器标识符1302、局部标识符1304、块容器阶段值 1306和块偏移值1306。定位具有与数据块标识符1300中的块容器标识符1302相匹配的块容器标识符1202的块容器。例如,所定位的块容器可以是图3中的块容器304。检索到所请求的数据块之后,访问所定位的块容器。操作行进至步骤1804。在步骤1804,确定匹配块容器标识符的块容器的阶段标识符是否匹配块容器阶段值。例如,如图19中所示出地,阶段检查器1906接收对所请求的数据块的数据块请求1912。 阶段检查器1906访问块容器304(以上被标识为具有与所请求的数据块322的块容器标识符1302相匹配的块容器标识符120 。阶段检查器1906被配置为将块容器304的块容器阶段指示1204与所请求的数据块322的块容器阶段值1306进行比较,并输出阶段匹配指示1914。如果它们的值不匹配(例如,块容器阶段指示1204的值大于所请求的数据块 322的块容器阶段值1306的值),则阶段匹配指示1914指示未找到匹配,并且操作行进至步骤1806。如果它们的值确实匹配,则阶段匹配指示1914指示找到匹配,且操作行进至步骤1810,在步骤1810中可沿着用于检索所请求的数据块的标准I/O路径(或,其他路径) 而行。在步骤1806,搜索与块容器相关联的重定向表,以查找包括对局部标识符的匹配的条目,该条目包括与第一块偏移值不同的第二块偏移值。例如,如图19中所示出地,数据块检索器1908接收阶段匹配指示1914和数据块请求1912。如果阶段匹配指示1914指示在步骤1804中找到了匹配,则数据块检索器1908访问重定向表1500以得到条目1502中具有局部标识符1504的已改变块偏移值1506 (图15),该局部标识符1504匹配于所请求的数据块322的局部标识符1304。如图19中所示出地,数据块检索器1908接收与块偏移值 1306的第一块偏移值不同的第二块偏移值1916。操作行进至步骤1808。在步骤1808中,从块容器检索在第二块偏移值处的数据块。例如,如图19中所示出地,数据块检索器1908访问块容器304以得到位于第二块偏移值1916的数据块H 数据块32 是已在块容器304中从块偏移值1306移动至第二块偏移值1916的所请求的数据块322。如图19中所示出地,数据块检索器1908输出数据块1918,在当前示例中数据块 1918就是数据块32&。数据块1918被数据流组装器1902接收。通过这种方式中,数据流组装器1902从数据块检索器1908处接收被流映射1904引用的所有数据块322,这些数据块要么是根据相应的块偏移值1306直接从块容器304处检索到的,要么是在被重定向表 1500进行重定向时从块容器304处检索到的。如图19中所示出地,数据流组装器1902生成数据流1920,该数据流1920是数据流请求1910中指示的所请求的数据流的再水合形式。 如此处到处描述地,数据流组装器1902将检索到的所有数据块322组装在一起来形成数据流 1920。注意,驻留在数据流的重解析点处的流映射引用标识符(例如,图10中的流链接 1008a或1008b)可与图13中的数据块标识符1300具有相同的结构。如上所述,流映射310 可具有数据块322的形式,其包含流映射元数据而不包含最终用户文件数据。因此,定址流映射310的过程可与定址数据块322相同——两种技术都可使用数据块标识符1300的结构。经优化的数据流通过将流映射310的数据块标识符1300放置在文件重分析点(附属于实际数据流/文件对象)处来引用流映射310。流映射标识符包含[容器标识符、局部标识符、阶段值、偏移值]信息,该信息可用于(直接地或者通过重定向表)将流映射310定位到流容器302内部的数据块。因此,在一实施例中,流容器302的格式和布局可以与块容器304的格式和布局实质上相同。D.示例性块存储碎片整理实施例位置是优化数据访问等待时间中的一个因素,其中在将与特定数据流相关联的各数据块顺序地定位时,可更快速地访问这些数据块。如上所述,数据去重复会在数据流被分解成数据块时引入碎片。常见的数据访问模式是串行I/O操作。串行I/O可在应用程序将来自存储的整个文件读入内存时被执行,从而在该过程中再水合文件。存储中的文件内的任何碎片都将导致串行I/O操作中的盘查找,这些盘查找减少了 I/O的吞吐量并由此增加了再水合的等待时间。另外,额外的盘查找会给盘资源增加负荷。如果被块存储使用的盘是与其他数据共享的,则该盘上的额外负荷也将使有关该其他数据的I/O操作变慢。本小节提供各种碎片整理实施例,这些碎片整理实施例实现改进的数据块等待时间以及减少的碎片。一些实施例可选定在数据去重复的级别和碎片的级别之间的折衷,以实现有关数据访问的较少等待时间。例如,在一实施例中,通过增加相邻块序列的数目和/ 或长度来减少块存储中的碎片。“相邻块序列”是一组相邻存储的数据块,该相邻存储的数据块表示一个或多个经优化数据流的数据段。在另一实施例中,可重组织存储在块存储中的数据块的次序,使得较可能被访问的已存储数据流具有相邻存储的数据块,这是以较低优先级的已存储数据流为代价的。这些实施例可减少碎片和/或可基于再水合的可能性排定碎片整理的优先级。例如,图20示出了根据一示例实施例的用于存储数据流的流程图2000。出于说明的目的,参考图21描述流程图2000。图21根据一示例实施例示出用于以优化形式将数据流存储在流容器302和块容器304中的数据流存储系统的框图。在一实施例中,系统2102 可根据流程图2000来操作。如图21中所示出地,数据流存储系统2102包括数据块累积器 2104和流映射生成器2106。例如,在一实施例中,可将数据流存储系统2102实现在图1中的块存储接口 116中。基于有关流程图2000的讨论,进一步的结构及操作的实施例对于相关领域的技术人员将是显而易见的。流程图2000和系统2102描述如下。流程图2000开始于步骤2002。在步骤2002中,存储对重复数据块的最小可允许数的指示。例如,如图21中所示出地,将指示2108存储在系统2102中。指示2108是对可能被存储在块容器304中的重复数据块的最小可允许数的指示。指示2108的值可以由用户来提供、可以根据算法来计算、或者可以以其他方式来设定或确定。指示2108可以在根据流程图2000优化数据流之前预先设定,并且可按需改变。在一实施例中,可将指示2108 存储在任何类型的存储中,包括存储器、硬盘驱动器、和/或此处到处提到的或以其他方式已知的其他类型的存储中。例如,指示2108可以是大于1的整数。根据指示2108的值(例如,N值),数据流必须具有至少N个重复在先存储文件中的那些数据块的数据块的“相邻块序列”,否则该数据块序列中的数据块将不会被优化。操作从步骤2002行进至步骤2004。在步骤2004中,数据块的序列是从数据流累积的。例如,如图21中所示出地,数据块累积器2104接收数据块2114 (例如,图1中的数据块124),这些数据块2114是来自数据流的数据块的序列。数据块累积器2104将各数据块2114累积成序列。数据块累积器 2104可将所接收的数据块累积在存储器或其他存储中。操作从步骤2004行进至步骤2006。在步骤2006中,确定所累积的数据块序列是否与已存储的数据块序列相匹配,已存储的数据块序列被相邻地存储在块容器中。例如,如图21出所示地,数据块累积器2104 包括序列确定器2122。序列确定器2122被配置成将由数据块累积器2104累积的数据块序列与已经以相邻的方式存储在块容器304中的数据块的序列(例如,数据块的重复序列) 进行比较。例如,如图21中所示出地,数据块累积器2104从流容器302接收流映射2112。 流映射2112包括具有存储在块容器304中的数据块的数据流的流映射。流确定器2122可接收流映射2112,并可使用流映射2112的元数据来确定块容器304中相邻存储的数据块序列。例如,序列确定器2122可将相邻存储的数据块序列确定为流映射2112中引用的、具有位置指示406(图4)的相同值的那些数据块。在其他实施例中,序列确定器2122可使用用于确定块容器304中的相邻存储的数据块序列的其他技术。如果由数据块累积器2104累积的各数据块的序列匹配于(是如下序列的重复)被流映射2112引用的、具有相同位置指示符406的各数据块的序列,则序列确定器2112指示匹配被确定,并且操作从步骤2006行进至步骤2008。否则,序列确定器2122指示未找到匹配,并且操作行进至步骤2010。在步骤2008,确定所累积的序列是否包括大于或等于已存储指示的数据块数。例如,如图21中所示出地,数据块累积器2104包括序列比较器2110。序列比较器2110接收指示2108 (例如,从存储处),并从数据块累积器2104处接收所累积的数据块序列。如果所累积的数据块序列包括大于或等于指示2108的数据块数,则操作从步骤2008行进至步骤2102。否则,步骤再次行进至步骤2004,其中数据块累积器2104从数据块2114处累积下一数据块(例如,作为“最后进入的”数据块)。在步骤2010中,存储所累积的序列中的第一数据块,并将该第一数据块从所累积的序列中移除。例如,参考图21,数据块累积器2104可将所累积的数据块序列中的第一数据块(例如,“最先进入的”数据块)作为数据块2118而存储在块容器304中当前存储在块容器304中的最后数据块322之后(例如,图21的示例中的数据块32 之后)。将数据块 2118从数据块累积器2104中的所累积序列处移除。操作从步骤2010行进至步骤2004,在步骤2004中数据块累积器2104从数据块2114处累积下一数据块(例如,作为“最后进入的”数据块)。在步骤2012处,将指向已存储数据块序列的指针存储在数据流的映射中。例如,如图21中所示出地,数据块累积器2103可为当前累积的数据块序列生成存储指针指示 2116。存储指针指示2116由流映射生成器2106接收。流映射生成器2106被配置成生成与数据块2114的数据流相对应的流映射2120。存储指针指示2116指示流映射生成器2106 将所累积的数据块序列中的各数据块的每一个的指针(例如,数据块标识符404)存储在流映射中,以引用被确定为匹配该所累积的序列的已存储的数据块序列。流映射生成器2106 可以以(包括此处到处描述的)任何方式生成这些指针(例如,流映射生成器2106可包括图6中的元数据生成器606)。将所累积的数据块序列从数据块累积器2104处移除,并且操作从步骤2012行进至步骤2004,在步骤2004处数据块累积器2104从数据块2114累积下一数据块。注意,关于步骤2010,其中将数据块2118存储在块容器304中,数据块累积器 2104生成存储指针指示2116来指令流映射生成器2106将数据块2118的指针存储在流映射2120中。此外,注意到可继续流程图2000直到数据块2114中没有接收到更多数据块为止。在这种情况下,流映射生成器2106可完成对流映射2120的生成,并可将流映射2120 存储在流容器302中。例如,在一示例中,对重复数据块的最小可允许数的指示2108可以是5。数据块累积器2104可累积四个数据块,这四个数据块复制(匹配)(如由序列确定器2122在步骤 2006中所确定的)已存储的四个数据块的序列。然而,序列比较器2110确定(在步骤2008 中)四个数据块的数目小于指示2108的值。数据块累积器2104累积第五个数据块(在步骤2004中)。如果序列确定器2122确定(在步骤2006中)五个所累积的数据块复制了已存储的五个数据块的序列,则序列比较器2110确定(在步骤2008)五个数据块的数目等于指示2108的值,并且根据步骤2012来优化这五个所累积的数据块(例如,将指向已存储的数据块序列的指针用于由流映射生成器2106为这五个所累积的数据块所生成的流映射中)。如果序列确定器2122已确定(在步骤2006中)这五个所累积的数据块不匹配已存储的五个数据块的序列,则移出第一或“最旧”数据块,并累积新的数据块(在步骤2004)。注意,将流程图2000的示例作为示例实施例来提供。在另一实施例中,可遵守“N 大小的相邻组”,使得在尝试将整个序列与另一数据流进行匹配之前施加新数据流中的N个块的序列。此外,如果图21中的系统2102由于碎片整理而存储了已经存储在块容器304 中的数据块,则系统2102可向具有新块标识符的调用程序报告这个改变。相反,使用散列索引的解决方案可决定用相同块的另一示例来更新该索引。根据图20和21中的实施例,如果第二数据流中的N个相邻数据块重复第一流中的数据块,则优化第一数据流中的各数据块,并且为第一数据流生成的流映射将引用第二数据流中的各数据块。当对以这种方式存储的数据流执行再水合时,被执行的盘查找被减少成对(NX数据块大小)序列执行的那些盘查找,而不是对单个块大小序列执行的盘查找,并且最大碎片是默认算法的1/N。同时,数据去重复率更低,因为数据块未被优化,并如果它们的重复不遵守N个相邻块条件,则为它们存储重复数据块。图22示出了根据另一示例实施例的用于存储数据流的流程图2200。出于说明的目的,参考图23来描述流程图2200。图23示出根据一示例实施例的用于将数据流以优化形式存储在流容器302和块容器304中的数据流存储系统2302的框图。在一实施例中,系统2302可根据流程图2200来操作。如图23中所示出地,数据流存储系统2302包括数据块序列化器2304、流映射生成器2306和数据块分段器2308。例如,在一实施例中,可将数据流存储系统2302实现在图1中的块存储接口 116中。基于有关流程图2200的讨论,进一步的结构及操作的实施例对于相关领域的技术人员将是显而易见的。流程图2200和系统2302描述如下。流程图2200开始于步骤2202。在步骤2202,存储碎片因子。例如,如图23中所示出地,碎片因子2310被存储在系统2302中。碎片因子2310是对所接收数据流2314的指定部分所允许的碎片的最大数量的指示。碎片因子2310的值可以由用户来提供、可以根据算法来计算、或者可以以其他方式来设定或确定。可在根据流程图2200来优化数据流之前预先设定碎片因子2310,并且可按需改变该碎片因子。在一实施例中,可将碎片因子2310 存储在任何类型的存储中,包括存储在存储器、硬盘驱动器、和/或此处到处提到的或以其他方式已知的其他类型的存储中。例如,碎片因子2310可以是大于一的整数。例如,在一个示例中,可将碎片因子2310定义成每1MB经优化的数据含3个碎片组,或者可以具有其他值。在步骤2204中,接收包括多个数据块的数据流的一部分。例如,如图23中所示出地,数据块序列化器2304接收数据流2314。数据块序列化器2304可接收数据流2314的一部分来处理。可接收数据流2314的任何部分大小,包括1MB、更大部分大小或更小部分大在出于说明目的而提供的一个示例中,数据块序列化器2304可接收数据流2314 的1MB部分,该部分包括16个数据块(具有大约64KB的平均数据块大小)。在步骤2206中,确定多个数据块中的多个数据块序列,所确定的每一个数据块序列包括与相邻存储在块容器中的已存储数据块序列相匹配的数据块序列。例如,数据块序列化器2304可被配置成分析数据流2314的所接收部分,以确定此处与块容器304中的已存储数据块序列相匹配的一个或多个数据块序列。例如,如图23中所示出地,数据块序列化器2304从流容器302处接收数据流2312。流映射2312包括具有存储在块容器304中的数据块的数据流的流映射。数据块序列化器2304可接收流映射2312,并可使用流映射 2312中的元数据来确定块容器304中相邻存储的数据块序列。例如,由于在具有相同的位置指示符406(图4)的值的流映射2312中引用的那些数据块,数据块序列化器2304可确定相邻存储的数据块序列。在其他实施例中,数据块序列化器2304可使用其他技术来确定块容器304中相邻存储的数据块序列。如图23中所示出地,数据块序列化器2304输出经序列化的数据块2316,该经序列化的数据块2316指示包括在数据流2314的所接收部分中的所有数据块,并指示哪些数据块包括在数据块序列中。例如,继续以上示例,可在16个所接收数据块中确定三个数据块序列数据块1-5 可以是不唯一的,它们匹配与第二数据流相关联的五个已存储数据块的相邻序列;数据块 6可以是唯一的;数据块7-8可以是不唯一的,它们匹配与第三数据流相关联的两个已存储数据块的相邻序列;数据块9可以是唯一的;以及,数据块10-16可以是不唯一的,它们匹配与第四数据流相关联的七个已存储数据块的相邻序列。在步骤2208中,将多个数据块分段成与碎片因子相对应的数目的数据块组,其中所确定的每一个数据块序列中的数据块被一起包括在一数据块组中。例如,如图23中所示出地,数据块序分段器2308接收经序列化的数据块2316。数据块分段器2308被配置成将经序列化的数据块2316分段成与碎片因子2310相对应的数目的数据块组,诸如少于或等于碎片因子2310的值的多个数据块组。在一实施例中,数据块分段器2308可被配制成以实现改进的和/或最大的数据去重复的方式来分段经序列化的数据块2316,(例如,以最小化用于再水合相应的数据流的存储查找的数目)。例如,在一个实施例中,数据块分段器2308可被配置成分段经序列化的数据块 2316,使得各数据块组中的一个或多个各自仅包括数据块序列(例如,仅包括包括在由数据块序列化器2304所确定的在数据块序列中的数据块),并使得剩下的数据块组各自包括各唯一的数据块或者包括各唯一的数据块和各数据块序列的组合。被选择来包括在仅包含数据块序列的数据块组中的各数据块序列可以因为它们是最长的数据块序列和/或是基于其他因子的而被选择。例如,继续以上示例,碎片因子2310可具有值三。在这一示例中,数据块1-5(与第二数据流的数据块序列相对应)可被包括在第一数据块组中,数据块6-9 (包括唯一的块6、 与第三数据流的数据块序列相对应的数据块7和8、以及唯一的块8)可被包括在第二数据块组中,并且数据块10-16(与第四数据流的数据块序列相对应)可被包括在第三数据块组中。在这个示例中,第一和第三数据块组仅包括数据块序列(数据块1-5和数据块10-16), 且第二数据块组包括唯一的数据块(数据块6和数据块9)以及数据块序列(数据块7-8) 的组合。因此,两个最长的数据块序列(数据块1-5和数据块10-16)各自包括在它们自己的数据块组中。在步骤2210中,将数据块的指向已存储的数据块序列的指针存储在数据块组的第一分组中。例如,在一实施例中,可将由数据块分段器2308分配的各数据块组分解成两个分组数据块组的第一分组,该第一分组仅包括数据块序列;以及数据块组的第二分组, 该第二分组仅包括唯一的数据块或者包括唯一的数据块和数据块序列的组合。将数据块组的第一分组作为重复来处理,这意味着取代将第一分组实际存储在块容器304中,而是将该第一分组作为指向已经存储的匹配数据块的指针来存储。此外,将数据块组的第二分组作为相邻的新数据块而存储在块容器304中。仍将第二分组中是已经存储在块容器304中的数据块的重复的各数据块存储在块容器304中,结果导致过多的“去重复丢失”数据块, 但有助于减少碎片。如图23中所示出地,数据块分段器2308可为数据块组的第一分组生成存储指针指示2320。存储指针指示2320被流映射生成器2306接收。流映射生成器2306被配置成生成与数据块2314的数据流相对应的流映射2322。存储指针指示2320指令流映射生成器2306将数据块组的第一分组中每一个数据块的指针(例如,数据块标识符404)存储在流映射2322中,以引用与第一分组中的数据块序列相匹配的已存储数据块序列。流映射生成器2306可以包括如此处到处描述的任何方式来生成这些指针(例如,流映射生成器2306 可包括图6中的元数据生成器606)。例如,继续以上示例,数据块分段器2308可包括第一分组中的第一和第三数据块组(数据块1-5和数据块10-16)。数据块分段器2308可生成存储指针指示2320来指示指向与数据块1-5和数据块10-16相对应的已存储的数据块序列的指针要被存储在数据块 1-5和数据块10-16的流映射2322中。在步骤2212中,将多个数据块中除数据块组的第一分组中的那些数据块以外的数据块存储在块容器中。例如,在一实施例中,数据块分段器2308可将数据块2318存储在块容器304中。数据块2318包括由数据块分段器2308分配的数据块组的第二分组中的各数据块。而且,数据块分段器2308可为数据块组的第二分组生成第二存储指针指示2320。 第二存储指针指示2320被流映射生成器2306接收。第二存储指针指示2320指令流映射生成器将指向在步骤2212处新近存储在块容器304中的每一个数据块2318的指针存储在流映射2322中。例如,继续以上示例,数据块分段器2308可包括第二分组中的第二数据块组(数据块6-9)。数据块6-9可以被新近存储在块容器304中当前存储于其中的最后数据块之后。数据块分段器2308可生成第二存储指针指示2320来指示指向块容器中新近存储的数据块6-9的指针要被存储在流映射2322中。因此,在这个示例中,当与数据块1-16相对应的数据流被再水合时,该1MB部分的碎片被限制为三个,并且因此执行不多于三个的盘查找(对数据块1-5的第一查找、对数据块6-9的第二查找、对数据块10-16的第三查找)。相反,如果数据流被全部优化,则将存在与以下五组数据块相对应的五个盘查找1-5、6、7-8、9、10-16。因此,根据与流程图2200和图23相对应的各实施例,数据去重复率可被减少,从而使得碎片被限制并且是可预测的。图对和25示出根据另一示例实施例的用于重组织已存储数据流的流程图MOO 和2500。出于说明的目的,参考图沈来描述流程图MOO和2500。图沈示出根据一示例实施例的用于重组织使用流容器302和块容器30 来存储的各数据块的存储重组织系统 2602的框图。在一实施例中,系统沈02可根据流程图MOO和2500来操作。如图沈中所示出地,存储重组织系统2602包括数据块重组织器沈04和数据流优先级区分器沈06。例如,在一实施例中,可将存储重组织系统沈02实现在图1中的块存储接口 116或维护模块 106中。基于有关流程图MOO和2500的讨论,进一步的结构及操作的实施例对于相关领域的技术人员将是显而易见的。流程图MOO和2500以及系统沈02描述如下。流程图MOO开始于步骤M02。在步骤M02中,排定作为块容器中的数据块以及作为包括指向相应数据块的指针的流映射来存储的多个数据流的优先级。例如,如图沈中所示出地,数据块重组织器沈04接收块存储重组织请求沈10。块存储重组织请求沈10对所分配的块存储(诸如,与流容器302和块容器30 相对应的块存储)进行重组织的请求。请求沈10可以从用户处接收、可以自动生成(例如,基于周期性的或非周期性的)、或者可以具有其他来源。数据流优先级区分器2606被配置成排定由块存储所存储的数据流的优先级,该块存储包括流容器302和块容器30如。例如,在一实施例中,数据流优先级区分器沈06可被配置成使用以下各种规范来分析/计算试探(heuristics),诸如热门度索引(或者对访问频率的其他指示),它指示每一数据流最近是如何被访问的(较频繁地被访问的数据流可被给予较高的优先级);场景或应用(例如,由某一应用使用的数据流可比其他数据流具有高的优先级);数据流属性(诸如所存储的、关于Microsoft Windows (微软视窗 )的各文件的FCI (文件分类基础结构)属性);和/或其他规范。可使用试探以排序或次序(例如,以从最高优先级数据流到最低优先级数据流的次序)来排定数据流的优先级。如图沈中所示出地,数据流优先级区分器沈06生成数据流优先级沈08。注意, 在一实施例中,可将数据流优先级2608的数据流优先级存储在具有流映射沈12的流容器 302中(例如,存储在每一流映射的流映射元数据中)。
在步骤M04中,根据优先顺序来确定多个数据流中的已存储数据块的重组织。例如,如图沈中所示出地,数据块重组织器沈04接收数据流优先级沈08。数据块重组织器 2604被配置成根据数据流优先级沈08来重组织存储在块容器30 中的数据块沈16。例如,数据块重组织器2604可被配置成一个数据流接一个数据流地重组织各数据流中的数据块,该重组织起始于最高优先级数据流并终止于最低优先级数据流。在一实施例中,数据块重组织器沈04被配置成重新定位或重新分配块容器30 中的数据块,以在该重新定位不会导致具有较高优先级的数据流比重定位后的数据块的数据流具有增加的碎片时,仅重新定位数据块。在步骤M06中,根据所确定的重组织来生成用于存储多个数据流中的数据块的第二块容器。例如,如图沈所示出地,数据块重组织器沈04可生成第二块容器304b (例如, 如本文别处描述的)。数据块重组织器沈04将重组织后的数据块沈14存储在第二块容器 304b中。注意,第一块容器30 中的数据块沈16以及第二块容器304b中的重组织后的数据块沈14可包括相同的数据块。然而,重组织后的数据块沈14在第二块容器304b中所具有的存储次序与数据块2616在第一块容器30 中的存储次序不同。注意,在一替换实施例中,并不生成第二块容器304b来存储经识别的数据块1614,而是可将经识别的数据块 2614存储在第一数据块容器30 中。在步骤M08中,将流映射的指针修改成指向存储在第二块容器中的数据块。例如,如图沈中所示出地,数据块重组织器沈04可生成存储在流映射沈12中的经更新的指针沈18。经更新的指针沈18包括指向重组织后的数据块沈14在第二块容器304b中的新位置的指针,这些指针替换之前存储在流映射2612中的、指向数据块沈16在第一块容器 30 中的位置的指针。因此,在各实施例中,数据块重组织器沈04可重新分配块容器中的数据块,以便这些数据块以如下方式来存储较高优先级的数据流可具有比较低优先级的数据流具有的碎片更少的碎片。例如,在一实施例中,根据图25中的流程图2500,步骤M04可由数据块重组织器沈04以较高优先级的数据流到较低优先级的数据流的次序对每一数据流执行。 在步骤2502,选择数据流。可能已经根据在此描述的或以其他方式已知的过程对所选的数据流进行了去重复。在步骤2504中,通过转移比所选的数据流具有更低优先级的数据流中的至少一个数据块,将由所选的数据流的流映射的指针所指向的一个或多个数据块重定位成比重定位之前更为相邻。在其他实施例中,数据块重组织器沈04可以以其他方式来重新分配块容器中的数据块。因此,流程图MOO和2500以及图沈中的各实施例执行后台扫描以及对块存储的重组织,使得在不破坏去重复的节约的情况下改变数据块位置。例如,第一数据流可能之前已被优化成具有相邻存储在块容器30 中的数据块{C1,C2,C3,C4,C5}。第二数据流可能之后已被优化成具有数据块IC3,C4,C5,C6,C7},使得数据块C3-C5以指向块容器30 中的第一数据流中的C3-C5的指针的方式来存储。因此,第一和第二数据流可被存储成Cl, C2,C3,C4,C5. . . C6,C7 (其中“...”表示一个或多个中间数据块)。在这种情况下,对第一数据流的再水合并不使用任何额外的查找。然而,对第二数据流的再水合使用(从C3、C4、 C5移动到C6、C7的)额外的盘查找,因为数据块C3-C5被存储在经优化的第一数据流中, 而第二数据块C6-C7被存储在经优化的第二数据流中。
然而,在这个示例中,第二数据流可具有比第一数据流多十倍的数据访问的可能性。因此,第二数据流可具有比第一数据流更高的优先级,并因此可以根据流程图MOO和 2500以及图沈中的各实施例以第一数据流为代价优化第二数据流。例如,各数据块可被重组织,从而使得块C3-C7而非块C1-C5被相邻地存储。例如,如上所示出地,之前的数据块存储安排可以是(1^2丄3^4,〇5. · · C6,C7。重组织后的数据块存储安排可以是Cl,C2. . . C3, C4,C5,C6,C7,其中数据块C3-C5被移动成与数据块C6和C7相邻。此外,与第一和第二数据流相对应的流映射可被修改成指向数据块C1-C7的新位置。在执行了这个碎片整理后, 对第一数据流的再水合使用一个盘查找(来将盘头部从Cl,C2移除至C3,C4,C5),而对第二数据流的再水合并不使用任何盘查找。III.示例计算设备实施例数据去重复模块104、维护模块106、数据流API 110、块维护API 112、数据访问 API 114、块存储接口 116、数据流解析器602、数据块存储管理器604、元数据生成器606、 流映射生成器608、元数据收集器802、位置指示符生成器804、再水合模块1102、重定向表调节器1702、阶段增量器1704、数据流组装器1902、阶段检查器1906、数据块检索器1908、 数据流存储系统2102、数据库累积器2104、流映射生成器2106、序列比较器2110、序列确定器2122、数据流存储系统2302、数据块序列化器2304、流映射生成器2306、数据块分段器2308、存储重组织系统沈02、数据块重组织器2604、以及数据流优先级区分器沈06可以被实现在硬件、软件、固件或其组合中。例如,数据去重复模块104、维护模块106、数据流 API 110、块维护API 112、数据访问API 114、块存储接口 116、数据流解析器602、数据块存储管理器604、元数据生成器606、流映射生成器608、元数据收集器802、位置指示符生成器 804、再水合模块1102、重定向表调节器1702、阶段增量器1704、数据流组装器1902、阶段检查器1906、数据块检索器1908、数据流存储系统2102、数据库累积器2104、流映射生成器 2106、序列比较器2110、序列确定器2122、数据流存储系统2302、数据块序列化器2304、流映射生成器2306、数据块分段器2308、存储重组织系统沈02、数据块重组织器沈04、和/或数据流优先级区分器2606可被实现为被配置成在一个或多个处理器中执行的计算机程序代码。或者,数据去重复模块104、维护模块106、数据流API 110、块维护API 112、数据访问API 114、块存储接口 116、数据流解析器602、数据块存储管理器604、元数据生成器606、 流映射生成器608、元数据收集器802、位置指示符生成器804、再水合模块1102、重定向表调节器1702、阶段增量器1704、数据流组装器1902、阶段检查器1906、数据块检索器1908、 数据流存储系统2102、数据库累积器2104、流映射生成器2106、序列比较器2110、序列确定器2122、数据流存储系统2302、数据块序列化器2304、流映射生成器2306、数据块分段器 2308、存储重组织系统沈02、数据块重组织器沈04、和/或数据流优先级区分器沈06可被实现为硬件逻辑/电子电路。图27描绘了其中可以实现本发明的各实施例的计算机2700的示例性实现。例如, 存储系统102和/或其任何部分可被实现在类似于计算机2700的一个或多个计算机系统中,这些计算机系统包括计算机2700的一个或多个特征和/或各另外的特征。计算机2700 可以是例如常规个人计算机、移动计算机或工作站形式的通用计算设备,或者,计算机2700 可以是特殊用途的计算设备。此处所提供的对计算机2700的描述只是为了说明,并不是限制性的。如相关领域的技术人员所知道的,本发明的各实施例可以在其他类型的计算机系统中实现。如图27所示,计算机2700包括处理单元2702、系统存储器2704,以及将包括系统存储器2706的各种系统组件耦合到处理单元2704的总线2702。系统总线2706表示若干类型的总线结构中的任何一种总线结构的一个或多个,包括存储器总线或存储器控制器、 外围总线、加速图形端口,以及使用各种总线体系结构中的任何一种的处理器或局部总线。 系统存储器2704包括只读存储器(ROM) 2708和随机存取存储器(RAM) 2710。基本输入/输出系统2712 (BIOS)存储在ROM 2708中。计算机2700还具有一个或多个以下驱动器用于读写硬盘的硬盘驱动器2714、用于读或写可移动磁盘2718的磁盘驱动器2716、以及用于读或写诸如⑶R0M、DVD ROM或其他光介质之类的可移动光盘2722的光盘驱动器2720。硬盘驱动器2714、磁盘驱动器2716, 以及光驱动器2720分别通过硬盘驱动器接口 2724、磁盘驱动器接口 2726,以及光学驱动器接口 27 连接到系统总线2706。驱动器以及它们相关联的计算机可读介质为计算机提供了对计算机可读指令、数据结构、程序模块,及其他数据的非易失存储器。虽然描述了硬盘、可移动磁盘和可移动光盘,但是,也可以使用诸如闪存卡、数字视频盘、随机存取存储器 (RAM)、只读存储器(ROM)等等之类的其他类型的计算机可读介质来存储数据。数个程序模块可被存储在硬盘、磁盘、光盘、ROM,或RAM上。这些程序包括操作系统2730、一个或多个应用程序2732、其他程序模块2734,以及程序数据2736。应用程序2732 或程序模块2734可包括例如用于实现以下各项的计算机程序逻辑数据去重复模块104、 维护模块106、数据流API 110、块维护API 112、数据访问API 114、块存储接口 116、数据流解析器602、数据块存储管理器604、元数据生成器606、流映射生成器608、元数据收集器 802、位置指示符生成器804、再水合模块1102、重定向表调节器1702、阶段增量器1704、数据流组装器1902、阶段检查器1906、数据块检索器1908、数据流存储系统2102、数据库累积器2104、流映射生成器2106、序列比较器2110、序列确定器2122、数据流存储系统2302、数据块序列化器2304、流映射生成器2306、数据块分段器2308、存储重组织系统沈02、数据块重组织器沈04、数据流优先级区分器沈06、流程图700-、流程图900、流程图1600、流程图 1800、流程图2000、流程图2200、流程图M00、和/或流程图2500(包括流程图700、900、 1600、1800、2000、2200、2400 和 2500 中的任何步骤)。用户可以通过诸如键盘2738和定点设备2740之类的输入设备向计算机2700中输入命令和信息。其他输入设备(未示出)可包括话筒、操纵杆、游戏手柄、圆盘式卫星天线、扫描仪等。这些及其他输入设备常常通过耦合到总线2702的串行端口接口 2742连接到处理单元2706,但是,也可以通过其他接口,诸如并行端口、游戏端口、通用串行总线(USB) 端口,来进行连接。显示设备2744也通过诸如视频适配器2746之类的接口连接到总线2706。除了监视器之外,计算机2700还可包括其他外围输出设备(未示出),如扬声器和打印机。计算机2700通过适配器或网络接口 2750、调制解调器2752、或用于通过网络建立通信的其他装置连接到网络2748 (例如,因特网)。调制解调器2752 (可以是内置的或外置的),通过串行端口接口 2742连接到系统总线2706。如此处所使用的,术语“计算机程序介质”和“计算机可读介质”被用来泛指诸如与硬盘驱动器2714相关联的硬盘、可移动磁盘2718、可移动光盘2722,以及诸如闪存卡、数字视频盘、随机存取存储器(RAM)、只读存储器(ROM)等等之类的其他介质。如上文所指示的,计算机程序和模块(包括应用程序2732及其他程序模块2734) 可被存储在硬盘、磁盘、光盘、ROM或RAM上。这样的计算机程序也可以通过网络接口 2750 或串行端口接口 2742来接收。这样的计算机程序,当由应用程序执行或加载时,使得计算机2700能实现此处所讨论的本发明的特征。相应地,这样的计算机程序表示计算机2700 的控制器。本发明还涉及包括存储在任何计算机可使用介质上的软件的计算机程序产品。这样的软件,当在一个或多个数据处理设备中执行时,使数据处理设备如此处所描述的那样操作。本发明的各实施例使用现在已知的或将来已知的任何计算机可使用或计算机可读介质。计算机可读介质的示例包括,但不仅限于,诸如RAM、硬盘驱动器、软盘、⑶ROM、DVD ROM、zip磁盘、磁带、磁存储设备、光存储设备、MEM(存储器)、基于纳米技术的存储设备等等之类的存储设备。VI.结论尽管上文描述了本发明的各实施例,但是,应该理解,它们只是作为示例来呈现的,而不作为限制。那些精通有关技术的人员将理解,在不偏离如所附权利要求书所定义的本发明的精神和范围的情况下,可以在形式和细节方面进行各种修改。因此,本发明的范围不应该受到上述示例性实施例的任一个的限制,而只应根据下面的权利要求和它们的等效内容进行定义。
权利要求
1.一种方法(700),包括将数据流解析(70 成数据块序列;确定(704)所述数据块序列中的任何一个数据块是否被存储在包括多个数据块的块容器中;以及将所述数据块序列中被确定为没有存储在所述块容器内的各数据块以相邻的排列并在所述块容器中以与所述数据流中的顺序相同的顺序存储(706)在所述块容器中。
2.根据权利要求1所述的方法,其特征在于,还包括生成所述数据块序列中的每一个数据块的元数据,所述数据块序列中的数据块的元数据包括该数据块在所述数据流中的偏移、指向该数据块在所述块容器中的位置的指针、以及该数据块的位置指示符。
3.根据权利要求2所述的方法,其特征在于,还包括生成所述数据流的流映射,所述流映射包括所生成的元数据;以及将所述流映射持久存储在块存储中,所述块存储包括所述块容器。
4.根据权利要求1所述的方法,其特征在于,还包括将第二数据流解析成第二数据块序列;确定所述第二数据块序列的第一组数据块包括一个或多个数据块,该一个或多个数据块是已经存储在所述块容器中的各数据块的重复,并确定所述第二数据块序列的第二组数据没有被存储在所述块容器中;将所述第二组数据块以接着所述第一数据块序列中的已存储数据块的相邻的排列并以与所述第二数据流中的顺序相同的顺序存储在所述块容器中;以及存储所述第一组数据块中的每一个数据块的、指向已经存储在所述块容器中的相应数据块的指针。
5.如权利要求4所述的方法,其特政在于,所述第二数据流中的每一个数据块具有相关联的元数据,该相关联的元数据包括该数据块在所述第二数据流中的偏移、指向该数据块在所述块容器中的位置的指针、以及该数据块的位置指示符,其中所述第一数据块序列中的每一个数据块具有所述位置指示符的第一值,所述方法还包括将所述第一值分配给所述第一组数据块中的每一个数据块的位置指示符;选择与所述第二数据流相关联的新位置指示符值;以及将所述新位置指示符值分配给所述第二组数据块中的每一个数据块的位置指示符。
6.根据权利要求1所述的方法,其特征在于,还包括响应于对数据流的请求执行第一查找,以在所述块容器中定位所请求的数据流的第一组数据块中的第一个数据块,从所述块容器顺序地读取所述第一组数据块,执行第二查找,以在所述块容器中定位所请求的数据流中的第二组数据块中的第一个数据块,从所述块容器顺序地读取所述第二组数据块,
7.根据权利要求1所述的方法,其特征在于,还包括生成与所述块容器相关联的重定向表,所述重定向表存储关于数据块位置改变的信肩、ο
8.根据权利要求7所述的方法,其特征在于,还包括接收对数据块的请求,所述请求包括该数据块的标识符,所述数据块标识符包括块容器标识符、局部标识符、块容器阶段值和第一块偏移值;确定所述块容器的与在所述请求中接收到的块容器标识符相匹配的阶段指示并不与在所述请求中接收到的块容器阶段值相匹配;搜索所述重定向表,以得到包括所述局部标识符的匹配的条目,该条目包括与所述第一块偏移值不同的第二块偏移值;以及从所述块容器检索在所述第二块偏移值处的数据块。
9.如权利要求8所述的方法,其特征在于,所述块容器的所述阶段指示以及所述块容器标识符被包括在所述块容器的头部中,所述方法还包括修改所述块容器的内容;将一个或多个条目添加到所述重定向表中,所述一个或多个条目指示所述块容器中的一个或多个数据块由于所述修改而改变的块偏移值;以及由于所述修改,增加所述块容器头部中的所述阶段指示。
10.如权利要求7所述的方法,其特征在于,所述关于数据块位置改变的信息将不可变的每个容器的块标识符映射至新偏移值。
11.根据权利要求8所述的方法,其特征在于,还包括在与所述数据流相关联的流映射中将所述第一块偏移值替换成所述第二块偏移值;以及从所述重定向表中删除所述条目。
12.—种计算机程序产品,包括其上记录有计算机程序逻辑的计算机可读介质,包括用于使处理器能够执行权利要求1-11中的任何一项的计算机程序逻辑装置0734)。
13.一种系统(600),包括数据流解析器,它被配置成将数据流(610)解析(70 成数据块序列(612);数据块存储管理器(604),它被配置成确定所述数据块序列(612)中的任何一个数据块是否被存储在包括多个数据块(322)的块容器(304)中,并且被配置成以相邻的排列并以与所述数据流(610)中的顺序相同的顺序将所述数据块序列(612)中被确定为没有存储在所述块容器(304)中的各数据块存储在所述块容器(304)中。
14.如权利要求13所述的系统,其特征在于,还包括元数据生成器,它被配置成生成所述数据块序列中的每一个数据块的元数据,所述数据块序列中的数据块的元数据包括该数据块在所述数据流中的偏移、指向该数据块在所述块容器中的位置的指针、以及该数据块的位置指示符。
15.如权利要求14所述的系统,其特征在于,还包括流映射生成器,它被配置成生成所述数据流的流映射,所述流映射包括所生成的元数据,并被配置成将所述流映射持久存储在块存储中,所述块存储包括所述块容器。
全文摘要
本发明涉及用于数据去重复的可缩放块存储。可以以流映射和数据块的形式将数据流存储在块存储中。可以将与数据流相对应的数据块存储在块容器中,并且与该数据流相对应的流映射可指向该块容器中的数据块。多个流映射可以被存储在流容器中,并且可以以重复数据块不存在的方式来指向块容器中的数据块。在此提供了用于定位相关数据块在这些块容器中的存储的技术、用于定位存储在块容器中的数据块的技术、用于以可增强定位性并减少碎片整理的定位方式来将数据流存储在块容器中的技术、以及用于重新组织块存储中的已存储数据流的技术。
文档编号G06F12/06GK102541751SQ201110385918
公开日2012年7月4日 申请日期2011年11月17日 优先权日2010年11月18日
发明者A·古普塔, J·R·本顿, P·A·奥尔泰安, R·卡拉赫, R·德塞, 張震河 申请人:微软公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1