生成键-值索引快照的制作方法

文档序号:28262726发布日期:2021-12-31 16:48阅读:90来源:国知局
生成键-值索引快照的制作方法
生成键

值索引快照


背景技术:

1.计算设备可以包括诸如处理器、存储器、缓存系统和存储设备等部件。存储设备可以包括使用磁性介质来存储和取回数据块的硬盘驱动器。出于存档和恢复的目的,一些系统可能存储或“备份”重要数据的副本。例如,在存储设备出现故障的情况下,备份副本可用于恢复存储在故障系统上的数据。在一些示例中,可以周期性地执行备份以在不同的时间点捕获数据的副本。
附图说明
2.关于以下附图描述了一些实施方式。
3.图1是根据一些实施方式的示例系统的示意图。
4.图2是根据一些实施方式的示例键

值索引的图示。
5.图3a至图3b是根据一些实施方式的键

值索引的示例节点的图示。
6.图4a至图4e是根据一些实施方式的示例树结构的图示。
7.图5a至图5b是根据一些实施方式的示例过程的图示。
8.图6是根据一些实施方式的示例过程的图示。
9.图7是根据一些实施方式的示例过程的图示。
10.图8是根据一些实施方式的存储指令的示例机器可读介质的图。
11.图9是根据一些实施方式的示例计算设备的示意图。
12.在所有附图中,相同的附图标记指代相似但不一定相同的元件。附图不一定成比例,并且可以放大一些部件的尺寸以更清楚地图示所示出的示例。此外,附图提供了与描述一致的示例和/或实施方式;然而,描述不限于附图中提供的示例和/或实施方式。
具体实施方式
13.在本公开内容中,除非上下文另外明确指示,否则使用术语“一个(a)”、“一种(an)”或“所述(the)”旨在同样包括复数形式。同样地,当在本公开内容中使用时,术语“包括(includes)”、“包括(including)”、“包含(comprises)”、“包含(comprising)”、“具有(have)”或“具有(having)”指明存在所述元件,但不排除存在或添加其他元件。
14.在一些示例中,存储系统使用索引来指示键与值之间的关系或映射(本文中也称为“键

值对”)。键

值索引的一种示例使用是基于传入数据单元的“指纹”执行数据去重的存储系统,其中每个指纹标识特定的数据单元。将传入数据单元的指纹与指纹索引进行比较,指纹索引可以是键

值索引,其中指纹是键并且对应的数据位置是值。指纹与存储在指纹索引中的指纹之间的匹配指示传入数据单元可能是已经存储在存储系统中的数据单元的副本。如果传入数据单元是已经存储的数据单元的副本,则可以递增存储在存储系统中的参考计数以指示已接收到的数据单元的实例的数量,而不是存储重复的传入数据单元。在一些示例中,键

值索引可以是包括以分层方式布置的节点的树的形式。
[0015]“指纹”是指通过对数据单元的内容应用函数而得到的值(其中“内容”可以包括数
据单元的内容的全部或子集)。可以应用的函数的示例包括基于传入数据单元产生散列值的散列函数。散列函数的示例包括密码散列函数,诸如安全散列算法2(sha

2)散列函数,例如sha

224、sha

256、sha

384等。在其他示例中,可以采用其他类型的散列函数或其他类型的指纹函数。
[0016]“存储系统”可以包括存储设备或存储设备阵列。存储系统还可以包括管理对(多个)存储设备的访问的(多个)存储控制器。“数据单元”可以指可以在存储系统中单独标识的任何数据部分。在一些情况下,数据单元可以指组块、组块的集合、或任何其他数据部分。在一些示例中,存储系统可以将数据单元存储在持久性存储装置中。可以使用一种或多种(多个)持久性(例如,非易失性)存储设备(诸如,(多个)基于磁盘的存储设备(例如,(多个)硬盘驱动器(hdd))、(多个)固态设备(ssd)(诸如,(多个)闪速存储设备)等或者其组合)来实施持久性存储装置。
[0017]“控制器”可以指硬件处理电路,其可以包括微处理器、多核微处理器的核、微控制器、可编程集成电路、可编程门阵列、数字信号处理器或其他硬件处理电路中的任一项或某种组合。可替代地,“控制器”可以指硬件处理电路与可在硬件处理电路上执行的机器可读指令(软件和/或固件)的组合。
[0018]
在一些示例中,“快照”可以表示数据结构(例如,键

值索引)在特定时间点的状态。例如,特定快照可以用于重新创建或分析在特定时间点存在的键

值索引。然而,一些快照可能涉及存储索引(例如,节点)的每个元素的多个副本以及存储附加的数据结构以跟踪并标识哪些副本对应于每个快照。因此,可能需要大量的处理和磁盘带宽来加载存储的数据、确定给定快照中包括哪些元素、并使用所包括的元素来生成特定快照。
[0019]
根据本公开内容的一些实施方式,可以将键

值索引存储为其中每个内部节点(本文中称为“间接”节点)可以包括缓冲器(也称为“节点缓冲器”)来存储键

值对的树结构。当缓冲器的水平达到阈值时,键

值对可以被转移到子节点(例如,其他间接节点或叶节点)。在一些实施方式中,每个键

值对可以与指示键

值对的“代”的代标识符相关联,该代标识符可以对应于特定的时间点或时间段。例如,代标识符可以是特定快照的编号(例如,第一个快照为“1”,第二个快照为“2”,依此类推)。进一步地,间接节点可以包括指向子节点和/或其缓冲器的部分(称为缓冲器组块)的指针。每个指针可以与被指向的元素的代标识符相关联。
[0020]
在本文描述的一些实施方式中,提供或读取快照可以包括执行索引的节点的遍历,遍历从对应于特定代的根节点开始。遍历可以涉及使用指针和键

值对中的代标识符来确定索引在特定代时的树结构。这个树结构可以包括或“借用”来自较早的代的子树(例如,在特定代中未修改的子树)。使用这个树结构可以减少对各代数据的扫描和加载,并且因此可以提供相对快速的生成快照的能力。进一步地,跨不同代的树结构共享节点可以减少维护快照所需的资源量(例如,cpu带宽、存储器、存储装置等)。以这种方式,一些实施方式可以提高索引的性能。进一步地,子树的这种共享可以优化其他操作,诸如校验计算(例如,仅针对已改变部分的增量计算)、使用增量改变的复制、快照删除等。
[0021]
1.包括利用节点缓冲器的键

