首页 / 专利库 / 电信 / 节点 / 子节点 / 持久性存储器上的键-值存贮器

持久性存储器上的键-值存贮器

阅读:656发布:2020-05-08

专利汇可以提供持久性存储器上的键-值存贮器专利检索,专利查询,专利分析的服务。并且一种用于减少计算设备中的恢复时间的技术,所述技术包括:将数据存储在驻留在持久性 存储器 中的键-值存贮器中,所述键-值存贮器包括多个持久性 节点 ,所述多个持久性节点包括键-值对,所述持久性节点的所述键-值对未被排序;将所选择的持久性节点缓存在易失性存储器中,被缓存节点的键-值对被排序,所述缓存包括为每个被缓存节点实例化双 指针 ,所述双指针包括指向所述被缓存节点的 子节点 的易失性指针以及指向所述键-值存贮器中的相应持久性节点的子节点的持久性指针;以及在恢复事件中使用所述双指针来根据需要重建所选择的节点的缓存。,下面是持久性存储器上的键-值存贮器专利的具体信息内容。

1.一种用于计算设备中的方法,所述方法包括:
将数据存储在驻留在持久性存储器中的键-值存贮器中,所述键-值存贮器包括多个持久性节点,所述多个持久性节点包括键-值对,所述持久性节点的所述键-值对未被排序;
将所选择的持久性节点缓存在易失性存储器中,被缓存节点的键-值对被排序,所述缓存包括为每个被缓存节点实例化双指针,所述双指针包括指向所述被缓存节点的子节点的易失性指针以及指向所述键-值存贮器中的相应持久性节点的子节点的持久性指针;以及在恢复事件中使用所述双指针来根据需要重建所选择的节点的缓存。
2.如权利要求1所述的方法,进一步包括从后端存储设备中取得所述持久性存储器中的数据。
3.如权利要求1所述的方法,进一步包括基于对所述键-值存贮器中的特定持久性节点的第一访问,从持久性指针根据需要重建所述易失性指针。
4.如权利要求1所述的方法,其中,所述恢复是在失效接管或其他故障之后。
5.如权利要求1所述的方法,其中,所述缓存包括第二键-值存贮器。
6.如权利要求1所述的方法,其中,所述键-值存贮器包括B+树。
7.如权利要求6所述的方法,其中,所述被缓存节点包括自上次恢复以来在所述B+树中的从树根到被访问键的路径上所访问的任何内部树节点。
8.如权利要求1所述的方法,其中,所述恢复是用户空间进程重启或系统重新启动。
9.一种计算设备,包括:
处理器;
易失性存储器;
持久性存储器;以及
存储有指令的非暂态机器可读存储介质,所述指令在由所述处理器运行时执行包括以下操作的方法:
将数据存储在驻留在所述持久性存储器中的键-值存贮器中,所述键-值存贮器包括多个持久性节点,所述多个持久性节点包括键-值对,所述持久性节点的所述键-值对未被排序;
将选择的持久性节点缓存在所述易失性存储器中,被缓存节点的键-值对被排序,所述缓存包括为每个被缓存节点实例化双指针,所述双指针包括指向所述被缓存节点的子节点的易失性指针以及指向所述键-值存贮器中的相应持久性节点的子节点的持久性指针;以及
在恢复事件中使用所述双指针来根据需要重建所选择的节点的缓存。
10.如权利要求9所述的计算设备,进一步包括后端存储设备,所述后端存储设备的数据由所述持久性存储器缓冲。
11.如权利要求10所述的计算设备,其中,所述后端存储设备包括独立硬盘冗余阵列。
12.如权利要求9所述的计算设备,其中,所述易失性存储器包括动态随机存取存储器
13.如权利要求9所述的计算设备,其中,所述持久性存储器包括非易失性双列直插式存储器模
14.如权利要求9所述的计算设备,其中,驻留在所述持久性存储器中的所述键-值存贮器以B+树来实现。
15.一种存储系统,包括:
后端存储设备;
有源控制器,所述有源控制器在操作中控制将数据写入所述后端存储设备以及从所述后端存储设备读取数据,所述有源控制器包括:
持久性存储器,所述持久性存储器在操作中使用来自所述后端存储设备的数据而被填入;
键-值存贮器,所述键-值存贮器在操作期间驻留在所述持久性存储器中并包括多个持久性节点,每个持久性节点包括一组未排序的键-值对;
易失性存储器;
选择的持久性节点的缓存,所选择的持久性节点在操作期间驻留在所述易失性存储器中,被缓存节点的键-值对被排序;以及
每个被缓存节点的双指针,所述双指针包括指向所述被缓存节点的子节点的易失性指针以及指向所述键-值存贮器中的相应持久性节点的子节点的持久性指针;
桥;以及
无源控制器,所述无源控制器在从所述有源控制器进行失效接管时从所述有源控制器取得控制,所述有源控制器的事务通过所述桥被镜像到所述无源控制器。
16.如权利要求15所述的存储系统,其中,所述后端存储设备包括独立硬盘冗余阵列。
17.如权利要求15所述的存储系统,其中,所述易失性存储器包括动态随机存取存储器
18.如权利要求15所述的存储系统,其中,所述持久性存储器包括非易失性双列直插式存储器模块。
19.如权利要求15所述的存储系统,其中,驻留在所述持久性存储器中的所述键-值存贮器以B+树来实现。
20.如权利要求15所述的存储系统,其中,所述无源控制器包括:
第二持久性存储器,所述第二持久性存储器在操作中使用来自所述后端存储设备的、从所述有源控制器被镜像的数据而被填入;
镜像键-值存贮器,所述镜像键-值存贮器在操作期间驻留在所述第二持久性存储器中并包括多个镜像持久性节点,每个镜像持久性节点包括一组未排序的镜像键-值对;
第二易失性存储器;
所选择的镜像持久性节点的镜像缓存,所选择的镜像持久性节点在所述计算设备的使用中驻留在所述第二易失性存储器中,镜像被缓存节点的镜像键-值对被排序;以及每个镜像被缓存节点的镜像双指针,所述镜像双指针包括指向所述镜像被缓存节点的镜像子节点的镜像易失性指针以及指向所述镜像键-值存贮器中的相应镜像持久性节点的镜像子节点的镜像持久性指针。

说明书全文

持久性存储器上的键-值存贮器

背景技术

