经去重复文件的细粒度部分召回的制作方法_2

文档序号:9291675阅读:来源:国知局
最后优化以来被写(变脏)。为了跟踪这一范围,去重复元数据106和召回跟踪数据结构 118 (下文参考图2和3描述)被更新以反映这一部分召回状态,以知晓文件102包含脏数 据,并且以不再为这一新过期(相对于这一文件而言)的数据范围使用块存储。
[0032] 因而,细粒度部分召回一般指的是跟踪文件的哪一个或多个范围已被写(是脏 的)以及哪一些保持干净。文件因此可存在于非去重复状态、细粒度部分经去重复(细粒 度部分召回)状态或完全经去重复状态中。
[0033] 在一个实现中,去重复机制112被实现为文件系统过滤器120,结合有细粒度部分 召回机制114作为去重复机制112的子组件(例如,软件代码行)。如此处所述的,细粒度 部分召回机制114执行各种跟踪操作,包括维护关于文件的哪些范围是脏的以及哪些被保 留在块存储块中的跟踪数据。
[0034] 上述美国专利申请SN. 12/970, 848的一个或多个实现利用NTFS所提供的崩溃一 致性保证来用于重解析点,使用重解析点来用于召回范围跟踪。然而,重解析点的大小限制 (没有更多)允许只以相对大的粒度来跟踪召回范围,这使得在支持需要对经优化文件的 频繁小写入的场景时是低效的。
[0035] 为了改进针对这样的场景的写性能,本文描述了一种以更细粒度跟踪召回范围的 技术,如在图2和3概括地例示的。在一个实现中,基于(例如,VDI)工作负荷的I/O特性, 并且因为大多数I/O是扇区对齐(且未高速缓存)的(对于虚拟硬盘文件而言这默认是 4KB (或对于等待时间虚拟硬盘文件而言默认是512B)),512字节或4KB粒度被选择。使用 4KB作为召回粒度还消除了如上所述针对VDI的大多数情况下的对读取原始数据的需求。 然而,任何实际粒度可被使用,并且如可容易理解的,本文描述的机制能适用于其他粒度。
[0036] 为了跟踪与更细粒度相对应的更多召回范围,本文描述的一个方面使用基本上更 大的召回位图。然而,在与大小为千兆字节或更大的量级的文件的更细粒度一起使用时,这 样的更大召回位图不能整个适合在重解析点222,并且因而在一个实现中,重解析点外部的 一个或多个其他数据结构224和226被使用。然而,重解析点222外部的任何数据结构不 具有与重解析点一起提供的崩溃一致性保证。
[0037] 此外,具有单个大位图消耗大量存储器,这一般是不需要的,因为大多数文件通常 保持未变脏。因而,本文描述了针对大文件223使用分层安排的多层位图,其中一个位图 (称为召回单元226或主召回位图)跟踪实际脏范围,而其他位图(称为辅位图或召回位图 索引表224)以更大粒度来跟踪聚集的脏范围。根召回位图索引表228保持足够小(4KB)以 适合重解析点。主召回位图226和中间召回位图索引表224因为它们的大小而驻留在分开 的物理文件上,并且因此遭受各种数据损坏和数据丢失;下文描述了对损坏和丢失的保护。
[0038] 在一个实现中,在最简单形式的两层召回位图中,只存在一个(根)召回位图索引 表和一个主召回位图文件226 (不存在一个或多个中间索引表)。使用4KB根召回位图索引 表228,两层召回位图允许跟踪多达229个召回粒度字节,对于4KB的召回粒度而言这是约 2TB。如果文件更大或变得更大,和/或使用不同范围粒度,则召回位图索引表的另一中间 层被使用,以使得根索引表不溢出。一般概念是一旦召回位图被初始化并且工作,就不改变 (降低)粒度,因为这样做涉及对现有脏范围和部分召回的非常昂贵的处理,这是(脏)范 围折叠的结果。因而,对于过大而不能通过两层召回位图来跟踪的文件,中间召回位图索引 表被使用。
[0039] 具有多层召回位图(包括两层召回位图)的缺点是额外的读请求。然而,影响一 般是可忽略的,给定空间位置是在大多数(如果不是全部的话)真实世界工作负荷中的公 共特性,且对召回位图文件的访问被高速缓存。
[0040] 图2和3示出了三层召回位图。为了确保分层召回位图的数据完整性和崩溃一致 性,召回位图和召回位图索引表可被组织,如在此概括地示出的。在这一示例中,召回位图 和中间召回位图索引表被分解成4KB的块,其中每一个块以4字节CRC32校验和结束。因 而,主召回位图文件226中的每一个块可以跟踪多达(4096-4)*8*召回_大小字节的用户 数据。中间召回位图索引文件226中的每一个块可以跟踪较低层召回位图索引文件的多达 128MB ((4096-4) *8*4K)的范围。
[0041] 注意,如图2和3所示,每一个块具有两个副本,并且对文件的变更在这两个副本 之间交替进行。使用两个副本允许崩溃一致性,使得该结构不会以因拆毁写而造成的旧位 图结束。在位腐坏的情况下,没有从一个副本到另一副本的撤退。
[0042] 根召回位图索引表228(在该示例中是重解析点222)跟踪召回位图索引文件224 中的活动块副本。根召回位图索引表228是以用于填充的四个字节的零(0000)结束的4KB。 在一个实现优化中,每块两个位被分配来跟踪下一层召回位图文件的块状态。类似地,召回 位图索引文件224 (在活动副本中)跟踪召回位图226中的活动块副本。
[0043] 注意,在该模式中,在被设置之后,召回粒度不必被改变。相反,如果需要,召回位 图垂直地生长,因为在文件大小生长得超出当前召回位图可接纳的情况下,中间召回位图 索引文件的附加层被注入。在生长召回位图时,召回位图的当前高度330(即作为重解析点 228中的数据来维持)递增1。与新高度相关联的新索引表文件被用旧根索引表来填充,且 新根索引表被创建。注意,在NTFS实现中,根召回位图索引表228和召回位图索引高度330 是经去重复文件的重解析点222的一部分,并且因而这些数据被保护免于NTFS的崩溃引入 的数据不一致性。
[0044] 对于盘上结构,主召回位图226被存储在外部文件中。召回粒度由优化作业来控 制,且在一个实现(例如,在VDI情况下)中,4KB被使用,因为4KB是虚拟硬盘文件的默认 扇区大小。使用这一召回粒度,虚拟硬盘情况中的高速缓存的扇区对齐写不需要针对原始 数据的读和写。
[0045] 参考召回位图索引文件224,与重解析点222(它针对每一更新都完全重新写)不 同,对于大位图,该位图被部分更新。为了检测位图中的损坏,位图被按(4KB-4B)单位来 存储,每一单位具有四字节CRC32校验和。换言之,在该示例中,每一单位(称为召回位图 块)占据4KB盘空间。
[0046] 除了检测损坏,本文描述的技术防止拆毁写所造成的损坏并确保对位图的更新是 崩溃一致的。为此,对于每一 4KB召回位图块,存在两个存储位置(图3中的副本1和副本 2),也被示为226A和226B。只有一个存储位置是活动的,从而意味着在任何时刻,一个副本 包含最当前数据。如果位置一(副本1)是活动的,则下一更新去往位置二(副本2),并且 随后在更新成功完成之后位置二(副本2)变成活动的。如果在更新中间发生崩溃,则位置 一(副本1)处的数据保持有效,因为没有对位置一(副本1)的写。
[0047] 分开的表(召回位图索引表224)被用来描述召回位图块224A和224B (每一个块 消耗召回位图索引表224中的两个位)的以下状态:
[0048] OOb (十进制零)一一该块中的所有位(校验和除外)是0 (初始状态)
[0049] Olb (十进制一) 位置零(副本1)活动
[0050] Olb (十进制二)--位置一(副本2)活动
[0051] Ilb(十进制三)一一该块中的所有位(校验和除外)是1。
[0052] 注意,位OOb和Ilb允许在较高数据结构处只使用该较高数据结构中的两个位来 为分层结构中的较低数据结构中的大量信息知晓/设置干净或脏状态。
[0053] 中间召回位图索引表被类似地存储在外部文件(例如,文件224)中。中间召回 位图索引表224被按与主召回位图文件226中的副本相同的方式分解成4KB块(224A和 224B)。从召回位图索引表层到实际召回位图索引表的映射在重解析点222中维护。与主 召回位图块226A和226B -样,每一召回位图索引表具有两个存储位置(块224A和224B), 并且更新在这两者之间交替进行。类似地,索引块被使用CRC32来单独地进行校验和计算。
[0054] 使用召回位图索引表的一种替换方案是存储每一召回位图块的更新序列号(作 为CRC32的补充)。更新序列号在每次更新该块时递增。在读取块时,这两个位置被读取, 且具有有效CRC校验和和较高更新序列号的那一个被使用。然而,这不允许区分崩溃或位 腐坏引入的损坏;例如,在块的活动位置中发生位翻转是可能的,从而导致活动副本无效。 使用这样的方法,该系统退回到较旧和不准确的副本,并且将旧数据返回给用户,从而造成 未检测到的数据损坏。
[0
当前第2页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1