值索引的存储系统
[0022]
图1示出了根据一些实施方式的包括存储控制器110和持久性存储装置140的存储系统100的示例。如图所示,存储控制器110可以包括更新引擎120、合并引擎150、快照引擎
170、存储器130和查询引擎160。在一些示例中,存储器130可以包括更新缓冲器135,并且持久性存储装置140可以包括键

值索引145。在一些实施方式中,键

值索引145可以包括被组织为节点树的键

值数据。下面参考图2描述键

值索引145的示例实施方式。在一些示例中,持久性存储装置140可以包括一个或多个非暂态存储介质,比如硬盘驱动器(hdd)、固态驱动器(ssd)、光盘等或者其组合。存储器130可以包括半导体存储器设备,诸如动态随机存取存储器或静态随机存取存储器(dram或sram)、非易失性双列直插式存储器模块(nvdimm)等。
[0023]
在一些实施方式中,更新引擎120可以接收对持久性存储装置140中的键

值索引145的更新105。例如,每个更新105可以是要添加到键

值索引145的键

值对。在一些示例中,更新引擎120可以将更新105的全部或一部分存储在存储器130中所存储的更新缓冲器135中。进一步地,合并引擎150可以用存储在更新缓冲器135中的键

值对来更新键

值索引145。值得注意的是,尽管图1中仅示出了一个更新缓冲器135,但是在其他示例中,存储控制器110可以包括多个更新缓冲器135。在一些示例中,可以以一个或多个易失性存储设备来实施存储器130。
[0024]
在一些实施方式中,查询引擎160可以在某个时间点接收指定给定键的查询165,并且可以访问键

值索引145(以及在一些示例中,更新缓冲器135)或与之交互,以确定与查询165中指定的键匹配的值。进一步地,查询引擎160可以响应于查询165而返回匹配值。在一些示例中,查询165可以是用户创建的查询(例如,对数据元素的读取请求)。
[0025]
在一些实施方式中,快照引擎170可以标识或维护键

值索引145的当前代。可以周期性地和/或在每个请求(例如,用户或系统命令)递增当前代。每个快照可以与键

值索引145在代递增时的状态相对应,并且可以与紧接的前一代相关联。例如,在当前代从代2(“g2”)递增到代3(“g3”)时,与g2相关联的快照被最终确定或“冻结”。换句话说,一旦当前代递增到g3,g2快照中包含的键

值数据就不能再改变。在一些示例中,当已经在键

值索引145中执行了所有未决更新时(即,在合并引擎150完成更新过程之后),快照被视为最终确定。
[0026]
在一些实施方式中,快照引擎170和/或更新引擎120可以将代标识符与键

值索引145的对应元素相关联。在一些示例中,代标识符可以在元素中包括或附加到元素的字段中指定。例如,更新引擎120可以在与键

值索引145中添加或更新的键

值对相关联的字段中插入代标识符。进一步地,在一些示例中,更新引擎120可以在键

值索引145的间接节点的指针(例如,指向子节点的指针、指向缓冲器组块的指针等)中包括的字段中插入代标识符。在一些示例中,代标识符是在每个指针中指定的地址的一个部分。
[0027]
在一些实施方式中,快照引擎170可以通过执行键

值索引145的遍历来提供或读取快照,该遍历从对应于特定代的根节点开始。进一步地,快照引擎170可以使用代标识符来确定键

值索引145在与特定代相关联的时间段存在的树结构。在一些示例中,所确定的树结构可以包括子树(即,整个树的子部分),该子树也被包括在较早的代中。以这种方式,快照引擎170可以提供对特定快照的相对快速的访问,并且可以提高与生成快照相关联的性能。下面参考图2至图9进一步描述快照引擎170和键

值索引145的功能。
[0028]
如这里所使用的,“引擎”可以指硬件处理电路,其可以包括微处理器、多核微处理器的核、微控制器、可编程集成电路、可编程门阵列、数字信号处理器或其他硬件处理电路
中的任一项或某种组合。可替代地,“引擎”可以指硬件处理电路与可在硬件处理电路上执行的机器可读指令(存储在至少一个机器可读存储介质上的软件指令和/或固件指令)的组合。
[0029]
2.使用节点缓冲器的示例键

值索引
[0030]
图2示出了根据一些实施方式的示例键

值索引200的图示。在一些示例中,键

值索引200可以总体上对应于键

值索引145(图1所示)的示例实施方式。进一步地,在一些示例中,键

值索引200可以由存储控制器110(图1所示)生成。在一些示例中,键

值索引200可以将数据单元的指纹映射到那些数据单元的位置。在其他示例中,键

值索引200可以是将卷或偏移映射到代标识符与存储位置标识符(例如,顺序块编号)的组合的块索引。在又一些示例中,键

值索引200可以是将不同类型的块映射到其磁盘位置以及其他信息(例如,完整的指纹、块的压缩大小等)的磁盘索引。上述内容的其他组合或其变化也是可能的。
[0031]
如图2所示,键

值索引200可以被布置成包括多个节点的树结构。节点可以被组织成形成父子关系的各种层级。例如,第一层级210可以包括根节点211,并且第二层级220可以包括作为根节点211的子代的间接节点221到224。进一步地,第三层级230可以包括作为间接节点222(在第二层级220中)的子代的间接节点231到234,并且第四层级240可以包括作为间接节点233(在第三层级230中)的子代的叶节点241到244。在一些示例中,与每个父节点相关的子节点的数量可以由与键

值索引200相关联的扇出参数指定。
[0032]
在本文的示例中,键

值索引的每个节点可以是叶节点或间接节点(即,除叶节点以外的任何节点,包括根节点)。在一些实施方式中,键

值索引200的每个间接节点(例如,根节点211、间接节点221到224、间接节点231到234)可以包括存储键

值数据的缓冲器(本文中也称为“节点缓冲器”,并且在图2中未示出)。在一些示例中,键

值索引200的每个叶节点可以存储键