[0001] 许多计算机器被设计为用于使系统或部件故障的负面影响最小化。在这方面的一个关注点是“恢复”,其中计算设备试图在某种故障之后恢复其操作状态并重新开始其操作。恢复过程读取在进程重启后幸存的任何数据并重建其运行时的状态。进程重启可以是单纯的进程停止/启动、操作系统(“OS”)重新启动、或甚至“失效接管(failover)”,其中进程在与其之前运行的部件不同的部件上重启。还期望的是,恢复中采用的技术不会对设备的正常操作产生负面影响。附图说明
[0002] 通过参考结合附图进行的以下说明可以理解本文描述的示例,其中,相同的附图标记标识相同的元件。
[0003] 图1描绘了下文要求保护的主题的一个特定示例的硬件软件架构的选定方面。
[0004] 图2图示了图1的示例中的双指针的一个示例。
[0005] 图3图示了图1的示例中的持久性指针的一个示例。
[0006] 图4示出了根据一个或多个示例的双指针的操作。
[0007] 图5以简化版本图示了图1的键-值存贮器(key-value store)的示例。
[0008] 图6图示了诸如能够使用图1的架构来实践的方法的一个特定示例。
[0009] 图7描绘了将图1的架构部署在特定装置中的一个特定示例的硬件和软件架构的选定方面。
[0010] 图8图示了根据一个示例的图7的架构的操作。
[0011] 图9图示了图7的示例中的双指针的一个示例。
[0012] 图10图示了图7的示例中的第二双指针的一个示例。
[0013] 图11图示了图7的示例中的持久性指针的一个示例。
[0014] 图12图示了图7的示例中的第二持久性指针的一个示例。
[0015] 图13至图14图示了图7中示例的持久性存储器中的B+树的节点结构的示例。
[0016] 图15描绘了图7中控制器的架构的选定部分的示例,所述控制器管理其中的键-值存贮器上的事务。
[0017] 图16图示了针对传统实践和本文公开的示例这两者的恢复时间与持久性存储器大小的示例,用于说明可以由本文描述的示例提供相对于传统实践的恢复时间的改进。
[0018] 图17概念性地图示了可以将图7的设备用于一些示例中的示例计算系统。
[0019] 虽然本文描述的示例容易受到各种修改和替代形式的影响,但是附图通过举例图示了本文详细描述的特定示例。然而,应理解,本文的特定示例描述并不旨在限于所公开的特定形式,而相反,本发明意图涵盖落在本文描述示例和所附权利要求的精神和范围内的所有修改、等效物以及替代物。

具体实施方式

