具体实施方式
本申请描述了多种不同的实施例和实施方式。下面的部分描述了适用于实践各种实施方式的示例框架。接下来,本申请描述了用于实现存储引擎的示例***、设备和过程。
示例环境
图1示出了可用于实现存储***的示例环境100。环境100可以包括存储引擎102。在实施方式中,存储***102可以包括键值引擎104和一个或多个存储设备106-1、…、106-N(统称为存储设备106),其中,N是大于或等于1的整数。键值引擎104和多个存储设备106可以经由一个或多个连接108-1、…、108-M(统称为连接108)彼此传输数据,其中,M是大于或等于1的整数。在此示例中,一个或多个存储设备106被称为包括在存储***102中。在其它实例中,一个或多个存储设备106可与存储***102相关联并可被存储***102访问。
在此示例中,存储***102被描述为单个实体。在其它实例中,存储***102可位于或包括在一个或多个服务器110-1、…、110-K(统称为服务器110)中,其中,K是大于或等于1的整数。在实施方式中,存储***102可以包括在数据中心或云计算基础设施112中,其可以包括例如多个服务器(例如,服务器110)。在实施方式中,存储***102可以是数据中心或云计算基础设施112的一部分,并且可以负责存储数据和提供相关的存储功能,例如记录日志记录、响应于用户请求查询数据等。此外,在实施方式中,环境100还可以包括一个或多个客户端设备114-1、…、114-L(统称为客户端设备114),其中,L是大于或等于1的整数。一个或多个客户端设备114可以通过网络116与数据中心或云计算基础设施112(包括存储***102和/或服务器110)传输数据。
在实施方式中,一个或多个服务器110和一个或多个客户端设备114中的每一个都可以实现为各种计算设备中的任一种,但不限于台式计算机、笔记本或便携式计算机、手持设备、上网本、互联网设备、平板电脑或平板计算机、移动设备(例如,移动电话、个人数字助理、智能电话等)、服务器计算机等,或其合并。
在实施方式中,一个或多个存储设备106中的每一个可以实现为具有存储器或存储能力的各种设备中的任一种,但不限于块存储设备、固态设备(SSD)、NUMA(非统一存储器访问)设备、NVMe(非易失性存储器快车)设备等。
一个或多个连接108可以是数据通信网络,包括通过无线和/或有线连接来连接存储***102(例如,存储***102的存储器)和一个或多个存储设备106的一条或多条数据通信线路或信道。有线连接的示例可包括电载波连接(例如,通信电缆、计算机或诸如串行总线、PCIe总线或通道等的通信总线)、光载波连接(例如,光纤连接等)。无线连接可以包括例如WiFi连接、其他射频连接(例如,等),等等。
在实施方式中,网络116可以是无线或有线网络或其合并。网络116可以是彼此互连的单个网络的集合,并且用作单个大型网络(例如,互联网或内部网)。这种单个网络的示例包括但不限于电话网络、有线网络、局域网(LAN)、广域网(WAN)和城域网(MAN)。此外,各网络可以是无线或有线网络或其合并。有线网络可包括电载波连接(例如通信电缆等)和/或光载波或连接(例如光纤连接等)。无线网络可包括例如WiFi网络、其它射频网络(例如,Zigbee等)等。
示例存储***
图2更详细地示出了存储***102。在实施方式中,存储***102可以包括但不限于一个或多个处理器202、输入/输出(I/O)接口204和/或网络接口206以及存储器208。另外,存储***102还可以包括键值引擎210(例如,键值引擎104)、一个或多个存储设备212(例如,一个或多个存储设备106)和一个或多个数据通信信道214。在实施方式中,键值引擎210可以包括至少一个处理器(例如,处理器202)和存储器(例如,存储器208)。
在实施方式中,存储***102的一些功能可以使用硬件来实现,例如,ASIC(即,专用集成电路)、FPGA(即,现场可编程门阵列)和/或其他硬件。在实施方式中,存储***102可以包括一个或多个计算设备,或者可以包括在一个或多个计算设备中。
在实施方式中,处理器202可以被配置为执行存储在存储器208中和/或从I/O接口204和/或网络接口206接收到的指令。在实施方式中,处理器202可以被实现为一个或多个硬件处理器,其包括例如微处理器、专用指令集处理器、物理处理单元(PPU)、中央处理单元(CPU)、图形处理单元、数字信号处理器、张量处理单元等。附加地或可选地,本文所描述的功能可以至少部分地由一个或多个硬件逻辑组件来执行。举例并且不限于,可使用的硬件逻辑组件的说明性类型包括现场可编程门阵列(FPGA)、专用集成电路(ASIC)、专用标准产品(ASSP)、片上***(SOC)、复杂可编程逻辑器件(CPLD)等。
存储器208可以包括计算机可读介质(或处理器可读介质),其具有诸如随机存取存储器(RAM)之类的易失性存储器的形式和/或诸如只读存储器(ROM)或快闪RAM之类的非易失性存储器的形式。存储器208是计算机可读介质(或处理器可读介质)的示例。
计算机可读介质(或处理器可读介质)可包括易失性或非易失性类型、可移动或不可移动的介质,其可使用任何方法或技术实现信息的存储。该信息可以包括计算机可读指令(或处理器可读指令)、数据结构、程序模块或其他数据。计算机可读介质(或处理器可读介质)的示例包括但不限于相变存储器(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其它类型的随机存取存储器(RAM)、只读存储器(ROM)、电子可擦除可编程只读存储器(EEPROM)、快速闪存或其他内部存储技术、光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储器、盒式磁带、磁盘存储器或其他磁存储设备、或可用于存储可由计算设备访问的信息的任何其他非传输介质。如本文所定义,计算机可读介质(或处理器可读介质)不包括诸如调制数据信号和载波之类的任何临时介质。
在实施方式中,存储器208和一个或多个存储设备212可以包括但不限于具有不同存储和/或处理性能的不同类型的存储器或存储设备,例如,具有不同响应延迟的存储器或存储设备、与存储***102的处理器和/或键值引擎210具有不同程度的接近度的存储设备、具有不同数据访问(即,数据读取和/或写入)速度的存储器或存储设备、具有不同程序擦除周期和/或读取干扰阈值的存储器或存储设备等。在实施方式中,与一个或多个存储设备212相比,存储器208可以具有更好的性能(例如,更低的响应延迟、更高的数据访问速度等)和/或更接近存储***102的处理器和/或键值引擎210。
作为示例而非限制,存储器208可以实现为具有并提供存储能力的各种不同类型的存储器设备中的任一种,并且可以包括但不限于主存储等。在实施方式中,主存储可以包括但不限于高速缓存、主存储器(例如,随机存取存储器(RAM),例如动态随机存取存储器(DRAM)等)、DCPMM(即,数据中心持久存储器模块,例如OptaneTM持久存储器)、NVMe(即,非易失性存储器快车)等。
此外,一个或多个存储设备212(或一个或多个存储设备106)可以实现为具有和提供存储能力的各种不同类型的存储设备中的任一种,并且可以包括但不限于二级存储和三级存储等。在实施方式中,二级存储可以包括但不限于闪存或固态设备(SSD)、混合硬盘驱动器(HHD)、硬盘驱动器(HDD)等。闪存或固态设备可以包括例如SLC(即单级单元)闪存、MLC(即多级单元)闪存(例如TLC(即三级单元)闪存、QLC(即,四级单元)闪存、PLC(即,五级单元)闪存)等。在实施方式中,三级存储可以包括但不限于外部存储器或可移动存储介质,例如外部闪存驱动器或SSD、外部HHD、外部HDD等。
在实施方式中,一个或多个数据通信信道214可以包括至少一个或多个数据通信线路或信道,这些线路或信道使得存储***102的不同组件(例如,一个或多个处理器202、存储器208、键值引擎210、一个或多个存储设备212等)通过无线和/或有线连接而彼此传输数据和指令。有线连接的示例可包括电载波连接(例如,通信电缆、计算机或诸如串行总线、PCIe总线或通道等的通信总线)、光载波连接(例如,光纤连接等)。无线连接可以包括例如WiFi连接、其他射频连接(例如等)等。
尽管在此示例中,仅描述了存储***102中的硬件组件,但在其他实例中,存储***102还可以包括其他硬件组件和/或其他软件组件,例如,用于执行存储在存储器208中的指令以执行各种操作的程序单元216,以及存储应用数据和由存储***102的不同组件处理的任务的数据的程序数据218。在此示例中,一个或多个存储设备212被描述为包括在存储***102中。在其它实例中,一个或多个存储设备212可与存储***102相关联。例如,一个或多个存储设备212可以是***的,并且可以被存储***102的一个或多个组件(例如,键值引擎210)访问。作为示例而非限制,键值引擎210可以通过一个或多个数据通信信道214与一个或多个存储设备212传输数据。
示例索引和映射数据结构
在实施方式中,存储***102或键值引擎104可以采用有序索引***,该***被配置为提供并促进***、检索和扫描操作。在实施方式中,存储***102或键值引擎104可以至少部分地基于索引数据结构(例如,键值数据结构)来构造索引***。作为示例而非限制,键值数据结构可以包括树或分层数据结构,其可以包括但不限于B树、B+树、Bw树等。在实施方式中,键值数据结构可以包括概率数据结构,例如跳过列表。在实施方式中,为了提高存储***102的性能,存储***102或键值引擎104可以进一步采用映射数据结构,其可以将键值数据结构中存储或引用的逻辑存储地址映射到存储设备(例如,存储设备212)中的物理存储地址,并且将由于用户交易或请求而由键值数据结构引起的随机写入转换为序列模式。
图3示出了键值数据结构302和映射数据结构304之间的示例关系。在此示例中,键值数据结构302被描述为包括具有多个级别的树数据结构(例如,B+树),并且包括根节点306、多个内部节点308-1、…、308-M和多个叶节点310-1、…、310-N,其中M和N是大于零的整数。在实施方式中,叶节点310-i可以存储或包括对应的键集或范围(即,键范围ei)并具有逻辑地址pi,其中1≤i≤N。在此示例中被示为表的映射数据结构304可以包括映射项,所述映射项定义键值数据结构302的节点的逻辑地址(即,例如p1,…,pN)与数据的物理地址(即,例如d1,…,dN)之间的关系,所述数据的物理地址由对应的键在逻辑上标识并物理地存储在存储设备(例如,存储设备212)中。在实施方式中,存储***102或键值引擎104可以基于键值数据结构302和映射数据结构304根据用户请求定位数据并执行数据读取和写入。
在实施方式中,当执行分区拆分或合并操作时,存储***102(或者更具体地,键值引擎104)可以在多个阶段中执行这样的分区拆分或合并操作。在实施方式中,多个阶段可以包括但不限于准备阶段和构造阶段等。
在实施方式中,根据操作是分区拆分还是合并操作(即,对于分区拆分操作,从一个父索引数据结构生成多个子索引数据结构,或者对于分区合并操作,从多个父索引数据结构生成一个子索引数据结构),在准备阶段期间,键值引擎104可以首先将一个或多个父索引数据结构的数据文件(例如,封存数据文件)硬链接到一个或多个子索引数据结构,同时继续使用一个或多个父索引数据结构处理用户请求。
在实施方式中,在构造阶段期间,键值引擎104可以使一个或多个父索引数据结构离线并且不可用于处理用户请求,硬链接一个或多个父索引数据结构的任何剩余数据文件(例如,除在准备阶段期间硬链接的封存文件之外的活动生成或写入的数据文件),构建一个或多个子索引数据结构,以及更新与一个或多个父索引数据结构相关联的原始映射数据结构,以完成分区拆分或合并操作。由于一个或多个父索引数据结构的数据文件是硬链接的,而不是从一个位置复制到另一个位置,因此数据迁移被最小化,同时节省诸如处理资源和时间之类的计算成本。
示例方法
图4示出了描述示例性分区合并场景的示意图。图5示出了描绘示例性分区拆分场景的示意图。图6示出了描绘示例性分区合并方法的示意图。图7示出了描绘示例性分区拆分方法的示意图。图6和图7的方法可以、然而并非必须在图1的环境中并且使用图2的***、图3的关系以及图4和图5的示例场景来实现。为了便于解释,参考图1至图5描述方法600和700。然而,方法600和700可替代地在其它环境和/或使用其它***来实现。
在计算机可执行指令的一般情况下描述方法600和700。通常,计算机可执行指令可以包括执行特定功能或实现特定抽象数据类型的例程、程序、对象、组件、数据结构、过程、模块、函数等。此外,示例性方法中的每一个被图示为逻辑流程图中的块集合,逻辑流程图表示可在硬件、软件、固件或其合并中实现的操作序列。描述方法的顺序不意欲被解释为限制,并且任何数量的所描述的方法框可以以任何顺序合并以实现该方法或替代方法。另外,在不脱离本文描述的主题的精神和范围的情况下,可以从该方法中省略各个框。在软件情况下,这些框表示在由一个或多个处理器执行时执行所述操作的计算机指令。在硬件情况下,部分或全部块可以表示执行所述操作的专用集成电路(ASIC)或其他物理组件。
回到图6,在框602,键值引擎104可以接收或检测触发事件以执行分区合并操作。
在实施方式中,存储***102(或者,尤其是下文中存储***102的键值引擎104)可以接收或检测触发事件以执行分区合并操作。在实施方式中,触发事件可包括例如从用户接收指令以将相邻索引数据结构(或称为相邻父索引分区)合并成单个索引数据结构(或称为子索引分区)。在实施方式中,如果索引数据结构的至少一个节点的键范围与另一索引数据结构的至少一个节点的键范围相邻或接近,则两个索引数据结构被描述为相邻。
附加地或可选地,键值引擎104可以出于负载平衡的目的执行分区合并操作。例如,键值引擎104可以接收相关用户请求以处理其逻辑键分别位于相邻索引数据结构中的数据。如果键值引擎104在预定时间段内持续地或以大于预定数量阈值的量接收到这些相关用户请求,则键值引擎104可以将其识别为执行分区合并操作的触发事件,并尝试将这些单独的索引数据结构合并或合并在一起,以降低访问和搜索索引数据结构的成本。
附加地或可选地,键值引擎104可以检测到在预定时间段内对相邻索引数据结构的访问请求的总数小于或等于预定访问阈值。响应于这一触发事件,键值引擎104可以执行分区合并操作来合并这些相邻的索引数据结构,以降低存储器(例如,存储器208)中两个单独的索引数据结构的存储成本,并增加从索引数据结构的合并获得的索引数据结构的访问率。
在框604,键值引擎104可以将多个索引数据结构的数据文件硬链接到索引数据结构的目录中。
在实施方式中,在接收到或检测到执行分区合并操作的触发事件之后,键值引擎104可以进入分区合并操作的准备阶段。在实施方式中,键值引擎104可以硬链接想要合并到索引数据结构的目录中的多个索引数据结构的数据文件。在实施方式中,键值引擎104可以通过向多个索引数据结构的数据文件分配附加文件名来硬链接多个索引数据结构的数据文件,这些附加文件名独立地连接到多个索引数据结构的数据文件的各个数据段。在实施方式中,键值引擎104可以将数据文件的这些附加文件名添加到索引数据结构的目录中。在实施方式中,多个索引数据结构的数据文件可以包括例如多个索引数据结构的封存文件(例如,诸如存储设备212等的存储设备中的封存元数据文件和封存数据文件)。在实施方式中,封存文件可包括不接受新数据且不可修改的文件。
在实施方式中,键值引擎104可以进一步设置写请求阈值,以限制响应于接收到触发事件而要处理的写请求的数量。在实施方式中,为了减少在分区合并操作的后续构造阶段期间存储***102或键值引擎104使用多个索引数据结构处理用户请求的不可用时间量,键值引擎104可以在接收到或检测到触发事件之后,进一步限制要处理的写请求的数量,以将要生成和/或写入的文件的数量减少到可控或可接受的数量(即,写请求阈值)。在实施方式中,可以基于多个因素来确定此写请求阈值,这些因素可以包括但不限于处理用户请求的可允许或可容忍的不可用时间量、要合并的多个索引数据结构的大小、键值引擎104在构造阶段中完成多个索引数据结构的合并或合并的处理能力等。在实施方式中,还可以由存储***102的用户(例如,管理员)设置写请求阈值。
在实施方式中,在成功地将多个索引数据结构的数据文件硬链接到索引数据结构的目录之后,键值引擎104可以进入分区合并操作的构造阶段。在实施方式中,键值引擎104可以使多个索引数据结构不可用于服务提供,例如,处理用户请求。此外,键值引擎104可以硬链接先前在准备阶段期间没有硬链接的任何剩余文件。例如,键值引擎104可以将多个索引数据结构中的一个或多个活动数据文件硬链接到索引数据结构的目录中。在实施方式中,一个或多个活动数据文件可以包括不同于先前在准备阶段硬链接的封存文件的文件,并且可以包括在接收到或检测到触发事件之后并且在使多个索引数据结构不可用于服务提供之前(例如,处理用户请求)写入和/或创建的文件。在实施方式中,由于键值引擎104先前设置了写请求阈值以限制准备阶段期间要处理的写请求的数量,因此可以根据写请求阈值显著缩短处理(例如,硬链接)这些剩余文件的时间。
在框606,键值引擎104可以迭代地合并多个索引数据结构的相邻节点,以自下而上的方式形成索引数据结构。
在实施方式中,在硬链接多个索引数据结构的数据文件(例如,封存和活动的文件)之后,键值引擎104可以开始合并多个索引数据结构。在实施方式中,键值引擎104可以以自下而上的方式迭代地合并多个索引数据结构的相邻节点,以形成索引数据结构。在实施方式中,键值引擎104可以将与多个索引数据结构的相邻节点相关联的键值对写入索引数据结构中的对应合并节点中;向合并节点的更高级别报告键值对中的键的新键范围;以及重复所述写入和报告,直到到达所述索引数据结构的根节点为止。
如图4所示的场景用作说明的示例。图4示出了要合并两个索引数据结构402和404(在此示例中被示为树结构)的示例场景。显然,其他索引数据结构,例如其他类型的分层数据结构或概率数据结构也可适用。在此示例中,索引数据结构402可以与键范围A1-A2相关联,并且包括多个节点,例如N0、N1和N2。索引数据结构404可以与键范围A3-A4相关联,并且包括多个节点,例如N3和N4。在此示例中,索引数据结构402和索引数据结构404是彼此相邻或邻近的索引数据结构。在实施方式中,如果由两个索引数据结构表示的各个键范围或集合是连续的或彼此相邻的,或者是以小于预定分离阈值的量分离的,则这两个索引数据结构被称为彼此相邻或邻近的索引数据结构。预定分离阈值可以由存储***102的用户(例如,管理员)预定义。
在实施方式中,当索引数据结构被合并或合并时,键值引擎104可以以自下而上的方式(即,从下到上)合并或合并索引数据结构的相邻节点(或称为相邻边界节点)。在实施方式中,索引数据结构的相邻节点(或称为相邻边界节点)可以包括其所表示的键范围或集合彼此相邻或连续的节点,或者以预定的接近度阈值定位的节点。使用如图4所示的示例,键值引擎104可以首先尝试在索引数据结构402和404的各自最低级别处合并两个相邻边界节点(即,N2和N4),并且将这两个相邻边界节点的键值对写入或复制到用于合并索引数据结构406的新节点N5(或称为合并节点)中。在实施方式中,根据索引数据结构402、404和406的类型,键值引擎104可以向索引数据结构406的更高级别的父节点(例如,图4的这个示例中的节点Nc2)报告新的键范围或键集合和/或由新节点Nc1表示的最大键值。
在实施方式中,键值引擎104可以在下一级对另一对相邻边界节点(例如,如图4所示的示例中的N1和N3)重复上述操作,直到到达索引数据结构(例如,图4的示例中的索引数据结构406)的根节点。键值引擎104然后可以通过写入覆盖其子节点的键范围或集合的新键范围或集合的信息来更新索引数据结构的根节点,索引数据结构(即,根节点和子节点)包括最初包括在索引数据结构的新键范围或集合中的多个索引数据结构(例如,索引数据结构402和404)中的所有键值对。
在框608,键值引擎104可以构造用于索引数据结构的映射数据结构。
在实施方式中,在将多个索引数据结构合并或合并到索引数据结构中之后,键值引擎104可以为该索引数据结构构建新的映射数据结构。在实施方式中,键值引擎104可以从与多个索引数据结构相关联的原始映射数据结构删除多个索引数据结构的相邻节点的映射项,并将索引数据结构的合并节点的新映射项添加到原始映射数据结构中,以为索引数据结构构造新的映射数据结构。例如,图4示出从索引数据结构402和404的原始映射数据结构408删除的相邻边界节点N2和N4的对应映射项,并且用于新的或合并的节点Nc1和Nc2的映射项被添加到原始映射数据结构中,以形成用于索引数据结构406的新映射数据结构410。
回到图7,在框702,键值引擎104可以接收或检测触发事件以执行分区拆分操作。
在实施方式中,存储***102的键值引擎104可以接收或检测触发事件以执行分区拆分操作。例如,键值引擎104可以通过接收用于拆分索引数据结构(或称为父索引分区)以形成多个索引数据结构(或称为多个子索引分区)的指令来接收或检测触发事件,并且该指令可以包括键值。
附加地或可选地,键值引擎104可以出于负载平衡的目的执行分区拆分操作。例如,键值引擎104可能接收到大量用户请求来处理其逻辑键位于同一索引数据结构中的数据。如果键值引擎104在预定时间段内以大于预定频率阈值的频率(rate)接收到这些用户请求,则键值引擎104可以将这识别为检测到执行分区拆分操作的触发事件,并且尝试将该索引数据结构拆分成多个单独的索引数据结构,以使得能够通过键值引擎104的多个线程或处理使用这些单独的索引数据结构进行负载平衡来并行处理用户请求。在实施方式中,键值引擎104可以确定用于将索引数据结构拆分为多个单独的索引数据结构的键值。例如,键值引擎104可以至少部分地基于负载平衡来确定这样的键值。作为示例而非限制,键值引擎104可以确定键值,使得在过去的预定时间段内访问(例如,写或读)其逻辑键被单独的索引数据结构覆盖的数据的过去用户请求的相应数量或频率大致相同或不同于预定阈值内的量。
在框704,键值引擎104可以将索引数据结构的数据文件硬链接到多个索引数据结构的相应目录中。
在实施方式中,在接收到或检测到执行分区合并操作的触发事件后,键值引擎104可以进入准备阶段。在实施方式中,键值引擎104可以将索引数据结构的数据文件硬链接到多个索引数据结构的相应目录中。在实施方式中,索引数据结构的数据文件可以包括索引数据结构的封存文件,其中,封存文件包括不接受新数据且不可修改的文件。
在实施方式中,在键值引擎104在准备阶段将索引数据结构的数据文件(例如,封存元数据文件和封存数据文件)硬链接到多个索引数据结构的相应目录后,键值引擎104于是可以使索引数据结构在进入构造阶段之前(例如,在迭代拆分索引数据结构的节点之前)使索引数据结构不可用于提供服务,例如处理用户请求。在实施方式中,键值引擎104可以进一步将索引数据结构的一个或多个活动数据文件硬链接到多个索引数据结构的相应目录中。所述一个或多个活动数据文件可以不同于封存文件,并且可以包括在使多个索引数据结构不可用于提供服务之前写入和/或创建的文件。
在框706,键值引擎104可以以自下而上的方式迭代地拆分索引数据结构的多个节点以形成多个索引数据结构,与所述多个节点相关联的键范围包括键值。
在实施方式中,在键值引擎104将索引数据结构的数据文件(例如,封存文件和活动文件)硬链接到多个索引数据结构的相应目录之后,键引擎104可以以自下而上的方式迭代地拆分索引数据结构的节点以形成多个索引数据结构。在实施方式中,键值引擎104可以根据键值将索引数据结构的多个节点中一个节点的键值对拆分为多个索引数据结构的相应拆分节点,并且根据索引数据结构的类型,将拆分节点的键的各键范围和/或最大键值报告到多个索引数据结构的各更高级别的拆分节点。在实施方式中,键值引擎104可以对索引数据结构的更高级别的下一节点重复上述操作,直到将索引数据结构的根节点重写为止。
如图5所示的场景被用作说明的示例。图5示出了示例场景,其中,在本示例中被示为树结构的索引数据结构502要被拆分。显然,其他索引数据结构,例如其他类型的分层数据结构或概率数据结构也可以适用。在本示例中,描述了将索引数据结构502沿着键值A1拆分或分区。在实施方式中,可以通过对索引数据结构(例如,如图5所示的索引数据结构502)的拆分或分区而独立地获得或形成多个索引数据结构。在本示例中,多个索引数据结构中的一个可以保持或获得索引数据结构502的左部分,多个索引数据结构中的另一个可以保留或获得索引数据结构502的右部分。
在实施方式中,对于多个索引数据结构的每个索引数据结构,键值引擎104可以使用自下而上的方式(即,以从下到上的自下而上的方式)启动重放过程(replay process)。例如,键值引擎104可以定位或确定键值(例如图5中的键A1)位于或存在的边界节点(例如图5中所示的边界节点N3)。在实施方式中,键值引擎104可以针对多个索引数据结构中的每个索引数据结构,迭代地过滤出不在相应的键范围内的键,并且将属于多个索引数据结构中的相应索引数据结构的键写入相应索引数据结构的新节点中。在实施方式中,键值引擎104可以进一步向上级报告每个索引数据结构的相应键范围或最大键值。然后,键值引擎104可以对每级刚处理过的边界节点(例如,图5中的边界节点N3)的父节点(例如,图5中的节点N2)重复地或迭代地执行上述操作,直到被拆分的索引数据结构的根节点被重写为止。在实施方式中,键值引擎104可以在为多个索引数据结构中的每个索引数据结构获得新的根节点之后,完成索引数据结构的这种拆分或分区以获得多个索引数据结构,相应的键被分配到相应的键范围内。在实施方式中,键值引擎104可能只需要更新多个索引数据结构之间的边界节点,因为在构造阶段仅处理这些边界节点。例如,如图5所示,仅更新索引数据结构之间的边界节点(即,节点N5、N3和N1)。
在框708,键值引擎104可以为多个索引数据结构构造映射数据结构。
在实施方式中,在将索引数据结构拆分为多个索引数据结构之后,键值引擎104可以为多个索引数据结构构建新的映射数据结构。在实施方式中,类似于分区合并操作,键值引擎104可以从与索引数据结构相关联的原始映射数据结构删除索引数据结构的节点的映射项,并且将用于所述多个索引数据结构的拆分节点的新映射项添加到原始映射数据结构中,以构造用于所述多个索引数据结构的新映射数据结构。另外,在实施方式中,由于多个索引数据结构中的每个索引数据结构不处理其数据,因此可以通过后台处理以受控的速度移除超出其范围的所有映射项,而不干扰正常操作。
本文所描述的任何方法的任何动作可至少部分地由处理器或其他电子设备基于存储在一个或多个计算机可读介质上的指令来实现。作为示例而非限制,本文所描述的任何方法的任何动作可在配置有可存储在一个或多个计算机可读介质上的可执行指令的一个或多个处理器的控制下实现。
结论
尽管已经用特定于结构特征和/或方法行为的语言描述了实施方式,但是应当理解,权利要求不一定局限于所描述的特定特征或行为。相反,特定特征和行为被公开为实现所要求保护的主题的示例性形式。附加地或可替换地,部分或全部操作可由一个或多个ASIC、FPGA或其它硬件实现。
使用以下条目可以进一步理解本发明。
条目1:一种由一个或多个处理器实现的方法,所述方法包括:接收将多个索引数据结构合并以形成一个索引数据结构的触发事件;将所述多个索引数据结构的数据文件硬链接到所述索引数据结构的目录中;以自下而上的方式迭代地合并所述多个索引数据结构的相邻节点以形成所述索引数据结构;以及构造所述索引数据结构的映射数据结构。
条目2:根据条目1所述的方法,其中,将所述多个索引数据结构的数据文件硬链接到所述索引数据结构的目录中,包括将所述多个索引数据结构的封存文件硬链接到所述索引数据结构的目录中,所述封存文件不接受新数据并且是不可修改的。
条目3:根据条目2所述的方法,其中,在对所述多个索引数据结构的相邻节点进行迭代合并之前,所述方法还包括:使所述多个索引数据结构不可用于提供服务;以及将所述多个索引数据结构的一个或多个活动数据文件硬链接到所述索引数据结构的目录中。
条目4:根据条目3所述的方法,其中,所述一个或多个活动数据文件不同于所述封存文件,并且包括在使所述多个索引数据结构不可用于提供服务之前被写入和/或创建的文件。
条目5:根据条目1所述的方法,其中,接收所述触发事件包括:接收来自用户的将所述多个索引数据结构合并成所述索引数据结构的指令;或者检测到对所述多个索引数据结构的访问请求的总数小于或等于预定访问阈值。
条目6:根据条目1所述的方法,还包括设置阈值以限制响应于接收到所述触发事件而要处理的写请求的数量。
条目7:根据条目1所述的方法,其中,以自下而上的方式迭代合并所述多个索引数据结构的相邻节点以形成所述索引数据结构,包括:将与所述多个索引数据结构的相邻节点相关联的键值对写入所述索引数据结构中的对应合并节点中;向所述合并节点的更高级别报告所述键值对中的键的新键范围;以及重复所述写入和报告,直到到达所述索引数据结构的根节点为止。
条目8:根据条目1所述的方法,其中,构造所述索引数据结构的映射数据结构包括:从与所述多个索引数据结构相关联的原始映射数据结构删除所述多个索引数据结构的相邻节点的映射项,以及将所述索引数据结构的合并节点的新映射项添加到所述原始映射数据结构中,以构造所述索引数据结构的映射数据结构。
条目9:一个或多个处理器可读介质,存储在由一个或多个处理器执行时,促使所述一个或多个处理器执行动作的可执行指令,所述动作包括:接收将多个索引数据结构合并以形成一个索引数据结构的触发事件;将所述多个索引数据结构的数据文件硬链接到所述索引数据结构的目录中;以自下而上的方式迭代地合并所述多个索引数据结构的相邻节点以形成所述索引数据结构;以及构造所述索引数据结构的映射数据结构。
条目10:根据条目9所述的一个或多个处理器可读介质,其中,将所述多个索引数据结构的数据文件硬链接到所述索引数据结构的目录中,包括将所述多个索引数据结构的封存文件硬链接到所述索引数据结构的目录中,所述封存文件不接受新数据并且是不可修改的。
条目11:根据条目10所述的一个或多个处理器可读介质,其中,在对所述多个索引数据结构的相邻节点进行迭代合并之前,所述动作还包括:使所述多个索引数据结构不可用于提供服务;以及将所述多个索引数据结构的一个或多个活动数据文件硬链接到所述索引数据结构的目录中,所述一个或多个活动数据文件不同于所述封存文件,并且包括在使所述多个索引数据结构不可用于提供服务之前被写入和/或创建的文件。
条目12:根据条目9所述的一个或多个处理器可读介质,其中,接收所述触发事件包括:接收来自用户的将所述多个索引数据结构合并成所述索引数据结构的指令;或者检测到对所述多个索引数据结构的访问请求的总数小于或等于预定访问阈值。
条目13:根据条目9所述的一个或多个处理器可读介质,所述动作还包括设置阈值以限制响应于接收到所述触发事件而要处理的写请求的数量。
条目14:根据条目9所述的一个或多个处理器可读介质,其中,以自下而上的方式迭代合并所述多个索引数据结构的相邻节点以形成所述索引数据结构,包括:将与所述多个索引数据结构的相邻节点相关联的键值对写入所述索引数据结构中的对应合并节点中;向所述合并节点的更高级别报告所述键值对中的键的新键范围;以及重复所述写入和报告,直到到达所述索引数据结构的根节点为止。
条目15:根据条目9所述的一个或多个处理器可读介质,其中,构造所述索引数据结构的映射数据结构包括:从与所述多个索引数据结构相关联的原始映射数据结构删除所述多个索引数据结构的相邻节点的映射项,以及将所述索引数据结构的合并节点的新映射项添加到所述原始映射数据结构中,以构造所述索引数据结构的映射数据结构。
条目16:一种***,包括:一个或多个处理器;以及存储器,存储在由所述一个或多个处理器执行时,促使所述一个或多个处理器执行动作的可执行指令,所述动作包括:接收拆分一个索引数据结构以形成多个索引数据结构的指令,所述指令包括键值;将所述索引数据结构的数据文件硬链接到所述多个索引数据结构的相应目录中;以自下而上的方式迭代地拆分所述索引数据结构的多个节点,以形成所述多个索引数据结构,键范围与包括所述键值的多个节点相关联;以及构造所述多个索引数据结构的映射数据结构。
条目17:根据条目16所述的***,其中,将所述索引数据结构的数据文件硬链接到所述多个索引数据结构的相应目录中,包括将所述索引数据结构的封存文件硬链接到所述多个索引数据结构的相应目录中,所述封存文件不接受新数据并且是不可修改的。
条目18:根据条目17所述的***,其中,在迭代地拆分所述索引数据结构的节点之前,所述动作还包括:使所述索引数据结构不可用于提供服务;以及将所述索引数据结构的一个或多个活动数据文件硬链接到所述多个索引数据结构的相应目录中,所述一个或多个活动数据文件不同于所述封存文件,并且包括在使所述多个索引数据结构不可用于提供服务之前写入和/或创建的文件。
条目19:根据条目16所述的***,其中,以自下而上的方式迭代地拆分所述索引数据结构的节点以形成所述多个索引数据结构,包括:根据所述键值将所述索引数据结构的多个节点中一个节点的键值对拆分为所述多个索引数据结构的相应拆分节点;将所述拆分节点的键的键范围报告给所述多个索引数据结构的所述拆分节点的相应更高级别;以及重复所述拆分和报告,直到将所述索引数据结构的根节点重写。
条目20:根据条目16所述的***,其中,为所述多个索引数据结构构造所述映射数据结构包括:从与所述索引数据结构相关联的原始映射数据结构删除所述索引数据结构的所述节点的映射项,并将所述多个索引数据结构的拆分节点的新映射项添加到所述原始映射数据结构中,以构造所述多个索引数据结构的所述映射数据结构。