值数据。下面参考图3a描述包括节点缓冲器的间接节点的示例实施方式。
[0033]
在一些实施方式中,键

值索引200的节点可以从树结构的顶部到底部以逐步的方式生成。例如,在初始化键

值索引200时(例如,在首次使用时),键

值索引200可以仅包括根节点211。在此示例中,添加到键

值索引200的键

值对可以存储在根节点211的节点缓冲器中。
[0034]
在一些实施方式中,当存储在根节点211的节点缓冲器中的键

值数据达到阈值水平(例如,特定数量的所存储键

值对、总容量的特定百分比等)时,可以触发紧缩过程。如本文中所使用的,“紧缩”可以指将键

值数据从父节点转移到一个或多个子节点。在一些示例中,根节点211第一次被紧缩时,可以生成间接节点221到224(即,根节点211的直接子代)。进一步地,每当根节点211被紧缩时,存储在根节点211的节点缓冲器中的键

值数据可以被转移到间接节点221到224的节点缓冲器。如本文中所使用的,“转移”数据是指将数据移动到目的地节点,使得数据不再存在于源节点中。在一些示例中,间接节点221到224中的每一个可以与根节点211的节点缓冲器中的键范围的不同部分相关联。因此,在这样的示例中,根节点211的每个键

值对可以根据与每个子节点相关联的范围被分配给子节点221到224中的不同子节点。一旦根节点211的紧缩完成,根节点211的节点缓冲器便是空的,并且此后,在根节点211处接收到的任何新的键

值更新将被存储在根节点211的节点缓冲器中。在一些示例中,根节点211的“部分紧缩”导致节点缓冲器部分为空以容纳至少一些键

值更新。
[0035]
在一些实施方式中,可以对每个间接节点类似地重复上述紧缩过程。例如,间接节点222第一次被紧缩时(即,当间接节点222的节点缓冲器达到阈值时),可以生成间接节点231到234(即,间接节点222的直接子代),并且存储在间接节点222的节点缓冲器中的键

值数据可以被转移到间接节点231到234的节点缓冲器。在另一个示例中,间接节点233第一次被紧缩时,可以生成叶节点241到244(即,间接节点233的直接子代),并且存储在间接节点233的节点缓冲器中的键

值数据可以被转移到叶节点241到244。
[0036]
在一些实施方式中,键

值索引200可以将每个键和对应的值存储为两个单独的存储元素。然而,实施方式在这方面不受限制。例如,在一些实施方式中,键可以由节点或存储元件内的对应值的偏移或位置来隐含或指示。在这样的实施方式中,“键

值对”可以指与隐式键相关联的存储值。
[0037]
应当理解,尽管为了清楚起见未在图2中示出,但是其他间接节点可以在键

值索引200的各种层级中具有子节点。例如,随着时间推移,在整个键

值索引200中,间接节点221可以在第三层级230中具有多个子节点,间接节点234可以在第四层级240中具有多个子节点,等等。
[0038]
在一些实施方式中,键

值索引200可以包括形成多个树结构的多个根节点(图2中未示出)。多个树结构可以共享子部分(例如,节点的子集),并且可以对应于键

值索引200的不同代。这些树结构中的每一个都可以用于提供键

值索引200在给定时间点的状态的快照。快照的生成将在下面参考图3a至图9进一步讨论。
[0039]
3.键

值索引的示例节点
[0040]
图3a示出了根据一些实施方式的示例间接节点300的图示。间接节点300可以总体上对应于图2所示的任何间接节点(例如,根节点211、间接节点221到224和/或间接节点231到234)的示例实施方式。如图3a所示,间接节点300可以包括子指针310、围栏指针(fence pointer)320、布隆过滤器330和/或节点缓冲器340中的一些或全部。
[0041]
在一些实施方式中,节点缓冲器340可以包括多个缓冲器组块345a到345n(本文中也称为“缓冲器组块345”)来存储键

值数据(例如,数据单元的指纹和数据单元107的对应存储位置指示符)。缓冲器组块345a到345n可以根据键有序地(例如,以数值次序、以字母次序等)布置。例如,缓冲器组块345a可以存储最低键范围的键

值数据,而缓冲器组块345n可以存储最高键范围的键

值数据。在一些示例中,每个缓冲器组块345可以具有相等或类似大小(例如,32kb、64kb等)。在一些实施方式中,可以基于层级比率来确定节点缓冲器340的大小。在一些示例中,层级比率可以是键

值索引的两个相邻层级中的总缓冲器大小之间的固定比率。进一步地,可以基于用户指定的(多个)参数来确定层级比率,以调节与键

值索引相关联的写入放大的水平。
[0042]
在一些实施方式中,子指针310可以指向或以其他方式标识作为间接节点300的直接子代的任何节点。例如,参考键