[0020] 现在将公开下文要求保护的主题的说明性示例。为了清楚起见,本说明书中并未描述实际实施方式的所有特征。将理解,在任何这种实际示例的开发中,将进行许多实施方式特定的决策以实现开发人员的特定目标,诸如符合系统相关约束和业务相关约束,这些约束将因实施方式而不同。此外,将理解,即使复杂且耗时的这种开发努对于受益于本公开的本领域普通技术人员来说也是常规的任务。
[0021] 图1图示了下文要求保护的主题的一个特定示例的硬件和软件架构100的选定方面。架构100包括易失性存储器105,易失性存储器105包括动态随机存取存储器(“DRAM”)。易失性存储器被称为“易失性”,因为该存储器在断电时不会保留其内容。架构100还包括持久性存储器110,所述持久性存储器在这个特定示例中包括未单独示出的非易失性双列直插式存储器模(“NVDIMM”)。持久性存储器被称为“持久性”、或有时称为“非易失性”,因为该存储器在断电时会保留其内容。
[0022] 在一些示例或传统实践中,存储在持久性存储器110中的数据和/或元数据的影子副本或完整副本被保持在易失性存储器105中,例如,以利用排序定序(sorted ordering)来引用数据和元数据的关联性映射(未示出)的形式。因此,在恢复事件中,可以对持久性存储器110进行扫描以重建易失性存储器105中影子副本的数据结构。因此,在这样的示例中,较大的持久性存储器可能增加恢复时间,因为其可能花费更长的时间来扫描和重建易失性存储器中的影子副本。这样的示例表明,较小的持久性存储器可能对恢复目的有利。然而,较小的持久性存储器可能会降低其他方面的性能。较大的持久性存储器可以例如有时提高写入操作的速度,所以较小的持久性存储器可能会失去写入操作速度的这种益处。
[0023] 本文公开的示例可以通过将用作更新缓冲器的持久性存储器110的内容作为持久性键-值存贮器来管理,来减轻恢复时间与性能之间的这种折衷,所述持久性键-值存贮器涉及到易失性存储器105中的恢复的减少的处理。本文公开的示例可以包括使用易失性存储器105作为持久性存储器110的直写缓存,而不是使用所述易失性存储器来保持持久性存储器110的内容的影子副本。本文公开的示例包括使用双指针200,如图2所示。每个双指针200包括如下文更全面描述的那样实施的易失性指针210和持久性指针220两者。双指针200然后用于恢复,也如下文进一步讨论的。
[0024] 更具体地,持久性存储器110包括键-值存贮器135,键-值存贮器135包括多个持久性节点140,所述多个持久性节点中的仅一个由图1中的附图标记指示。每个持久性节点140包括多个键145,每个键具有相关联的值147。在这个特定示例中,持久性节点140构造在树中,如下文将进一步讨论的。如果持久性节点140是树的内部叶,则相关联值147为持久性指针;如果持久性节点140是叶节点,则相关联值为插入键-值存贮器135中的实际值。
[0025] 键145及其相关联值147可以被称为“键-值对”148。键145在键-值存贮器135中未排序,这意味着这些键不以任何特定顺序保持。由于键145未排序,因此键-值对148也未排序。注意,每个键-值对148中的相关联值147是持久性指针220(在图4中示出),下文将进一步描述其功能。
[0026] 易失性存储器105包括缓存160。通常,当持久性节点140被访问时,其被“缓存”、或暂时存储在缓存160中作为被缓存节点150。仅一个被缓存节点150由图1中的附图标记指示。每个被缓存节点150是其相应持久性节点140的部分副本,每个被缓存节点150包括作为相应持久性节点140的(多个)键-值对148的部分副本的(多个)键-值对158。每个键-值对158包括作为相应持久性节点140的键145的副本的键155、以及作为相应持久性节点140的相关联值147的部分副本的相关联值157。
[0027] 在这个特定示例中,被缓存节点150也构造在树中,同样如下文将进一步讨论的。如果被缓存节点150是树中的内部节点,则键值对158的相关联值157是双指针200,如图2中图示及下文进一步讨论的。每个双指针200包括持久性指针220和易失性指针210。如果被缓存节点150是树的叶节点,则相关联值157可以是存储在相应持久性节点140中的键-值存贮器135中的值。
[0028] 在短语“键-值对(key-value pair)”中,“值(value)”可以是例如接收的用于存储在键-值存贮器中的数据(例如,来自位于键-值存贮器外部的或以其他方式与键-值存贮器分离的部件、程序、过程等)、或指向键-值存贮器中的子节点的指针。例如,子节点的值可以是接收的用于存储在键-值中的数据,而对于内部节点,值可以是指向子节点的指针。在本公开的背景下,“外部(outside)”指从键值存贮器的用户度来看存储在键值存贮器中的值。“用户(user)”这里不是指人,而是指正在使用键值存贮器来存储给定键的值的任何其他代码。
[0029] 因此,每个被缓存节点150是其相应持久性节点140的部分副本,因为其包含作为其相应持久性节点140的键-值对148的部分副本的键-值对158,键-值对158包含与相应持久性节点140的键145相同的键155并包含与相应持久性节点140的值147类似的值157(例如,具有与值147相同的持久性指针220但还包括易失性指针210的值157)。如本文所使用的,节点或键值对的“部分副本”不一定包括少于原始节点或键值对的所有数据,而是可以包括原件的一些或所有数据但在表示、安排等方面存在一些差异(例如,可能被排序而不是未排序),并且在一些示例中可以包括与原始节点或键值对相比更多或不同的数据(例如,除了原件的非易失性指针之外还包括易失性指针)。
[0030] 虽然被缓存节点150包含持久性节点140的部分副本,但被缓存节点150也与其相应持久性节点140的不同之处在于,与持久性节点140的键145和键-值对148不同,每个被缓存节点150的键155以及因此其键-值对158被排序,如上所述。当创建被缓存节点150时,对键155进行排序或定序。注意,这也对键-值对158进行排序。可以以本领域已知的任何合适的方式对它们进行排序或定序。例如,可以以键155的数值的升序来对它们进行排序,其原因将在后面变得明显。
[0031] 架构100关于易失性存储器105和持久性存储器110的功能可以由执行位于存储器180中的指令175的至少一个处理器170来实施。处理器170可以是本领域已知的任何合适种类的处理器,诸如中央处理单元(“CPU”)、或处理器集合中的处理器等。处理器170在执行指令175时可以执行本文描述的关于在易失性存储器105中创建和保持缓存160以及在持久性存储器110中创建和保持键-值存贮器135的功能,并且现在将讨论这些功能在恢复中的使用。
[0032] 现在转向图4,易失性存储器105的这个示例包括被缓存节点400至403,所述被缓存节点具有与被缓存节点150相同的特征,如上所述。图4中图示的示例还包括持久性存储器110的示例,所述持久性存储器包括持久性节点410至413,所述持久性节点具有与持久性节点140相同的特征,如上所述。在图4的示例中,每个被缓存节点400至403包括诸如图2所示的双指针200的双指针。对于每个被缓存节点400至403,键-值对158各自包括指向被缓存节点400至403的子节点的易失性指针210、以及指向持久性存储器110中的相应持久性节点410至413的子持久性节点的持久性指针220。
[0033] 例如,对于被缓存节点400的一个键-值对158,易失性指针210指向易失性存储器105中的子被缓存节点401,并且持久性指针220指向子持久性节点413,所述子持久性节点是与被缓存节点400相对应的持久性节点410(在持久性存储器110中)的子节点。虽然一些示例指针是针对被缓存节点400示出的,但是相同类型的指针可以包含在节点401至403(以及易失性存储器105中的任何其他被缓存节点)的键-值对中的附加键-值对158中。对于持久性存储器110的每个持久性节点410至413等,每个键-值对148的对应值147包括指向持久性存储器110中的子持久性节点的对应持久性指针220,并且不包括指向易失性存储器105中的节点的易失性指针。
[0034] 在一些示例中,图1的键-值存贮器135可以由B+树来实施。图5描绘了简化的B+树键-值存贮器500(在一些示例中,其可以用于实施键-值存贮器135)。树结构是数据结构的一种形式,其在本背景下用于定位存储在计算系统的存储设备(例如,下文讨论的图7中的后端存储设备710)中的所寻找数据。可以作为写入操作的一部分来寻找数据,在写入操作中,过程试图将数据写入存储设备。或者,可以作为读取操作的一部分来寻找数据,在读取操作中,过程试图从存储设备中读取数据。在一些示例中,所述存储设备可以不同于上述持久性存储器和易失性存储器。
[0035] 键-值存贮器500的B+树包括多个链接的节点,每个节点包括数据结构,该数据结构包括键和一个或多个值。这些节点之一是“根节点”或树中的第一节点(例如,不具有父节点且直接或间接作为树中所有其他节点的父节点的节点)。每个其他节点都是内部节点或叶节点。每个内部节点的值是指向另一位置的指针。对于每个内部节点,值是指向树中的其他节点或某个其他位置的指针。如本文所公开的,作为被缓存节点的内部节点的指针可以是诸如以上讨论的双指针。注意,根据定义,没有节点的(多个)指针可以指向根节点。在本文描述的示例中,如果节点的指针指向其他节点,则所述节点是“内部节点”。在叶节点中,这些节点可以存储外部的值形式而不是指针,或者可以存储指向存储设备中可以存储这样的值的位置的指针。在本文描述的示例中,如果节点存储外部值而不是具有指针,或者节点的(多个)指针指向存储设备中的位置,则所述节点是“叶节点”。
[0036] 所以,在图5中,节点505是根节点,因为其是B+树500中的第一节点。由于根节点505由指向其他节点——即,至少节点506至508——的指针链接,因此其也被视为内部节点。(注意,如果指针是双指针,则双指针中的一个将指向持久性存储器的树中的相应节点,如以上关于图4所描述的。)图5并未示出节点506至508的指针所指向的位置。如果这些位置是其他节点,则节点506至508也是内部节点。如果这些位置在存储设备中(即,不是树500中的其他节点),则它们是叶节点。(还应注意,如果节点506至508是叶节点,则它们可以不具有指针,而是存储外部值,如上所述。)出于当前目的,键-值存贮器500被示出为仅具有四个节点505至508。受益于本公开的本领域技术人员将理解,在任何给定的实际实施方式中,键-值存贮器500可以大得多且更复杂,但结构将是类似的。
[0037] 特定的键-值存贮器500为B+树。B+树是本领域常见且众所周知的。B+树的一个特性是B+树的结构与物理存储器关联的方式,B+树用于将所寻找数据索引到该物理存储器。各个键510是相对于彼此唯一的并且允许访问相关联的各个值512。在这个背景下,各个键
510是所寻找数据在存储器中的位置的表示,并且反映对应节点505至508与实际位置之间的B+树结构。相关联的各个值512是指向对应节点505至508与实际位置之间的路径上的下一步长的指针或者是所存储的值。如果对应节点505至508是内部节点——例如,根节点
505——则指针将指向B+树500的下一级别中的另一个节点——例如,节点506至508之一。
(同样,如果指针是双指针,则其中一个指针将指向持久性存储器的树中的相应节点,如关于图4所讨论的)如果对应节点505至508是叶节点,则相关联的值将是来自外部的所存储值或者指向所寻找数据的位置的指针。
[0038] 因此每个节点505至508在键-值对514中包括多个键510和多个值512,每个值512与键510相关联(虽然为了图示简单仅一个键510和一个值512由图5中的附图标记指示)。在内部节点505中,每个值512是指向另一个节点的指针,如果节点506至508是内部节点,则这对它们同样适用。如果节点506至508是叶节点,则每个值512是指向保持实际数据的位置的指针,或者每个值512可以是来自外部的实际所存储的值。
[0039] 键-值对514未被排序。在每个节点505至508中,此节点的键-值对514被存储在此节点的阵列520中。出于这个原因,当对树500进行插入时,这相对较快地执行,因为不需要对节点505至508内的键-值对514进行定序或“重新定序”。这一直对树500具有连反应,因为在任何节点505至508中没有一个键-值对514需要重新定序。
[0040] 现在同时参考图1和图6,图6图示了诸如在一些示例中能够使用图1的架构来实践的方法的一个特定示例。过程600从将数据存储(在605处)在驻留在持久性存储器110中的键-值存贮器135中开始,键-值存贮器135包括多个持久性节点140,所述多个持久性节点140包括键-值对148,持久性节点140的键-值对148如上所述未被排序。键-值存贮器135可以是本领域已知的多种合适的键-值存贮器中的任何一种。在本文讨论的一种特定实施方式中,键-值存贮器是B+树数据结构。
[0041] 再次参考图6,过程600然后通过将所选持久性节点140缓存在易失性存储器105中而继续(在610处),被缓存节点150的键-值对被排序。在计算领域中,“缓存”是包含存储在其他地方的数据的临时副本的存储器,使得可以比其他方式更快地服务来自临时副本的未来数据请求。将数据存储在缓存中即为“缓存”所述数据。因此,过程600(在610处)制作持久性节点140中的信息的副本并在易失性存储器105中创建包含相同信息(虽然例如可能具有不同的表示)的被缓存节点150。如以上所讨论的,被缓存节点150与相应持久性节点140的不同之处在于:被缓存节点包括针对其键-值对的其相关联值的双指针200(如图2所示)而不仅仅包括持久性指针220(如图4所示),并且被缓存节点150的键-值对被排序。
[0042] 更具体地,在本文描述的示例中,从持久性节点140对被缓存节点150进行缓存包括,创建新的被缓存节点150并将其存储在易失性存储器105中,所述新的被缓存节点包括与持久性节点140相同的键和相关联值,所述新的被缓存节点从持久性节点140被缓存,其中键-值对158在被缓存节点150中被排序。存储在易失性存储器105中的被缓存节点150在本文可以被称为“被缓存的”节点,因为它们已经从持久性节点140被“缓存”。然而,不同于持久性节点140的键-值对148,被缓存节点150的键-值对158被排序,如上所述。
[0043] 在本文描述的示例中,易失性存储器105中的每个被缓存节点150可以认为与持久性存储器140中的对应持久性节点140相对应,每个被缓存节点150从对应持久性节点140被缓存。因为被缓存节点150是从持久性节点140缓存的,所以每个被缓存节点150可以在持久性存储器110中具有相应的持久性节点140。被缓存节点150的键-值对158可以从持久性存储器110中的持久性节点140的键-值对148得到,如上所述。然而,持久性存储器110的键-值存贮器135中的少于所有持久性节点140的节点可以在易失性存储器105中具有相应的被缓存节点150。
[0044] 在一些示例中,缓存160可以是键-值存贮器。在缓存160是键-值存贮器的情况下,缓存160可以是与持久性存储器110中的键-值存贮器135相同种类的键-值存贮器。在一些示例中,缓存160可以是与在键-值存贮器135中实施的不同种类的键-值存贮器。在一些示例中,缓存160可以不是键-值存贮器。
[0045] 当前公开的技术允许对于选择哪些持久性节点140将其缓存在易失性存储器105中作为被缓存节点150的方式进行广泛变化。在上面提到的实施方式中,其中键-值存贮器135是B+树,被选择用于缓存为被缓存节点150的持久性节点140可以包括自架构100的上次恢复以来在从树根到所访问键的路径上被访问的任何内部树节点。在这个背景下,在向节点添加键-值对时,在从节点读取键-值对时,在修改节点的键-值对中的值时,在删除节点的键-值对时等等,节点可以“被访问”。
[0046] 其他示例可以选择持久性节点140以用于以不同方式进行缓存。例如,可以将键-值存贮器135的更少内部节点缓存在易失性存储器105中(例如,当易失性存储器105较小时)。可替代地,可以将更高级别的节点缓存在易失性存储器105中,同时排除最低级别的内部节点。或者可以缓存最低级别内部节点的子集。另一方面,一些实施方式可能尝试将更多持久性节点140缓存在易失性存储器105中。例如,一个示例可以缓存所有叶节点、或叶节点的子集。选择方式因此将是对于实施方式而言特定的。
[0047] 被缓存节点150的排序键-值对158对于插入而言是低效的。这是由于插入改变了键-值存贮器135中树的结构,并且,因为键-值对158及其定序反映树的结构,所以树结构的变化改变了排序键的定序。平均而言,当存在插入时,一半数量的键在节点内被移动。更进一步地,这些变化回溯至树、对于所插入节点与直到根节点(且包括根节点)之间的任何节点而言是连锁的。这还涉及对存储屏障(诸如执行流线停滞)的频繁的昂贵且低效的使用以确保恢复的一致性。
[0048] 但是经排序的键-值对,对于树中的查找是相对较高效的,因为与键未被排序的情况相比,查找进程可以利用键的排序的定序来更高效地找到所寻找的键。如果键-值对未被排序(如在持久性存储器中),则进行遍及键-值对阵列的昂贵线性搜索以找到期望的键-值对。虽然经排序的键-值对的查找速度相对较快,但它们的插入速度相对较慢(即,由于需要对所插入节点上方的节点中的键进行重新定序,如上所述)。然而,虽然未排序键-值对的查找速度相对较慢(即,由于使用线性搜索),但它们的插入速度相对较快,因为不需要进行重新定序(如上所述)。
[0049] 双指针200(如图2所示)利用持久性节点140和被缓存节点150的对偶性以及键-值对148在节点140中未排序而键-值对158在被缓存节点150中被排序的事实。双指针200保持指向给定子节点的两个副本(即,持久性节点140版本和被缓存节点150版本这两者)的指针,从而使得能够根据背景而使用期望的属性(即,经排序的或未排序的)。例如,本文描述的示例(例如,指令175)可以使用被缓存节点150的经排序的键-值对158以进行查找(从而为此目的有利地利用使用排序键155的效率),而使用持久性节点140的未排序键-值对148以进行插入(从而为此目的有利地利用使用未排序键145的效率)。
[0050] 上面提到排序键对于插入而言是低效的。这种低效在持久性存储器中比在易失性存储器中要高得多。如上所述提到的存储屏障(store barrier)的使用是指这一点。对易失性存储器中的被缓存节点中的排序键-值的插入要便宜得多(虽然与未排序的情况相比仍然成本更高)。在插入键-值对时,键-值对被插入到持久性存储器中的未排序节点中(避免成本),并被插入到易失性存储器中的缓存中的排序节点中(产生一些成本,但比持久性存储器中成本小得多)。
[0051] 转到图6,过程600中的缓存(在610处)包括为每个被缓存节点150实例化双指针200,双指针200包括指向易失性存储器105中的被缓存节点150的子节点的易失性指针210以及指向持久性存储器110的键-值存贮器135中的相应持久性节点140的子节点的持久性指针220。对于每个双指针200,对应的易失性指针210和持久性指针220均驻留在易失性存储器105中。因此,在执行查找时,可以将被缓存节点150的排序键155与易失性指针210结合使用(例如,以访问期望的键-值对)。在执行插入时,可以将持久性节点140的未排序键145与持久性指针220结合使用。
[0052] 在执行恢复过程的情况下,过程600然后通过使用双指针200来根据需要重建(在620处)选择的节点的缓存160而继续。在本文描述的示例中,“恢复”可以指计算系统试图提供故障容错以及试图防止由于其中的故障引起的信息损坏所凭借的(多种)机制。当进程(即,除了过程600)中断时,所述进程可以重启并且可以随后读取在进程重启后幸存的任何数据,并且然后通过找到持久性存储器及其数据结构并以本领域已知的方式撤销或完成被故障中断的进程操作来重建其运行时状态。然而,恢复不仅可以适用于进程,而且还适用于任何其他代码形式。其他示例包括但不限于内核启动(如果代码在内核中运行的话),这与用户空间过程相反。本技术不限于用户空间进程重启。
[0053] 这个示例中的缓存重建(在620处)是“根据需要的”。例如,可以在“按照需要”的基础上重建缓存160及其内容。处理器170因此不会试图一次性重建所有缓存160作为恢复过程的一部分。相反,在一些示例中,操作可以在重启之后重新开始,并且当进行访问时,处理器170照常执行这些操作——例如,首先查看缓存160,并且如果未找到信息,则查看键-值存贮器135。当恢复开始时,缓存160将开始为空,但是随着时间的推移,将如上所述创建被缓存节点150并且填充缓存160。因为不存在影子副本,所以不需要扫描持久性存储器和在易失性存储器中重建影子副本,从而加速了恢复过程。
[0054] 现在将公开更具体的示例以提供对下文要求保护的主题的更全面理解。图7图示了采用双控制器架构的示例存储系统(例如,存储阵列)700的硬件和软件架构的选定方面。下文要求保护的主题不限于诸如存储系统700的存储系统。事实上,下文要求保护的主题甚至不限于与存储系统一起使用。其可以不受限制地在台式计算机或膝上型计算机、以及甚至诸如移动电话和平板计算机等移动装置上使用。因此,尽管这个特定示例在存储系统中实施,但是本文描述的示例不限于此并且可以部署到几乎任何计算设备。
[0055] 类似地,虽然这个示例使用双控制器架构,但其他示例可以具有不同数量的(多个)控制器。本技术可以部署在计算设备上而不管所述计算设备是使用一个、两个还是更多个控制器。一些示例可以甚至不具有控制器(如图7所示的示例),并且可以反而依赖于如上所述的不作为任何种类控制器的一部分的处理器。
[0056] 存储系统700包括有源控制器705和后端存储设备710。有源控制器705接收对存储在后端存储设备705中的数据的请求并响应于这些请求通过结构(fabric)715传输数据。结构715可以是例如网络或某种其他种类的计算系统。结构的一部分可以是使用后端存储设备710中的数据或其他信息的其他设备或装置(未示出),其传输请求然后使用响应于这些请求而返回的数据。
[0057] 后端存储设备710还包括无源控制器705'。有源控制器705的操作被镜像到无源控制器705',如下所述。这包括有源控制器705的所有操作,而不仅仅是存储器操作。在有源控制器705故障的情况下,功能转移到无源控制器705',所述无源控制器然后成为有源控制器以进行存储系统700的操作。这是上面提到的“失效接管”的示例。
[0058] 在这个特定示例中,后端存储设备710可以更具体地包括一个或多个存储装置725(图7中仅指示了一个),所述一个或多个存储装置可以是(多个)固态驱动器、(多个)硬盘驱动器、或任何其他类型的存储装置、或其组合。在一个特定示例中,后端存储设备710采用闪存技术,并且是本领域已知的独立硬盘冗余阵列(“RAID”)730中的“闪存阵列”。后端存储设备710在断电时保留其内容。
[0059] 可以使用本领域已知的任何合适的技术将数据存储在后端存储设备710上。在所图示的示例中,数据存储在包括通过B+树索引745访问的日志结构布局740的数据结构735中。然而,可以使用本领域已知的任何合适的数据结构。不论将数据存储在后端存储设备710中的方式如何,都可以使用本技术。
[0060] 仍然参考图7,结构715可以使用本领域已知的任何协议来实施。例如,结构715可以使用基于因特网协议(“IP”)的标准,诸如因特网小型计算机系统接口(“iSCSI”)或小型计算机系统接口(“SCSI”)。或者,结构715可以采用某种替代方案,诸如串行数据传输架构,如光纤通道标准光纤通道仲裁环路(“FC-AL”)。还可以使用其他替代方案,并且可以使用本领域已知的任何合适的协议或标准。
[0061] 在这个示例中,有源控制器705包括中央处理单元(“CPU”)750、存储器控制器755、易失性存储器760、以及持久性存储器765。在这个示例中,存储器控制器755是持久性存储器765的一部分。在这个示例中,CPU 750可以是单核CPU、多核CPU、或任何其他合适类型的一个或多个处理器。CPU 750与结构715接口连接以从存储系统700接收数据并向其传输数据。CPU 750通过存储器控制器755来处理存储器事务。存储器控制器755可以是持久性存储器765的一部分或与其分离。例如,易失性存储器760可以包括动态随机存取存储器(“DRAM”),并且持久性存储器765可以包括多个非易失性双列直插式存储器模块(“NVDIMM”),均如上所述。
[0062] 有源控制器705的操作被镜像到无源控制器705'(例如,通过快捷外围部件互连(“PCIe”)非透明桥(“NTB”)768)。这些操作包括控制器关于键-值存贮器785和缓存790的所有操作。无源控制器705'具有与有源控制器705类似的架构,其中相同的部件具有相同的标号但具有附加的撇号以便与有源控制器705中的版本区分开(即,易失性存储器760'是以上关于易失性存储器760描述的易失性存储器,等等)。在失效接管的情况下,无源控制器705'将从有源控制器705获得对操作的控制。这需要经受本文描述的恢复过程以保持存储系统700对结构715的可用性。
[0063] 仍然参考图7,在这个特定示例中,CPU 750采用英特尔x86架构。其他示例可以使用除了英特尔x86架构之外的处理器架构。将关于所图示的示例来讨论x86架构,以便提供对所要求保护主题的更全面理解。
[0064] 应该对英特尔x86架构上的CPU缓存层次结构和存储器定序(图7中未示出)进行管理,以考虑其耐久性、一致性、性能、快速恢复和可靠性。关于耐久性,在暴露每个B+树操作的副作用之前,存储器写入应该跨持久性边界。即,CPU 750发出到某个特定地址的写入,这个写入不应被认为是“持久性的”,直到写入从CPU 750传递到存储器控制器755。
[0065] 因此,在这个示例中,“持久性边界”是CPU 750与存储器控制器755之间的边界。关于一致性,在突然断电时捕获的B+树图像应该始终一致。在这个背景下,“被捕获”指记录在持久性B+树1505和回滚日志1510中的B+树状态,这两者均示出在图15中并在下文进一步讨论。还在这个背景下,当不存在未执行事务时,B+树是“一致的”。即,被故障中断的所有未决事务都已完成或撤销。关于性能,对B+树的所有取(get)操作和放(put)操作都应该以低等待时间完成。并且,关于可靠性,B+树应该被镜像在无源控制器上以防止单点故障。
[0066] 耐久性和一致性的目标可以使用被称为“存储屏障”的处理器命令来满足。存储屏障控制处理器内某些操作的定时,并且可以用于使用无序执行来控制处理器架构中命令的执行定序。图7的示例所采用的x86架构中的此类存储屏障的示例包括CLFLUSH、或CLFLUSHOPT+fence、或CLWS+fence、或MOVNTDQ(非暂态存储)+fence。在实施本文公开的示例时,除了x86架构之外的架构可以使用不同的存储屏障来达到相同的效果。
[0067] 图7中的示例的某些元件在图8中被更详细示出。存储器控制器755与实际NVDIMM 800一起形成持久性存储器765的一部分。NVDIMM 800包括动态随机存取存储器(“DRAM”)装置802、NAND闪速存储器804、和控制器806。存储器控制器755包括多个处理器核:核1至核N。
核1至核N每个核包括1级和2级缓存808、810(被称为L1、L2缓存)、加载和存储缓冲器812、写入组合(“WC”)缓冲器814、和多个寄存器816。除了核1至核N之外,存储器控制器755还包括3级(或“L3”)缓存818和写入未决队列820。
[0068] 存储器控制器755与NVDIMM 787一起形成异步DRAM刷新(“ADR”)域。ADR域允许电源(未示出)用信号通知存储器控制器755例如已经发生系统断电。在接收到这个信号时,使用来自超级电容(未示出)的剩余电力将ADR域内的所有数据持久保存到NVDIMM 800。对于回写映射的存储器区域的读取/写入通常没有定序保证。可以以任何顺序对L1、L2和L3缓存进行刷回(flush)。对于存储器定序,读取可以发生在缓冲写入之前。因此,电源故障一致性通过存储屏障指令强制执行定序,所述指令诸如CLFLUSH、或CLFLUSHOPT+fence、或CLWS+fence、或MOVNTDQ(非暂态存储)+fence。
[0069] 关于低等待时间,在实施持久性B+树节点布局时存在两难问题。一方面,键-值对在节点内被排序实现了更快的查找,因为查找不必执行遍及键-值对的昂贵线性搜索。另一方面,允许键-值对未被排序通过减少CPU缓存行刷回(cache line flush)等实现了节点内的更快速插入。对排序键-值进行重新定序对花费时间,并且缓存行刷回用于保持其中对键-值对重新定序的恢复的一致性。
[0070] 使用双指针900(其中一个在图9中示出)利用了键-值存贮器785和缓存790中的节点770、780的对偶性,如下文讨论的。双指针900在结构和操作上类似于以上讨论的图2中的双指针200。如以上相对于图1中的被缓存节点150的键-值对158的双指针200(如图2所示)所描述的,双指针900是被缓存节点770中的键-值对775的值776。还如以上所讨论的,缓存790中的被缓存节点770是从键-值存贮器785中的持久性节点780被缓存的。
[0071] 因此,至少一些B+树节点(即,持久性节点780)可以具有两个逻辑副本,如上所述,其中一个是另一个的部分副本(即,包含相同的键-值对集合但具有不同的键-值对定序、和/或位的不同物理表示等)。持久性存储器765中的由持久性指针920所指向的一个副本(即持久性节点780)包含未排序的键-值对以用于快速插入;并且易失性存储器760中的由易失性指针910所指向的一个副本(即被缓存节点770)包含经排序的键-值对以及诸如锁定等非持久性数据。
[0072] B+树节点的这种对偶性带来以下两种背景的优点:使用易失性存储器760中具有经排序的键-值对778的被缓存节点770进行快速查找,以及利用持久性存储器765中具有未排序的键-值对的持久性节点780减少缓存行刷回。使用易失性存储器760的缓存790中的被缓存节点770可以完成从根到叶节点的所有遍历。当节点被修改时,会将变化写入到易失性存储器760和持久性存储器765这两者——即写入到节点的两个副本。(注意,由于写入操作,如果持久性节点780尚未被缓存,则如上所述将其缓存为被缓存节点770。)
[0073] 更具体地,并且同时参考图7和图9,每个被缓存节点770包括多个经排序的键-值对775。每个键-值对775包括键776和值777。在内部节点中,值777是采用上面针对图1和图4描述的方式的双指针900。每个双指针900包括两个部分:易失性指针(“vptr”)910和持久性指针(“pptr”)920。易失性指针910指向易失性存储器760的缓存790中的子被缓存节点770。持久性指针920指向持久性存储器765中的键-值存贮器785中的相应子持久性节点780。由于缓存790被镜像为无源控制器705'的缓存790',因此内部被缓存节点770'中的键-值对
775'的值777'是镜像双指针900'(如图10所示),每个包括易失性指针910'和持久性指针
920'。
[0074] 持久性存储器765的键-值存贮器785中的持久性节点780的未排序的键-值对786包括未排序的键782及其相关联的值784。对于每个内部持久性节点780,相关联的值784是持久性指针920(如图11所示),所示持久性指针以上面针对图1和图4描述的方式指向子持久性节点780。由于键-值存贮器785被镜像为无源控制器705'的键-值存贮器785',因此相关联的值784针对内部持久性节点780'被镜像为镜像持久性指针920',如图12所示。
[0075] 图13和图14图示了B+树键-值存贮器785的节点结构。图13图示了代表性内部节点1300的结构,并且图14图示了代表性叶节点1400的结构。取决于持久性节点在如上所述的树中的位置,每个持久性节点780将是内部节点(如下文关于内部节点1300描述的)或叶节点(如下文关于叶节点1400描述的)。每个持久性节点780因此将具有诸如内部节点1300或叶节点1400等的结构。
[0076] 内部节点1300包括记录未排序的节点内的槽(slot)1315的可用性的位图1305。内部节点1300包括槽1315的槽阵列1310,所述槽阵列将索引写入到键-值阵列1320中的未排序实体以加速二进制搜索。叶节点1400包括记录指纹(fingerprint)1415的阵列1430中的槽1410的可用性的位图1405,所述指纹是小的1字节哈希,作为提示以用于加速未排序的键-值阵列1435的线性搜索。节点1300、1400还分别包括键-值阵列1320、1435。
[0077] 为了加速到图7所示的持久性节点780的未排序的键-值对775中的插入,图13和图14所示的位图1305、1405被保持在每个节点770的键-值存贮器785中。位图1305跟踪节点
770内的“槽”1315的可用性,以便插入新的键-值对1430。为了并发控制,被缓存节点770保持8字节版本化的锁(未示出)。所有查找操作都使用版本验证来解决读-写冲突。插入操作获取一个或多个节点上的锁(如下所述)以防止写-写冲突(即,在交错的事务执行中覆盖未提交的数据)。
[0078] 现在参考图7,易失性存储器760用作到持久性存储器中的更新缓冲器的直写缓存。这意味着没有操作被认为完成,直到也对相应的持久性节点780执行写入,该写入修改被缓存节点770。即,在将操作报告为已完成之前,还对相应的持久性节点780进行对被缓存节点770所进行的更新。
[0079] 由于易失性存储器760用作更新缓冲器(其位于持久性存储器765而不是影子副本中)的直写缓存,因此图9所示的双指针900具有四种状态。每种状态由元组{vptr,pptr}表示。第一状态是{NULL,NULL},其是NULL双指针。第二状态是{NULL,p},仅包含持久性指针的双指针。当双指针被初始地读取到易失性存储器时,其将处于这种状态。第三状态是{v,p},具有有效易失性指针和有效持久性指针这两者的双指针(具有缓存在易失性存储器中的易失性副本的所有有效节点都将使用处于这种状态的指针)。并且第四状态是{v,NULL},为无效状态,因为易失性存储器是直写缓存。即,当数据被写入到持久性存储器765时,其同时也被写入到易失性存储器760中,如本文所描述的。所以,将不存在不具有相应持久性节点780的被缓存节点770。
[0080] 为了改进所公开的功能,所图示的示例实施了一系列树操作。这里,当前感兴趣的是Get()、Put()和Del()功能。注意,这些是实施方式特定的并且在其他示例中可以改变。将以高级别来描述这三个功能中的每一个。然而,从本公开中受益的本领域技术人员将能够容易地实施这些功能或与其类似的功能。
[0081] Get()、Put()和Del()功能以与它们用在同易失性存储器760和持久性存储器785相关联的其他操作中相同的方式用在恢复中。它们是标准x86架构的一部分,并且以与在采用x86架构的传统系统中相同地方式进行操作,除了稍微修改以用于如现在将描述的示例性示例的当前背景中。
[0082] Get()功能使用每个内部持久性节点1300的键-值阵列1320中的搜索键来从根到叶向下遍历B+树。注意,内部持久性节点1300此时是B+树的内部节点。在向下遍历B+树的同时,针对易失性存储器760中缺少易失性副本的每个持久性节点,来缓存内部被缓存节点1300。在到达叶节点时,定位键-值对1435(使用哈希或指纹1415)。最后,Get()函数根据首次访问节点时遇到的版本来验证叶节点1400的版本。
[0083] Put()函数向下遍历叶节点1400并锁定叶节点1400。其然后将键-值对插入阵列1435中。对于崩溃一致性,在更新节点的位图1405之前插入键-值对。如果发生节点分离(node split),其将丢弃叶节点锁并重新获取所有必需的节点锁(按预定义的顺序)并从下到上分离节点。对于原子性,分离操作使用回滚日志,所述回滚日志记录分离中涉及的每个节点的键-值移动。
[0084] Del()功能通过放宽B+树的高度平衡考虑因素来减少节点合并期间的写入放大。做出这种假设是因为在这个特定示例中,来自更新缓冲器的随机删除很少——一旦树被完全填充,其通常在其内容被刷回到磁盘后被完全删除。这种假设允许持久性存储器以偶尔的不平衡为代价避免树中的合并操作。
[0085] 更一般地,并且参考图15,诸如由以上讨论的Get()、Put()和Del()函数执行的事务等事务由事务管理器(transaction manager)1500结合持久性分配器(“PMDK”)1505来执行。键-值存贮器785不仅包括持久性B+树1505,而且还包括回滚日志(undo log)1510、以及用于进行镜像的复制指令1515。回滚日志1510跟踪尚未完成的进行中的事务。在这个特定示例中,恢复时间是通过限制并发的未完成事务的数量来界定的。
[0086] 事务管理器1500和持久性分配器1505实际上是有源控制器705的CPU 750的一部分,并且通常以硬件与软件的组合来实施。事务层基于键-值存贮器785之上的开放式并发控制(“OCC”)。这有助于版本验证和锁定,以实现更强的隔离和针对原子多放操作(atomic multi-put operation)的每CPU回滚日志记录(per-CPU undo logging)。
[0087] 在操作中,有源控制器705经由持久性存储器765和易失性存储器760从后端存储设备710接收数据并向后端存储设备710传输数据。使用Get()、Put()和Del()树函数来如上所述地建立和保持键-值存贮器785(在这个示例中,即持久性B+树)以及缓存790。诸如遍历和查找等非修改操作从被缓存内部节点开始。诸如插入和删除等修改操作对易失性节点和持久性节点均施加变化。
[0088] 在正常操作期间,为了取得信息,Get()函数在缓存中的树的根处开始,检查被缓存根节点中的易失性指针。如果未找到根节点,则如上所述使根节点从持久性存储器被缓存。一旦进行了缓存,则检查易失性指针。执行二进制搜索以首先使用检查缓存的相同进程来定位(多个)子节点,并且然后,如果被缓存节点丢失,则从持久性存储器中取得被缓存节点、对键及其组合值进行排序、并对节点进行缓存。进程一直重复到叶节点,直到所寻找的信息被缓存并且可以从缓存访问该信息。
[0089] 在正常操作中,Put()函数以与上面刚刚描述的Get()函数相同的方式向下进行到叶节点。Put()函数在持久性存储器中的叶节点中找到空槽。这包括对叶节点中的位图执行搜索,以指示空闲槽的位置。然后通过将值写入到空槽来更新所述值,更新位图。如果Put()中间发生崩溃,则由于最后更新位图,因此可以检测到Put()没有完成。注意,还以相同的方式对对应的被缓存节点进行更新,除了没有位图。
[0090] 如果节点已满,则对节点进行分离。由于分离是在持久性数据结构中执行的,因此应该使用回滚日志以原子方式来执行。实例化新的节点结构,并复制原始完整节点中的键-值对的一部分。更新指针,并且将更新汇总(roll up)到树。如果操作中断并启动恢复,则查阅回滚日志。取决于指针更新和汇总的状态,分离被“撤销(undone)”或完成以进行恢复。再次注意,分离操作也是在缓存中执行的,但未被跟踪,因为缓存不持久并且在恢复期间被重建。
[0091] 这些动作全都是正常操作的一部分,并且指示正常操作可以如何影响恢复。这是因为,虽然不必重建缓存,但恢复了持久性存储器。作为恢复持久性存储器的一部分,Put()函数跟踪回滚日志中的操作,诸如分离操作。回滚日志还跟踪其中键-值存贮器的用户在单次遍历期间插入或更新多个键-值对的操作。恢复检查(go through)回滚日志,以完成或回滚任何中断的操作以便恢复持久性存储器。
[0092] 如以上所讨论的,在诸如失效接管或系统断电等多个事件时发生恢复。恢复过程通过针对进行中的操作扫描回滚日志而开始,并且然后将无源控制器705'的持久性存储器765'中的B+树回滚到一致状态。在进程重启或控制器失效接管之后,任何给定节点的双指针处于{NULL,p}状态,直到恢复之后对节点的第一次访问。出现这种状态是因为被缓存节点770'不持久并且因此是NULL,而持久性节点780'持久并且因此“p”仍然存在。
[0093] 在恢复期间不需要初始化非持久性数据,因为一旦恢复完成,就在操作期间在键-值存贮器785'中的第一次访问时重建缓存790'。在查找未在易失性存储器760中找到被缓存节点770的情况下,查找访问持久性存储器765中的持久性节点780,在的持久性节点780中键-值对786未排序。(“查找”是诸如上面提到的Get()、Put()和Del()函数等操作的一部分,用于“查找”或定位B+树中的值。)为了避免昂贵的线性扫描,持久性节点770保持节点结构内的每键哈希(per-key hash)(或指纹)1415,如图14所示。这些哈希值被选择为较小(1字节),使得整个节点的哈希可以适合位于一个CPU缓存行中。通过扫描哈希1430,可以快速查找节点内的键。
[0094] 为了确保更新缓冲器的高可靠性,键-值存贮器785的B+树更新也通过PCIe NTB768复制到无源控制器705'的键-值存贮器785'。在这个特定示例中,以逻辑级别完成复制,即在两个控制器上,持久性存储器上的B+树的物理布局是不同的。这是通过在无源控制器705'上运行后台程序(未示出)来实现的,所述无源控制器通过NTB 768接收关于对B+树的逻辑更新的消息。将这些施加于备用树,使用回滚日志记录来确保两边的一致性。
[0095] 在一些传统实践中,恢复时间可能随着NVDIMM大小的增加而恶化,而写入放大(write amplification)降低。恢复时间可能恶化,因为恢复可能涉及对持久性存储器(例如,NVDIMM)的全扫描以重建易失性存储器(例如,DRAM)中的持久性存储器数据的影子副本。另一方面,写入性能可能改进,因为较大的持久性存储器可能会降低盘上索引的写入放大。恢复时间与写入性能之间的这种折衷是不合需要的。
[0096] 图7中图示的示例使用采用有源-无源配置的双控制器705、705'来获得高可靠性。这里的一个考虑因素是上述“失效接管”之后的恢复过程。在一些传统实践中,控制器失效接管时间可以在20至30秒的范围内,并且可以由将持久性存储器(NVDIMM)的全部内容恢复到易失性存储器(DRAM)中所涉及的处理(例如,其中持久性存储器用作更新缓冲器,用于在刷回到后端存储设备之前存储数据和元数据)来控制。虽然较大的持久性存储器可能对失效接管时间产生负面影响,但由于元数据的写入放大较低,因此有利于系统的性能。
[0097] 为了减轻失效接管时间与性能之间的这种折衷,本文描述的示例可以将持久性存储器765中的更新缓冲器作为持久性键-值存贮器785而管理,所述持久性键-值存贮器可以对于到易失性存储器760中的恢复使用较少的处理。键-值存贮器785基于持久性存储器765上的B+树结构。除了高效性能之外,B+树设计的优点还包括快速恢复。本文描述的示例可以使失效接管时间独立于持久性存储器大小,并且还为后端存储设备710上的写入性能带来显著改进。
[0098] 图16示出了这种技术相对于其他示例的恢复时间方面的潜在改进的示例。图16更具体地用曲线图表示了传统实践1600与当前公开的技术1605两者的恢复时间与持久性存储器大小的关系。如以上所讨论的,在传统实践中,易失性存储器通常包括在恢复时重建的、持久性存储器内容的完整影子副本。在本文公开的技术中,因为缓存是“根据需要”重建的,所以可以继续进行恢复,而无需等待整个影子副本的重建。注意,改进随着持久性存储器大小的增加而直接成规模。还可以体验到对于写入放大的类似改进。
[0099] 图17图示了可以采用存储系统700的示例计算系统1700的选定部分。在一些示例中,存储系统700可以是例如包括一个或多个控制器和多个存储装置的存储阵列。在其他示例中,存储系统700可以是例如独立的数据库服务器700'或机架安装式数据库服务器700”。计算设备1710上的用户1705可以通过网络1715和通信链路1720与应用程序进行接口连接,该应用程序读取和写入驻留在服务器700'、700”中的一个或两个上的数据。网络1715的实施方式限定了如图7所示的结构715。然而,如以上所指出的,下文要求保护的主题不限于在诸如服务器700'、700”等存储系统中使用。在替代性示例中,本文描述的技术可以用于其他类型的计算设备,诸如计算设备1710。
[0100] 本文的详细描述的一些部分是在软件实施的进程方面呈现的,所述进程涉及对计算系统或计算设备中的存储器内的数据位的操作的符号表示。这些描述和表示是本领域技术人员用来最有效地将他们工作的实质传达给本领域其他技术人员的方式。所述进程和操作涉及物理量的物理操纵,这些物理操纵将物理地变换在其上执行操纵或在其上存储结果的特定机器或系统。通常,但不一定,这些量采用能够被存储、传递、组合、比较、以及以其他方式操纵的电信号、磁信号或光信号的形式。已经证明有时(主要出于通用的原因)将这些信号称作数据、位、值、元素、符号、字符、术语、数字等等是便利的。
[0101] 所有这些术语和类似术语都与适当的物理量相关联,并且仅仅是应用于这些量的方便标签。除非另有特别说明,否则,如在整个本公开中显而易见的是,这些描述涉及操纵表示为一些电子装置的存储设备内的物理(电子、磁性或光学)量的数据并将所述数据变换为类似地表示为存储设备内、或传输设备或显示设备中的物理量的其他数据的电子装置、机器或系统的动作和进程。表示这种描述的术语的示例是但不限于:术语“处理(processing)”、“计算(computing)”、“计算(calculating)”、“确定(determining)”、“显示(displaying)”等。
[0102] 此外,软件功能的执行将变换在其上执行所述功能的计算设备。例如,数据的获取将物理地改变存储设备的内容,随后处理此数据也是如此。物理改变是“物理变换”,因为其改变了计算设备的存储设备的物理状态。
[0103] 还应注意,本文描述的示例的软件实施方面通常在某种形式的程序存储介质上编码或在某种类型的传输介质上实施。程序存储介质可以是磁性的(例如,软盘或硬盘驱动器)或光学的(例如,光盘只读存储器、或“CD ROM”),并且可以是只读的或随机存取的。类似地,传输介质可以是双绞线对、同轴电缆、光纤或本领域已知的一些其他合适的传输介质。下文要求保护的主题不限于任何给定实施方式的这些方面。
[0104] 这里结束了详细描述。以上公开的特定示例仅是说明性的,因为本文描述的示例可以以对受益于本文教导的本领域技术人员显而易见的不同但等效的方式进行修改和实践。此外,除了在下面的权利要求中描述的之外,并非旨在对本文所示的构造或设计的细节施加限制。因此显而易见的是,可以改变或修改上面公开的特定示例,并且所有这些变化都被认为在所附权利要求的范围和精神内。因此,本文寻求的保护如下面的权利要求所述。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