值索引200(图2所示),根节点211可以包括相应的子指针310,子指针310指向间接节点221到224(即,根节点211的直接子代)中的每一个。在一些示例中,可以在间接节点300第一次被紧缩时(例如,当节点缓冲器340达到预定义阈值水平时)生成子指针310。
[0043]
在一些实施方式中,布隆过滤器330可以允许确定哪些键未包括在节点缓冲器340中以及哪些键可能包括在节点缓冲器340中(即,有误肯定的可能性)。换句话说,布隆过滤
器330指示未包括在节点缓冲器340中的键,并且指示可能包括在节点缓冲器340中的键,这时有可能为至少一些键提供误肯定指示(即,在键未包括在节点缓冲器340中时,指示键包括在节点缓冲器340中)。因此,如果布隆过滤器330指示特定键未包括在节点缓冲器340中,则可以避免与将节点缓冲器340加载到存储器中并搜索特定键相关联的处理时间和/或带宽,因为布隆过滤器330的使用可以准确地指示键何时未包括在节点缓冲器340中。相比之下,如果布隆过滤器330指示特定键包括在节点缓冲器340中,则可以在节点缓冲器340中搜索特定键。在一些实施方式中,索引的各个层级处的布隆过滤器330的大小可以被确定成使得与较低层级(即,更靠近叶节点)处的节点中的布隆过滤器300相比,较高层级(即,更靠近根节点)处的间接节点300中的布隆过滤器300与相对更低的误报率相关联。
[0044]
在一些实施方式中,当在节点缓冲器340中搜索特定键时,围栏指针320可以用于标识可能存储与特定键相关联的数据的特定缓冲器组块345。在一些示例中,围栏指针320可以标识每个缓冲器组块345的最低和/或最高键值。例如,每个围栏指针320可以标识包括在对应的缓冲器组块345中的键值的下限。因此,围栏指针320可用于标识哪个缓冲器组块345包括被搜索的键落入的键范围。因此,并非将整个节点缓冲器340加载到存储器中,而是仅需要将所标识的缓冲器组块345加载到存储器中。以这种方式,围栏指针320可以缩减与间接节点300相关联的读取放大。
[0045]
在一些实施方式中,缓冲器组块345可以存储在一起或者存储在单独的数据块中。进一步地,缓冲器组块345可以与间接节点300的剩余元素(即,子指针310、围栏指针320和/或布隆过滤器330)分开存储。在一些示例中,可以在将任何缓冲器组块345加载到存储器中之前先将子指针310、围栏指针320和布隆过滤器330加载到存储器中。进一步地,如果布隆过滤器330指示被搜索的键包括在节点缓冲器340中,则可以使用围栏指针320标识单个缓冲器组块345,并且然后仅将所标识的缓冲器组块345加载到存储器中。
[0046]
在一些实施方式中,子指针310和/或围栏指针320可以与被指向的元素的代标识符(图3a中未示出)相关联。例如,子指针310可以包括指示对应的子节点(即,由子指针310指向的子节点)最后被改变(例如,生成或更新)的特定代的代标识符。在另一示例中,围栏指针320可以包括指示对应的缓冲器组块345最后被改变的特定代的代标识符。
[0047]
图3b示出了根据一些实施方式的示例叶节点350的图示。叶节点350可以总体上对应于图2所示的任何叶节点(例如,叶节点241到244)的示例实施方式。如图3b所示,叶节点350可以包括键

值数据360。在一些实施方式中,键

值数据360中的每个键

值对可以与指示键

值对最后被改变的特定代的代标识符(图3b中未示出)相关联。
[0048]
4.快照的示例树结构
[0049]
图4a至图4d示出了根据一些实施方式的示例树结构。在一些示例中,快照引擎170(图1所示)可以使用图4a至图4d所示的树结构。进一步地,在一些示例中,图4a至图4d中所示的树结构可以总体上对应于键

值索引(例如,图2所示的键

值索引200)在给定时间点的状态。
[0050]
参考图4a,示出了在第一时间点的第一树结构401。第一树结构401包括根节点411

1、间接节点421

1和425

1、以及叶节点431

1、432

1、433

1和434

1。值得注意的是,为了清楚起见,图4a仅示出了每个间接节点的两个子代,并且实施方式在这方面不受限制。还要注意,尽管为了清楚起见在图4a中未示出,但是任何间接节点(例如,根节点411

1和间接
节点421

1)可以包括节点缓冲器、布隆过滤器等(如图3a所示)。
[0051]
假设图4a表示键

值索引紧接在当前代从第一代(“g1”)递增到第二代(“g2”)之前的状态,并且没有对索引的更新未决(例如,在图1所示的更新缓冲器135中)。因此,第一树结构401对应于第一代g1的快照,并且在本文中可以被称为“g1快照”。在一些实施方式中,快照引擎170(图1所示)可以通过遍历键

值索引(例如,图2所示的键

值索引200)中的第一树结构401来读取g1快照的数据。键

值索引可以包括对应于不同代的节点(即,根节点、间接节点和叶节点)。在一些实施方式中,用于读取g1快照的数据的遍历过程可以通过标识与“g1”代标识符相关联的特定根节点(例如,根节点411

1)来开始。如图4a所示,在一些实施方式中,根节点411

1可以包括应用于整个节点的g1代标识符(也称为“节点级代标识符”)。然而,在其他实施方式中,与g1相关联的根节点可以由指向根节点411

1的指针来标识,指针包括g1代标识符(例如,作为根节点411

1的地址或标识符的一部分)。
[0052]
在标识根节点411

1之后,用于读取g1快照的遍历过程可以通过跟随子指针p1和p2来标识子间接节点421

1和425

1来继续。如图所示,子指针p1和p2中的每一个与g1代标识符相关联,从而指示子间接节点421

1和425

1各自与第一代g1相关联。值得注意的是,虽然为了说明起见图4a示出了附加到指针p1和p2的g1代标识符,但是实施方式在这方面不受限制。例如,每个指针可以包括用代标识符填充的字段。在另一个示例中,代标识符可以是每个指针的目标标识符的一部分。其他示例也是可能的。
[0053]
接下来,用于读取g1快照的遍历过程可以通过跟随子指针p3、p4、p5和p6来分别标识子叶节点431

1、432

1、433

1和434

1来继续。如图所示,子指针p3、p4、p5和p6与g1代标识符相关联,从而指示叶节点431

1、432

1、433

1和434

1与第一代g1相关联。进一步地,如图所示,叶节点431

1、432

1、433

1和434

1不同地包括键

值对k0到k7。如本文所使用的,符号“k0”是指键0的键

值对,符号“k7”是指键7的键

值对,依此类推。每个键

值对k0到k7与g1代标识符相关联,从而指示这些键

值对中的每一个与第一代g1相关联。在图4a的示例中,第一树结构401是与第一代g1相关联的键

值索引的快照(即,“g1快照”)。
[0054]
现在参考图4b,示出了在第二时间点(例如,在图4a的第一时间点之后)的第一树结构401和第二树结构402。假设图4b表示键

值索引在第二代g2期间但是在第二代g2期间发生的后续更新之前的状态。换句话说,第二树结构402尚未针对第二代g2最终确定,并且因此不表示第二代g2的快照。
[0055]
在图4b的示例中,第一树结构401和第二树结构402都可以包括在键

值索引的数据存储器(例如,图1所示的持久性存储装置140)中。因此,数据存储器可以同时包括对应于第一代g1和第二代g2的两个不同的根节点411

1和411

2。在一些实施方式中,当索引的当前代从g1递增到g2时创建与第二代g2相关联的根节点411

2。
[0056]
如图4b所示,第二根节点411

2的子指针p2与g1代标识符相关联,从而指示子间接节点425

1与第一代g1相关联。值得注意的是,间接节点425

1自代g1以来没有改变,并且因此仍然与g1代标识符相关联。进一步地,子叶节点433

1和434

1自代g1以来也没有改变,并且因此间接节点425

1的子指针p5和p6也与g1代标识符相关联。
[0057]
如图4b所示,第二树结构402不包括间接节点425

1的另一个副本,而是从第一树结构401“借用”间接节点425

1(由虚线箭头指示)。因此,第一树结构401和第二树结构402共享子部分,即间接节点425

1及其子叶节点433

1和434

1。值得注意的是,第二树结构402
(与第二代g2相关联)的这个子部分包括不与g2代标识符相关联的指针和键

值对(例如,指针p5、键

值对k4等)。因此,在一些实施方式中,具有来自较早一代的标识符的这种元素也可以被包括在第二树结构402中,因为其被包括在从第二根节点411

2(与g2代相关联)开始的遍历中。
[0058]
再次参考第二根节点411

2,子指针p1与g2代标识符相关联,从而指示子间接节点421

2与第二代g2相关联。因此,键

值索引中发生的一个变化是间接节点421

1已经被不同的间接节点421

2取代。具体地,与间接节点421

1相比,间接节点421

2包括一组围栏指针422和缓冲器组块423。具体地,围栏指针422包括指向缓冲器组块423并且与g2代标识符相关联的围栏指针f0。进一步地,缓冲器组块423包括也与g2代标识符相关联的键

值对k0’。在图4b的示例中,键

值对k0’表示对键

值对k0(包括在第一树结构401的叶节点431

1中)的更新,并且因此指示与键0配对的值已经从代g1改变到代g2。值得注意的是,键

值索引同时包括与第一代g1和第二代g2相对应的与键0配对的两个不同的值(即,k0和k0’)。
[0059]
如上所述,间接节点421

2包括与g2代相关联的元素(即,围栏指针f0和缓冲器组块423中的键

值对k0’),并且因此间接节点421

2与g2代标识符相关联。然而,值得注意的是,间接节点421

2的子指针p3和p4指向第一树结构401的叶节点431

1和432

1,并且因此子指针p3和p4与g1代标识符相关联。因此,第一树结构401和第二树结构402共享其他子部分,即叶节点431

1和432

1。
[0060]
现在参考图4c,示出了在第三时间点(例如,在图4b的第二时间点之后)的第一树结构401和第二树结构402。假设图4c表示键

值索引紧接在当前代从第二代g2递增到第三代g3之前的状态,并且没有对索引的更新未决。因此,如图4c所示的第二树结构402表示第二代g2的快照,并且在本文中可以称为“g2快照”。
[0061]
如图4c所示,第二根节点411

2的子指针p1和p2都与g2代标识符相关联,从而指示子间接节点421

2和425

2都与第二代g2相关联。值得注意的是,间接节点425

2包括一组围栏指针426和缓冲器组块427。具体地,围栏指针426包括指向缓冲器组块427并且与g2代标识符相关联的围栏指针f4。进一步地,缓冲器组块427包括与g2代标识符相关联的键

值对k4’和k5’。在图4c的示例中,键

值对k4’和k5’表示对键

值对k4和k5(包括在第一树结构401的叶节点433

1中)的更新,并且因此指示与键4和键5配对的值已经从代g1改变到代g2。
[0062]
值得注意的是,图4b所示的间接节点421

2(如上所述)包括与g1代标识符相关联的子指针p3、与g2代标识符相关联的围栏指针f0、以及存储与g2代标识符相关联的键

值对k0’的缓冲器组块423。然而,在4c所示的第三时间点,键

值对k0’不再存储在间接节点421

2的缓冲器组块423中,而是存储在叶节点431

2中。进一步地,子指针p3与g2代标识符相关联,从而指示叶节点431

2现在与第二代g2相关联。在一些实施方式中,键

值对k0’从缓冲器组块423到叶节点431

2的转移可以在间接节点421

2的紧缩期间发生。
[0063]
还值得注意的是,叶节点431

2(包括键

值对k0’)不同于叶节点431

1(包括键

值对k0)。因此,在图4c的示例中,第一树结构401和第二树结构402不能再共享叶节点431

1(如图4b所示)。因此,叶节点431

1被存储用于g1快照,并且叶节点431

2被存储用于g2快照)。
[0064]
进一步地,如图4c所示,叶节点432

1、433

1和434

1自代g1以来没有改变。因此,(间接节点421

2的)子指针p4以及(间接节点425

2的)子指针p5和p6仍然与g1代标识符相
关联。因此,第一树结构401和第二树结构402共享叶节点432

1、433

1和434

1(由虚线箭头指示)。
[0065]
现在参考图4d,示出了在第四时间点(例如,在图4c的第三时间点之后)的第二树结构402和第三树结构403。假设图4d表示键

值索引在代g3期间的状态。值得注意的是,图4d所示的第二树结构402与图4c所示的不变。换句话说,图4c至图4d所示的第二树结构402针对第二代g2最终确定,并且因此表示g2快照。
[0066]
如图所示,第三树结构403包括对应于第三代g3的根节点411

3。进一步地,第三树结构403可以与第一树结构401和第二树结构402共享子部分(由虚线箭头指示)。此外,如前面参考图4c所讨论的,第二树结构402可以与第一树结构401共享子部分。
[0067]
如图4d所示,第三根节点411

3的子指针p1与g2代标识符相关联,从而指示子间接节点421

2与第二代g2相关联。因此,第三树结构403不包括间接节点421

2的另一个副本,而是从第二树结构402借用间接节点421

2。进一步地,第三树结构403还借用由间接节点421

2的子指针标识的叶节点,即叶节点431

2(包括在第二树结构402中)和叶节点432

1(包括在第一树结构401中)。
[0068]
值得注意的是,在图4d的示例中,第三树结构403可以包括跨越多代(例如,代g1和g2)的借用树部分。在一些实施方式中,树可以借用上一代的树从更早一代的树借用的部分。例如,在图4d中,第二树结构402共享来自第一树结构401的叶节点434

1,并且因此第三树结构403也可以共享叶节点434

1。然而,没有树可以从后一代借用部分(例如,第一树结构401不能借用第二树结构402的任何部分)。
[0069]
再次参考第三根节点411

3,子指针p2与g3代标识符相关联,从而指示子间接节点425

3与第三代g3相关联。如图所示,间接节点425

3包括一组围栏指针428和缓冲器组块429。具体地,围栏指针428包括指向缓冲器组块429并且与g3代标识符相关联的围栏指针f6。进一步地,缓冲器组块429包括也与g3代标识符相关联的键

值对k6’和k7’。
[0070]
如图4d所示,围栏指针428还包括指向与g2代标识符相关联的缓冲器组块427的围栏指针f4,并且因此围栏指针f4也与g2代标识符相关联。注意,间接节点425

3(在第三树结构403中)的围栏指针f4指向间接节点425

2(在第二树结构402中)中包括的缓冲器组块427。因此,在图4d的示例中,第三树结构403不存储缓冲器组块427的副本,而是从第二树结构402借用缓冲器组块427(与g2代相关联)。
[0071]
如上所述,间接节点425

3包括与代g3相关联的元素(即,围栏指针f6和缓冲器组块429中的键

值对k6’和k7’),并且因此间接节点425

3与g3代标识符相关联。然而,值得注意的是,间接节点425

3的子指针p5和p6指向第一树结构401的叶节点433

1和434

1,并且因此子指针p5和p6与g1代标识符相关联。
[0072]
现在参考图4e,示出了g1快照已经被消除(例如,在其不再被需要之后)的示例中的第二树结构402。因此,第一树结构401的未与第二树结构402共享的任何部分已经被删除,并且先前共享的部分将保留在第二树结构402中。值得注意的是,虽然图4e图示了删除最旧的快照(即,g1)的示例,但是实施方式在这方面不受限制。例如,可以删除按时间顺序位于两个其他快照之间的快照,并且只删除被删除快照的非共享部分。
[0073]
5a.用于更新键

值索引的过程
[0074]
图5a示出了根据一些实施方式的示例过程500。在一些示例中,可以使用存储控制
器110(图1所示)的一部分或全部来执行过程500。可以在硬件或硬件与编程的组合(例如,可由(多个)处理器执行的机器可读指令)中实施过程500。机器可读指令可以存储在如光学存储设备、半导体存储设备或磁性存储设备等非暂态计算机可读介质中。机器可读指令可以由单个处理器、多个处理器、单个处理引擎、多个处理引擎等来执行。为了说明起见,下面可能参考示出了根据一些实施方式的示例的图1至图4e描述过程500的细节。然而,其他实施方式也是可能的。
[0075]
框510可以包括接收要将键

值对添加到索引的写入请求。例如,参考图1,更新引擎120可以将更新105存储在更新缓冲器135中,并且合并引擎150可以用存储在更新缓冲器135中的键

值对数据来更新键

值索引145。在一些示例中,键

值索引145可以被布置成包括多个节点的树结构。进一步地,在一些示例中,键

值索引145可以将数据单元的指纹映射到那些数据单元的位置。
[0076]
框520可以包括将键

值对和当前代标识符存储在索引的间接节点的节点缓冲器中。假设在图5a的示例中,间接节点比任何叶节点高多于一个层级。换句话说,在图5a的示例中,存储键

值对(在框520处)的间接节点的任何子节点也是间接节点。例如,参考图1至图3a,存储控制器110和/或合并引擎150可以将所接收的键

值对与当前代标识符(例如,“g2”)存储在根节点211的缓冲器组块345中。进一步地,存储控制器110可以生成或更新围栏指针320以标识缓冲器组块345。在一些实施方式中,围栏指针320可以插入或附加有当前代标识符。此外,在一些示例中,可以配置根节点211的布隆过滤器330(例如,通过设置位值)来指示所接收的键

值对存储在根节点211的节点缓冲器340中。
[0077]
菱形框530可以包括确定间接节点的节点缓冲器是否超过预定义阈值。如果确定节点缓冲器未超过阈值,则过程500可以返回到框510(即,以接收另一个键

值对)。例如,参考图1至图3a,存储控制器110可以确定根节点211的节点缓冲器340是否超过预定义填充水平(例如,90%满、100%满、给定数量的键

值对等)。
[0078]
然而,如果在菱形框530处确定节点缓冲器超过阈值,则过程500可以在框540处继续,框540可以包括将子节点初始化(如果需要的话)。在一些实施方式中,如果间接节点还没有现有的子间接节点,则可以将子节点初始化。例如,参考图1至图4d,存储控制器110可以确定根节点211的节点缓冲器340已被填充到预定义水平,并且作为响应,可以确定根节点211是否具有任何直接子节点(即,比根节点211低一个层级的任何子节点)。值得注意的是,如图2所示,根节点211的直接子节点是间接节点,而不是叶节点。如果存储控制器110确定根节点211不具有任何现有的子间接节点,则存储控制器110可以将根节点211的子间接节点初始化。在一些实施方式中,将子间接节点初始化可以包括基于层级比率来确定子间接节点的节点缓冲器大小。在一些示例中,层级比率可以是键

值索引200的两个相邻层级中的总缓冲器大小之间的计算比率。因此,在这样的示例中,间接节点221到224的总缓冲器大小可以不同于根节点211的节点缓冲器的大小。进一步地,间接节点221到224中的每一个的节点缓冲器可以不同于(例如,小于或大于)根节点211的节点缓冲器。此外,在一些示例中,将子间接节点初始化可以包括确定子间接节点的布隆过滤器大小。例如,存储控制器110可以基于与键

值索引200的不同层级相关联的误肯定率来确定根节点211的子节点的布隆过滤器大小。
[0079]
在框540之后,过程500可以在框550处继续,框550可以包括将所有键

值对及其相
关联的代标识符从间接节点的节点缓冲器转移到子节点的节点缓冲器。例如,参考图1至图4d,存储控制器110可以将所有键

值对及其代标识符从根节点211的节点缓冲器转移到子节点221到224的节点缓冲器。可以根据与子节点221到224相关联的不同键范围,将所转移的键

值对分配给子节点221到224。在一些示例中,存储控制器110还可以设置子节点的布隆过滤器,以指示所转移的键

值对存储在对应的节点缓冲器中。
[0080]
框560可以包括将间接节点的子指针与当前代标识符相关联。例如,参考图1至图4d,在将键

值对转移到子节点221到224时,存储控制器110可以更新间接节点的一些或全部子指针以包括当前代标识符(例如,如果相关联的子节点用转移的键

值对更新)。在框560之后,过程500可以返回到框510(即,以继续接收要将键

值对添加到索引的写入请求)。值得注意的是,可以针对键

值索引200的不同间接节点(例如,针对间接节点221到224、231到234中的每一个)类似地重复过程500,并且也可以在同一间接节点处重复所述过程(例如,以进行多次紧缩)。
[0081]
5b.用于添加新一代的过程
[0082]
图5b示出了根据一些实施方式的示例过程570。在一些示例中,可以使用存储控制器110(图1所示)的一部分或全部来执行过程570。可以在硬件或硬件与编程的组合(例如,可由(多个)处理器执行的机器可读指令)中实施过程570。机器可读指令可以存储在如光学存储设备、半导体存储设备或磁性存储设备等非暂态计算机可读介质中。机器可读指令可以由单个处理器、多个处理器、单个处理引擎、多个处理引擎等来执行。为了说明起见,下面可能参考示出了根据一些实施方式的示例的图1至图4e描述过程570的细节。然而,其他实施方式也是可能的。
[0083]
框575可以包括接收要向键

值索引添加新一代的命令。框580可以包括递增当前代标识符。例如,参考图1和图4a,快照引擎170可以接收用户或系统命令以向由第一树结构401表示的键

值索引添加新一代。响应于命令,快照引擎170可以将当前代从g1递增到g2。在一些示例中,添加新一代g2的过程可以包括最终确定上一代g1。这种最终确定可以包括完成对第一树结构401的所有未决更新(例如,在图1所示的更新缓冲器135中)。进一步地,在一些示例中,这种最终确定可以包括指定或指示前一代g1的第一树结构401被冻结(即,不能改变)。
[0084]
框585可以包括创建与新一代相关联的新根节点。框590可以包括从新根节点开始累积新的键

值对。例如,参考图1和图4b,快照引擎170可以生成与新一代g2相关联的新根节点411

2。进一步地,在与第二代g2相关联的剩余时间段期间,可以向根节点411

2添加更新,所有新元素都与g2标识符相关联。此外,这些更新可以触发紧缩过程,从而向第二树结构402添加新的子节点(例如,图4b所示的间接节点421

2)。在框590之后,过程570可以完成。
[0085]
值得注意的是,虽然图5b示出了用于添加新一代的一个示例过程,但是其他变化也是可能的。例如,在一些实施方式中,在代标识符递增到g2之后,任何新的更新可以被附加g2标识符,并且可以被累积在更新缓冲器(例如,图1所示的更新缓冲器135)中,而不被添加到树结构(例如,图4b所示的第二树结构402)。随后,当代标识符递增到g3时,累积的g2更新可以用于当时生成和最终确定g2快照。在这样的示例中,g2快照的根节点可以被创建为添加到g2快照的树结构的最后一个节点。
[0086]
6.用于从快照进行读取的过程
[0087]
图6示出了根据一些实施方式的示例过程600。在一些示例中,可以使用存储控制器110(图1所示)的一部分或全部来执行过程600。可以在硬件或硬件与编程的组合(例如,可由(多个)处理器执行的机器可读指令)中实施过程600。机器可读指令可以存储在如光学存储设备、半导体存储设备或磁性存储设备等非暂态计算机可读介质中。机器可读指令可以由单个处理器、多个处理器、单个处理引擎、多个处理引擎等来执行。为了说明起见,下面可能参考示出了根据一些实施方式的示例的图1至图4d描述过程600的细节。然而,其他实施方式也是可能的。
[0088]
框610可以包括接收对快照的键

值数据的请求。例如,参考图1,快照引擎170可以接收要读取与代g1(例如,由图4a至图4c所示的第一树结构401表示)相关联的快照的数据的请求。
[0089]
框620可以包括标识与所请求的快照相关联的根节点。例如,参考图1和图4c,如果所请求的快照与代g1相关联,则快照引擎170可以选择根节点411

1。在另一个示例中,如果所请求的快照与代g2相关联,则快照引擎170可以选择根节点411

2。
[0090]
框630可以包括从所标识的根节点开始并使用代标识符来遍历树结构。例如,参考图1和图4c,快照引擎170可以通过从根节点411

2(与代g2相关联)开始执行遍历来获得g2快照的数据,并且然后可以跟随子指针p1和p2来标识子间接节点421

2和425

2。接下来,遍历可以跟随子指针p3、p4、p5和p6(包括在间接节点421

2和425

2中)以标识子叶节点431

2、432

1、433

1和434

1。值得注意的是,此遍历包括不与g2代标识符相关联的指针和键

值对(例如,指针p5、键

值对k2等)。因此,在一些实施方式中,具有来自较早一代的标识符的这种元素也可以被包括在与g2代相关联的遍历中。
[0091]
框640可以包括基于遍历来提供所请求的数据。例如,参考图1和图4c,快照引擎170可以从第二树结构402读取与键0到7相关联的值。在一些实施方式中,如果遍历在树的两个或更多个层级遇到特定键的值,则在这两个或更多个层级中的最高层级找到的值将属于最近的一代。换句话说,在较高层级找到的值的代标识符可以大于或等于(但不小于)在较低层级找到的值的代标识符。因此,在两个或更多个层级中的最高层级找到的值将被用作快照的数据,剩余的(多个)值将被忽略。例如,在图4c所示的第二树结构402中,键

值对k4’(包括在间接节点425

2的缓冲器组块427中,并且与g2相关联)被用作快照值,而键

值对k4(包括在叶节点433

1中,并且与g1相关联)被忽略。在框640之后,过程600可以完成。
[0092]
7.用于从快照进行读取的过程
[0093]
图7示出了根据一些实施方式的示例过程700。在一些示例中,可以使用存储控制器110(图1所示)的一部分或全部来执行过程700。可以在硬件或硬件与编程的组合(例如,可由(多个)处理器执行的机器可读指令)中实施过程700。机器可读指令可以存储在如光学存储设备、半导体存储设备或磁性存储设备等非暂态计算机可读介质中。机器可读指令可以由单个处理器、多个处理器、单个处理引擎、多个处理引擎等来执行。为了说明起见,下面可能参考示出了根据一些实施方式的示例的图1至图4d描述过程600的细节。然而,其他实施方式也是可能的。
[0094]
框710可以包括将键

值对存储在持久性存储装置中的索引中,其中索引的间接节点包括指针,其中每个指针标识索引部分并且包括所标识的索引部分的代标识符,其中索
引包括与多个代相关联的多个快照。例如,参考图1至图4d,存储控制器110和/或合并引擎150可以在键

值索引145中存储键

值对和相关联的代标识符。键

值数据可以存储在对应于不同代的树结构中。进一步地,每个树结构可以包括与特定代相关联的根节点(例如,与代g1相关联的根节点411

1、与代g2相关联的根节点411

2、与代g3相关联的根节点411

3)。键

值索引的间接节点可以包括指向索引部分(诸如子节点和缓冲器组块)的指针。例如,参考图4b,间接节点421

2包括子指针p3和p4(分别标识叶节点431

1和432

1)和围栏指针f0(标识缓冲器组块423)。指针p3、p4和f0各自与所标识的索引部分的代标识符(例如,g1、g2)相关联。
[0095]
框720可以包括接收要读取索引的特定快照的数据的请求,其中特定快照与多个代中的特定代相关联。例如,参考图1,快照引擎170可以接收要读取键

值索引145的快照的数据的请求。在一些示例中,所请求的快照可以对应于与键

值索引145相关联的特定代(例如,g2)。
[0096]
框730可以包括响应于请求而从与特定代相关联的特定根节点开始执行遍历。例如,参考图1和图4d,快照引擎170可以将根节点411

2标识为对应于代g2(与所请求的快照相关联)。快照引擎170然后可以跟随子指针p1和p2(包括在根节点411

2中)来标识子间接节点421

2和425

2。接下来,快照引擎170可以跟随子指针p3、p4、p5和p6(包括在间接节点421

2和425

2中)来标识子叶节点431

2、432

1、433

1和434

1。
[0097]
框740可以包括基于遍历来提供所请求的数据。例如,参考图1和图4c,快照引擎170可以从第二树结构402读取与键0到7相关联的值。在框740之后,过程700可以完成。
[0098]
8.用于从快照进行读取的指令
[0099]
图8示出了根据一些实施方式的存储指令810到840的机器可读介质800。指令810到840可以由单个处理器、多个处理器、单个处理引擎、多个处理引擎等来执行。机器可读介质800可以是非暂态存储介质,诸如光学存储介质、半导体存储介质或磁性存储介质。
[0100]
可以执行指令810以将键

值对存储在持久性存储装置中的索引中,其中索引的间接节点包括指针,其中每个指针标识索引部分,并且包括所标识的索引部分的代标识符,其中索引包括与多个代相关联的多个快照。可以执行指令820以接收要读取索引的特定快照的数据的请求,其中特定快照与多个代中的特定代相关联。可以执行指令830以响应于请求而从与特定代相关联的特定根节点开始执行遍历。可以执行指令840以基于遍历来提供所请求的数据。
[0101]
9.用于从快照进行读取的设备
[0102]
图9示出了示例计算设备900的示意图。在一些示例中,计算设备900可以总体上对应于存储系统100(图1所示)。如图所示,计算设备900可以包括硬件处理器902和包含指令910到940的机器可读存储装置905。机器可读存储装置905可以是非暂态介质。指令910到940可以由硬件处理器902或者由硬件处理器902中所包括的处理引擎执行。
[0103]
可以执行指令910以将键

值对存储在持久性存储装置中的索引中,其中索引的间接节点包括指针,其中每个指针标识索引部分并且包括所标识的索引部分的代标识符,其中索引包括与多个代相关联的多个快照。可以执行指令920以接收要读取索引的特定快照的数据的请求,其中特定快照与多个代中的特定代相关联。可以执行指令930以响应于请求而从与特定代相关联的特定根节点开始执行遍历。可以执行指令940以基于遍历来提供所
请求的数据。
[0104]
值得注意的是,尽管图1至图9示出了各种示例,但是实施方式在这方面不受限制。例如,参考图1,可以设想存储系统100可以包括附加的设备和/或部件、更少的部件、不同的部件、不同的布置等。在另一个示例中,可以设想更新引擎120和查询引擎160可以组合成单个引擎或单元,或者可以包括在存储系统100的任何其他引擎或软件中。其他组合和/或变化也是可能的。
[0105]
数据和指令存储在被实施为一个或多个计算机可读或机器可读存储介质的相应存储设备中。存储介质包括不同形式的非暂态存储器,包括:半导体存储器设备(诸如动态随机存取存储器或静态随机存取存储器(dram或sram))、可擦除可编程只读存储器(eprom)、电可擦除可编程只读存储器(eeprom)和闪速存储器;磁盘(诸如,固定的软盘和可移动盘);包括磁带的其他磁性介质;光学介质(诸如,紧致盘(cd)或数字视盘(dvd));或者其他类型的存储设备。
[0106]
应注意,上文讨论的指令可以在一个计算机可读或机器可读存储介质上提供,或者可替代地,可以在分布在具有可能多个节点的大型系统中的多个计算机可读或机器可读存储介质上提供。这种一个或多个计算机可读或机器可读存储介质或媒介被认为是物品(或制品)的一部分。物品或制品可以指任何制造的单个部件或多个部件。一个或多个存储介质或媒介可以位于运行机器可读指令的机器中、或者位于远程站点处,可以通过网络从远程站点下载机器可读指令以供执行。
[0107]
在前述描述中,阐述了许多细节以使得理解本文中所公开的主题。然而,可以在没有这些细节中的一些细节的情况下实践实施方式。其他实施方式可以包括上文所讨论的细节的修改和变化。所附权利要求旨在涵盖这种修改和变化。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1