一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

管理流式数据存储系统的索引的方法、设备和程序产品与流程

2022-05-17 22:15:09 来源:中国专利 TAG:


1.本公开的各实现方式涉及存储系统的管理,更具体地,涉及用于管理流式数据存储系统中的索引的方法、设备和计算机程序产品。


背景技术:

2.流式数据是由各种数据源生成的连续且永无止境的数据流。通常而言,流式数据的生成速度快并且数据量大。流式数据的常见示例包括各种应用系统的日志数据、物联网中的各种传感器的测量数据、以及监控系统所采集到的各种实时数据,等等。流式数据可以包括大量信息并且通常以时间序列的方式存储。
3.为了便于数据搜索,目前已经提出了针对流式数据建立索引的技术方案。然而,已有的技术方案扩展性较差。随着时间的流逝,当流式数据的数据量不断增长时,已有的索引技术不能有效地管理越来越多的流式数据,这将造成数据访问性能下降并且进一步降低后期数据分析的效率。此时,如何以更为方便并且有效的方式管理流式数据存储系统中的索引,成为一个研究热点。


技术实现要素:

4.因而,期望能够开发并实现一种以更为有效的方式来管理流式数据存储系统的索引的技术方案。期望该技术方案能够与现有的存储系统相兼容,并且通过改造现有存储系统的各种配置,来以更为有效的方式管理存储系统的索引。
5.根据本公开的第一方面,提供了一种用于管理流式数据的存储系统的索引的方法。该索引的活跃层包括第一组分片,以及第一组分片中的分片用于存储存储系统中的一部分数据对象的索引。在该方法中,响应于确定第一组分片的状态满足预定扩展条件,在索引中创建第二组分片,第二组分片中的分片用于存储将要进入存储系统的数据对象的索引。将第二组分片所在的层标记为活跃层。将第二组分片所在的层以外的其他层标记为冻结层。基于索引中的活跃层和冻结层中的分片来管理存储系统。
6.根据本公开的第二方面,提供了一种电子设备,包括:至少一个处理器;易失性存储器;以及与至少一个处理器耦合的存储器,存储器具有存储于其中的指令,该指令在被至少一个处理器执行时使得设备执行根据本公开的第一方面的方法。
7.根据本公开的第三方面,提供了一种计算机程序产品,计算机程序产品被有形地存储在非瞬态计算机可读介质上并且包括机器可执行指令,机器可执行指令用于执行根据本公开的第一方面的方法。
附图说明
8.结合附图并参考以下详细说明,本公开各实现方式的特征、优点及其他方面将变得更加明显,在此以示例性而非限制性的方式示出了本公开的若干实现方式。在附图中:
9.图1示意性示出了其中可以实现本公开的方法的存储系统的工作过程的示意图;
10.图2示意性示出了根据一个技术方案的存储系统的索引的框图;
11.图3示意性示出了根据本公开的一个实现方式的用于管理存储系统的索引的方法的流程图;
12.图4示意性示出了根据本公开的一个实现方式的用于管理存储系统的索引的框图;
13.图5示意性示出了根据本公开的一个实现方式的扩展后的索引的框图;
14.图6示意性示出了根据本公开的一个实现方式的扩展后的索引的框图;
15.图7示意性示出了根据本公开的一个实现方式的执行层内合并后的索引的框图;
16.图8示意性示出了根据本公开的一个实现方式的执行层间合并后的索引的框图;以及
17.图9示意性示出了根据本公开的示例性实现的用于管理存储系统的索引的设备的框图。
具体实施方式
18.下面将参照附图更详细地描述本公开的优选实现。虽然附图中显示了本公开的优选实现,然而应该理解,可以以各种形式实现本公开而不应被这里阐述的实现所限制。相反,提供这些实现是为了使本公开更加透彻和完整,并且能够将本公开的范围完整地传达给本领域的技术人员。
19.在本文中使用的术语“包括”及其变形表示开放性包括,即“包括但不限于”。除非特别申明,术语“或”表示“和/或”。术语“基于”表示“至少部分地基于”。术语“一个示例实现”和“一个实现”表示“至少一个示例实现”。术语“另一实现”表示“至少一个另外的实现”。术语“第一”、“第二”等等可以指代不同的或相同的对象。下文还可能包括其他明确的和隐含的定义。
20.目前已经开发出了多种流式数据存储系统。为方便描述起见,在本公开的上下文中将仅以用于存储应用系统的日志数据的流式数据存储系统作为示例进行描述。在应用系统中可以不断地生成日志数据,例如,可以在每分钟(或者其他时间间隔)生成日志数据。此时,生成的日志数据将以时间序列的方式存储至存储系统中。为了便于后期搜索和处理日志数据,可以为存储的数据建立索引。
21.目前已经提出了基于全文搜索的索引(例如,lucene索引等),并且该全文索引已经被广泛应用于各种应用系统。全文索引可以动态地管理被存储至存储系统的数据对象(例如,日志数据),并且可以提供数据对象中的词语到数据对象的逆向索引。在数据分析过程中,逆向索引有助于对于搜索结果进行评分,如果更多的搜索词被映射到同一数据对象,则认为该数据对象与搜索词更相关并且可以具有更高评分。
22.已有的全文索引能够容纳的数据对象的数量存在限制。当面临无穷无尽的流式数据时,需要首先将进入存储系统的流式数据进行分区。目前已经提出了弹性搜索技术方案,并且可以按照数据对象的关键字的范围或哈希值进行分区,然后每个新到达的数据对象可以被存储至相应的分区。此时,在分区中可以存储每个数据对象的索引。在本公开的上下文中,可以将全部索引的集合称为存储系统的索引,并且将分区称为“分片(shard)”。
23.在下文中,参见图1描述基于分片的索引的概要。图1示意性示出了其中可以实现
本公开的方法的存储系统的工作过程100的框图。如图1所示,存储系统110包括索引120,在此的索引120可以包括多个分片。假设预定的哈希函数可以将数据对象的关键字映射至0-255范围,可以将上述范围划分为多个分片(例如,3个):第一分片可以包括0-84的哈希值,第二分片可以包括85-169的哈希值,第三分片可以包括170-255的哈希值。当数据对象130进入存储系统110时,可以获取该数据对象130的哈希值132。假设数据对象130的哈希值132为“20”,则可以将该数据对象130划分至分片122,并且可以将数据对象130的索引存储至分片122中。在此,数据对象130的索引可以指向存储系统110中的存储数据对象130的存储空间。
24.然而,最初创建索引时分片的数量是固定的。此外,由于逆向索引将词语存储到数据对象的映射中,无法直接将数据对象分开。常用的方案是删除属于现有分片的数据对象的一部分,然后将其插入新创建的分片中。该方案类似于针对数据对象重新编制索引,需要占用大量的时间和计算资源开销。
25.另一方面,固定的分片数量具有有限的数据处理能力,并且无法应对随着时间不断变化的流式数据的数据量。如果流式数据的进入速度超过分片的处理能力的限制,则会造成生成索引的速度低于进入存储系统的流式数据的速度,进而造成数据积压。然而,如果在初始阶段设置了太多的分片数量,则会导致需要在全部分片中执行查询,进而造成查询效率低下。此时,期望可以以更为方便并且有效的方式管理流式数据存储系统的索引。
26.根据本公开的示例性实现方式,提出了一种动态地管理存储系统的索引的技术方案。具体地,可以为索引设置初始分片数量,并且按照初始分片数量来处理进入存储系统的流式数据。可以不断地监视针对存储系统执行的各种类型的请求,并且按照索引中的分片的负载来动态地调整存储系统中的分片的数量。利用本公开的示例性实现方式,可以以适合的速度处理流式数据。以此方式,可以处理不断进入存储系统的流式数据。
27.根据本公开的示例性实现方式,索引可以包括一个或多个层并且每个层中可以包括一组分片。具体地,最初索引可以仅包括具有固定分片数量的活跃层。当该层中的分片负载过高时,可以重新创建新的活跃层,并且将原有的活跃层设置为冻结层。图2示意性示出了根据一个技术方案的存储系统的索引200的框图。如图2所示,假设最初的层220中的分片负载过高,可以生成具有更多分片数量的层230。此时,可以将层220设置为冻结层,而将层230设置为活跃层。
28.在下文中,将参见图3描述有关管理索引的更多细节。图3示意性示出了根据本公开的一个实现方式的用于管理存储系统的索引的方法300的流程图。根据本公开的示例性实现方式,在初始阶段索引的活跃层包括第一组分片,并且第一组分片中的分片用于存储存储系统中的一部分数据对象的索引。在此的第一组分片具有预定的固定数量(例如,3个)。此时,每个分片中存储有多个数据对象的索引,并且该多个数据对象的关键字的哈希值属于该分片的哈希值范围。
29.在本公开的上下文中,数据对象的索引可以表示指向该数据对象在存储系统中的具体地址的指针。存储系统的索引可以表示该存储系统中的全部数据对象的索引的整体集合。例如,数据对象的索引可以包括:活跃层中的各个分片中的数据对象的索引,以及一个或多个冻结层中的各个分片中的数据对象的索引。
30.在下文中,将参见图4描述有关最初的第一组分片的更多细节。图4示意性示出了
根据本公开的一个实现方式的用于管理存储系统的索引400的框图。图4中的索引400可以是最初创建的具有固定分片数量的索引。在图4中,索引400可以基于哈希环来实现,并且包括3个分片,其中分片410用于存储哈希值为0-84的数据对象的索引,分片420用于存储哈希值为85-169的数据对象的索引,分片430用于存储哈希值为170-255的数据对象的索引。
31.根据本公开的示例性实现方式,数据对象的索引可以包括正向索引(即,关键字到数据对象中的词语的映射)和逆向索引(即,数据对象中的词语到数据对象的映射)。利用本公开的示例性实现方式,可以建立基于全文搜索的索引,进而便于针对存储系统中的数据对象的后期处理和分析。
32.将会理解,图4仅仅示意性示出了哈希值的范围为0-255并且在活跃层中包括3个分片的情况。根据本公开的示例性实现方式,哈希值可以具有不同的范围,并且活跃层可以包括其他数量的分片。例如,哈希值的范围可以是0-63,并且活跃层可以包括4个分片。此时各个分片所涉及的哈希值的范围分别为:0-15、16-31、32-47以及48-63。
33.在存储系统的工作期间,可以周期性地采集第一组分片的状态。在框310处,响应于确定第一组分片的状态满足预定扩展条件,在索引中创建第二组分片。在此,第二组分片中的分片用于存储将要进入存储系统的数据对象的索引。根据本公开的示例性实现方式,第二组分片的第二分片数量可以是第一组分片的第一分片数量的整数倍。例如,最初的第一组分片包括3个分片,则创建的第二组分片可以包括6个分片。每个分片具有预定的资源,因而每个分片的工作负载具有上限。通过创建更多的分片,各个分片可以并行地管理和存储进入各个分片的数据对象的索引。
34.根据本公开的示例性实现方式,预定扩展条件可以包括:第一组分片存储的索引的数量高于阈值数量。将会理解,随着更多的数据对象被存储至存储系统,每个分片中所存储的索引的数量将会增加,此时分片的工作负载将会上升并且性能将会有所下降。因而,当活跃层中的各个分片所存储的索引的数量达到预定的阈值数量时,针对存储系统执行的各种请求的延迟将会增加,并且存储系统的性能将会下降。进一步,由于向分片分配的资源的处理能力具有上限,如果索引数量继续增加将会导致资源使用达到该上限,进而出现死机等情况。此时,可以执行索引的扩展过程以便生成更多的分片,从而缓解当前活跃层中的各个分片的压力并且防止出现响应过慢甚至死机的情况。
35.根据本公开的示例性实现方式,预定扩展条件可以包括:基于第一组分片来存储进入存储系统的多个数据对象的索引的速度低于多个数据对象进入存储系统的速度。当新数据对象进入存储系统时,分片的计算资源将会为新数据对象创建索引,并且将创建的索引存储至分片中。由于创建和存储索引将会具有一定的时间开销,假设大量数据对象进入存储系统,则此时没有足够的时间来处理进入的每个数据对象。这将会导致分片提供的处理能力难以满足数据对象进入存储系统的速度。因而生成和存储索引的速度成为存储系统的瓶颈,并且导致存储系统的性能下降。此时,可以执行扩展过程以便生成更多的分片,从而提高多个分片的整体处理能力。
36.图5示意性示出了根据本公开的一个实现方式的扩展后的索引500的框图。如图5所示,最初的活跃层中的3个分片410、420和430被扩展至6个分片:即分片512、514、522、524、532和534。具体地,可以将分片410的哈希值范围0-84一分为二,此时分片512的关键字范围可以是0-42,并且分片514的关键字范围可以是43-84。类似地,可以分别确定522、524、
532和534的关键字范围。
37.在框320处,将第二组分片所在的层标记为活跃层(如图5外圈的实线所示)。在框330处,将第二组分片所在的层以外的其他层标记为冻结层(如图5内圈的虚线所示)。将会理解,在存储系统工作期间的任何时刻,索引中仅有一个活跃层。此时,第二组分片可以替换第一组分片,并且成为“活跃”状态。活跃层和冻结层可以具有不同的功能,针对存储系统执行的某些请求仅涉及活跃层,某些请求仅涉及冻结层,而某些请求将会涉及活跃层和冻结层两者。
38.根据本公开的示例性实现方式,可以不断地监视当前活跃层的状态,并且周期性地执行方法300。如果当前的包括6个分片的活跃层的状态满足预定扩展条件,则可以再次创建更多的分片(例如,12个分片)。此时,索引的状态将如图6所示,该图6示意性示出了根据本公开的一个实现方式的扩展后的索引600的框图。如图6所示,最外层的哈希环(以实线示出)示出了包括12个分片的当前活跃层630,中间层的哈希环(以虚线示出)示出了包括6个分片的冻结层620,最内层的哈希环(以虚线示出)示出了包括3个分片的冻结层610。
39.此时,扩展过程成功执行并且可以利用扩展后的索引来管理存储系统。在下文中,返回图3描述有关利用索引中的活跃层和一个或多个冻结层来管理存储系统的更多细节。在框340处,基于索引中的活跃层和冻结层中的分片来管理存储系统。根据本公开的示例性实现方式,存储系统可以接收到多种类型的请求:插入请求、更新请求、更新插入(upsert,update和insert的组合)请求、删除请求、以及搜索请求。在下文中,将分别描述如何基于索引中的活跃层和冻结层中的分片来管理针对存储系统执行的各种类型的请求。
40.根据本公开的示例性实现方式,如果接收到用于向存储系统插入数据对象的插入请求,可以生成数据对象的索引。进一步,可以将数据对象的索引存储至活跃层中的与数据对象相对应的分片。具体地,可以基于将被插入的数据对象的关键字来确定利用哪个分片来存储数据对象的索引。在下文中,返回图5来描述如何执行插入操作。假设将要被插入的数据对象的关键字的哈希值为70,则基于上文描述的各个分片的哈希值范围可知,分片514的哈希值范围是43-84,此时应当将该数据对象的索引存储至分片514。又例如,假设将要被插入的数据对象的关键字的哈希值为30,此时应当将该数据对象的索引存储至分片512(哈希值范围为0-42)。
41.将会理解,上文仅参见图5描述了活跃层包括6个分片的情况。如果索引为图6所示的情况,则此时活跃层包括12个分片。可以基于类似方式来分别确定12个分片的哈希值范围,并且按照该范围来寻找与将要被插入的数据对象的关键字的哈希值相匹配的分片。
42.根据本公开的示例性实现方式,如果接收到用于在存储系统中更新数据对象的更新请求,则可以首先在活跃层中搜索该数据对象,也即可以确定数据对象的索引是否被存储在活跃层。如果确定数据对象的索引被存储在活跃层中的分片,可以直接基于该分片中的索引来找到将要被更新的数据对象在存储系统中的地址。可以从该地址读取数据对象并且基于更新请求来更新读取的数据对象,继而可以将更新的数据对象的索引存储至该分片。由于此时将要被更新的数据对象的索引位于活跃层,因而可以直接在活跃层中处理与更新请求相关的索引操作。
43.在下文中,参见图5来描述将要被更新的索引被存储至活跃层的情况。假设将要被更新的数据对象的关键字的哈希值为70,并且在活跃层中的分片514中找到数据对象的索
引。可以基于该索引来找到数据对象的地址(例如,该索引以指针方式指向存储系统中的存储空间0x00

00-0x0f

ff)。此时,可以基于更新请求来更新该存储空间中的数据,并且将更新的数据对象的索引存储至该分片514。
44.根据本公开的示例性实现方式,如果确定数据对象的索引没有被存储在活跃层,可以向索引中的各个冻结层转发更新请求,并且可以在每个冻结层中执行类似的操作。如果确定将要被更新的数据对象的索引被存储在冻结层中的分片,可以基于该分片中的索引来找到将要被更新的数据对象在存储系统中的地址。可以从该地址读取数据对象并且基于更新请求来更新读取的数据对象。由于此时被更新的数据对象的索引位于冻结层(冻结层中的索引不能被修改),可以为已经被更新的数据对象创建新索引,并且将该新索引存储至活跃层中的分片。具体地,可以基于数据对象的关键字的哈希值,在活跃层中找到哈希值范围与该哈希值相匹配的分片。进一步,可以将新索引存储至找到的分片。利用本公开的示例性实现方式,可以确保在活跃层中存储被更新的数据对象的最新索引。
45.在下文中,参见图5来描述将要被更新的索引被存储至冻结层的情况。假设将要被更新的数据对象的关键字的哈希值为60,并且在冻结层中的分片410中找到数据对象的索引。可以基于该索引来找到数据对象的地址(例如,存储空间0x10

00-0x1f

ff)。此时,可以基于更新请求来更新该存储空间中的数据,并且将更新的数据对象的索引存储活跃层中的分片。在活跃层中,分片514的哈希值范围是43-84并且与哈希值60相匹配。因而,可以将更新后的数据对象的索引存储至活跃层中的分片514。
46.将会理解,由于此时数据对象已经被更新,因而冻结层中的分片中的旧索引不再有效,可以从冻结层中的分片删除数据对象的旧索引。在上文的示例中,可以从冻结层中的分片410中删除旧索引。利用本公开的示例性实现方式,可以确保从索引中移除不再有效的旧索引。之后,当需要针对更新后的数据对象执行操作时,可以从活跃层中的分片中找到相应的最新索引。
47.在存储系统中,可以执行针对数据对象的更新插入请求。在此更新插入请求表示:如果存储系统中不存在指定数据对象,则向存储系统中插入该数据对象;如果存储系统存在该数据对象,则更新存储系统中的该数据对象。如果接收到用于在存储系统中更新插入数据对象的更新插入请求,可以确定数据对象的索引是否被存储在活跃层。如果确定数据对象的索引被存储在活跃层中的分片,则更新数据对象并且将更新的数据对象的索引存储至分片。在此,由于在活跃层中已经存在该数据对象的索引,这表示该数据对象已经被存储在存储系统中。因而,在此的更新插入请求执行更新动作,并且执行过程类似于上文描述的将要被更新的数据对象的索引位于活跃层中的情况,因而不再赘述。
48.根据本公开的示例性实现方式,如果确定数据对象的索引没有被存储在活跃层,向各个冻结层转发更新插入请求。此时,可以在各个冻结层中查找是否存在数据对象的索引。如果确定数据对象的索引没有被存储在任何一个冻结层,这表示该数据对象没有被存储在存储系统中。因而,在此的更新插入请求执行插入动作,可以将数据对象的索引存储至活跃层中的分片。在此执行过程类似于上文描述执行插入请求的情况,因而不再赘述。
49.根据本公开的示例性实现方式,如果确定数据对象的索引被存储在冻结层中的分片,这表示该数据对象已经被存储在存储系统中。因而,在此的更新插入请求执行更新动作。具体地,可以基于更新插入请求来更新数据对象,并且将更新的数据对象的索引存储至
活跃层中的分片。在此,执行过程类似于上文描述的将要被更新的数据对象的索引位于冻结层中的情况,因而不再赘述。根据本公开的示例性实现方式,由于此时的数据对象已经被更新,因而冻结层中的旧索引不再有效,可以从冻结层中的分片删除数据对象的旧索引。
50.将会理解,索引中的活跃层和一个或多个冻结层中的多个分片存储存储系统中的全部数据对象的索引,因而当执行搜索请求时,需要分别在活跃层和一个或多个冻结层中进行搜索。根据本公开的示例性实现方式,如果接收到用于在存储系统中搜索数据对象的搜索请求,可以分别向活跃层和冻结层转发搜索请求。可以分别在每个层中执行搜索请求,并且提供来自活跃层以及冻结层的搜索结果。
51.例如,假设在此的索引是逆向索引,并且期望在日志存储系统中执行全文搜索以便找到包括关键字“故障”的日志。此时,可以向索引中的活跃层和全部冻结层转发搜索请求。继而,可以在活跃层和全部冻结层中的各个分块中的逆向索引中进行搜索,以便找到包括关键字“故障”的全部日志。利用本公开的示例性实现方式,可以确保以更加准确并且高效的方式执行全文搜索。
52.随着存储系统的运行,存储系统中可能会包括错误或者不再有效的数据对象,此时可以从存储系统中删除指定的数据对象。根据本公开的示例性实现方式,如果接收到从存储系统中删除数据对象的删除请求,可以首先确定数据对象的索引是否被存储在活跃层。如果确定数据对象的索引被存储在活跃层中的分片,可以直接从活跃层中的分片中删除数据对象的索引。
53.具体地,可以基于将要被删除的数据对象的关键字的哈希值,在活跃层中找到相应的分片,并且在该分片中的索引指定的地址处找到将要被删除的数据对象所在的存储空间。可以清除并释放该存储空间中的数据,由于此时数据对象本身已经被删除,因而该数据对象的索引不再有效,可以从活跃层的分片中删除该索引。以此方式,可以确保存储系统中的数据对象与索引具有一一对应的关系。
54.根据本公开的示例性实现方式,可以为冻结层设置删除队列。如果确定数据对象的索引没有被存储在活跃层,则可以将删除请求添加至删除队列,以便向冻结层中的各个分片通知删除请求。具体地,在每个冻结层中可以执行类似的操作。在某个冻结层中,如果确定数据对象的索引被存储在该冻结层中的分片,可以从该分片中找到将要被删除的数据对象所在的存储空间。可以清除并释放该存储空间中的数据。由于此时数据对象本身已经被删除,因而该数据对象的索引不再有效,可以从冻结层的分片中删除该索引。以此方式,可以确保存储系统中的数据对象与索引具有一一对应的关系。
55.根据本公开的示例性实现方式,可以在缓存文件中保存删除队列的更新历史。例如,如果某个删除请求被添加至删除队列,则可以在缓存文件中记录该删除请求,并且将该删除请求的状态设置为“未执行”。如果该删除请求已经被成功执行,则可以将该删除请求的状态标记为“已执行”。
56.根据本公开的示例性实现方式,当接收到针对存储系统的访问请求时,可以基于上述缓存文件来过滤访问请求。在此,访问请求包括更新请求、删除请求和搜索请求中的至少任一项。如果访问请求涉及缓存文件中记录的已经被删除的数据对象,则可以直接提供数据对象已经被删除的通知。具体地,如果接收到针对存储系统中的数据对象的访问请求,可以在缓存文件中搜索与数据对象相关联的删除请求。如果找到删除请求,则表示将要被
访问的数据对象已经被删除,并且可以直接提供通知而不必分别在索引中的各个层中进行搜索。
57.在上文中已经描述了用于扩展索引中的分片的过程,根据本公开的示例性实现方式,可以定期地监视活跃层中的分片的状态并且在需要时执行扩展操作。将会理解,存储系统中的工作负载可以变化,并且过多的层和/或分片可能会提高管理的复杂度。此时,可以针对索引中的分片执行收缩过程。收缩过程可以包括层内收缩以及层间收缩,在下文中,将分别参见图7和图8提供更多细节。
58.根据本公开的示例性实现方式,如果确定索引中的层所存储的索引的数量低于阈值数量,可以合并层中的分片。将会理解,随着在存储系统中执行删除请求、更新请求、或者更新插入请求,层中所存储的索引数量可能会降低。此时,可以合并层中的过多的分片,以便降低过多分片的计算资源开销和管理复杂度。
59.假设如图6所示的索引600中的冻结层620中的索引数量下降至低于阈值数量,可以在冻结层620中执行合并。具体地,可以合并分片512和514,可以合并分片522和524,并且可以合并分片532和534。图7示意性示出了根据本公开的一个实现方式的执行层内合并后的索引700的框图。在图7中,分片710来自合并前的分片512和514,分片720来自合并前的分片522和524,以及分片730来自合并前的分片532和534。
60.根据本公开的示例性实现方式,合并前的层的分片数量为合并后的层的分片数量的整数倍。例如,合并前的冻结层620中的分片数量“6”是合并后的冻结层740中的分片数量“3”的2倍。利用本公开的示例性实现方式,基于整数倍来执行扩展和收缩过程。以此方式,通过在具有相同哈希值空间的分片之间进行合并,可以简化管理索引的复杂度,并且降低在扩展和收缩过程中出现异常的可能性。
61.根据本公开的示例性实现方式,如果基于层中的分片来存储进入存储系统的多个数据对象的索引的速度高于多个数据对象进入存储系统的速度,可以合并该层中的分片。将会理解,在此需要确保合并后的层中的分片的处理速度高于多个数据对象进入存储系统的速度。假设向存储系统写入数据对象的速度大大下降,并且此时活跃层630中的12个分片的处理速度已经远高于进入存储系统的数据对象的速度,此时可以将12个分片合并至6个分片。
62.将会理解,如果索引中的层的数量过多,同样会增加管理复杂度,此时可以执行层间合并。根据本公开的示例性实现方式,如果确定索引中的多个层所存储的索引的数量低于阈值数量,可以合并多个层中的分片。在图7中,可以合并冻结层740和冻结层610中的分片。具体地,可以合并分片410和710,可以合并分片420和720,并且可以合并分片430和730。图8示意性示出了根据本公开的一个实现方式的执行层间合并后的索引800的框图。在图8中,冻结层840来自图7中的冻结层740和冻结层610,并且该冻结层840包括3个分片:分片810、820和830。利用本公开的示例性实现方式,可以降低索引中的层的数量,进而降低管理索引的复杂度。
63.将会理解,为了避免合并中出现的故障对索引造成不良影响,可以预先备份存储合并前的各个相关层,如果在合并过程中出现操作异常或者其他故障,可以将各个相关层回滚至预先备份的版本。如果成功执行了合并过程,则可以删除备份的版本。利用本公开的示例性实现方式,可以确保在出现故障时可以将存储系统的索引恢复至之前的正确版本,
进而提高索引管理的可靠性。
64.在上文中已经参见图2至图8详细描述了根据本公开的方法300的示例,将会理解,可以在单一设备上执行上文描述的方法,也可以以分布式方式在多个设备上执行上文描述的方法。在下文中将描述相应的装置的实现。根据本公开的示例性实现,提供了一种用于管理流式数据的存储系统的索引的装置。在此,索引的活跃层包括第一组分片,以及第一组分片中的分片用于存储存储系统中的一部分数据对象的索引。该装置包括:创建模块,配置用于响应于确定第一组分片的状态满足预定扩展条件,在索引中创建第二组分片,第二组分片中的分片用于存储将要进入存储系统的数据对象的索引;活跃层标记模块,配置用于将第二组分片所在的层标记为活跃层;冻结层标记模块,配置用于将第二组分片所在的层以外的其他层标记为冻结层;以及管理模块,配置用于基于索引中的活跃层和冻结层中的分片来管理存储系统。根据本公开的示例性实现方式,该装置可以包括用于执行上文描述的方法300中的其他步骤的模块。
65.图9示意性示出了根据本公开的示例性实现的用于管理存储系统的索引的设备900的框图。如图所示,设备900包括中央处理单元(cpu)901,其可以根据存储在只读存储器(rom)902中的计算机程序指令或者从存储单元908加载到随机访问存储器(ram)903中的计算机程序指令,来执行各种适当的动作和处理。在ram 903中,还可存储设备900操作所需的各种程序和数据。cpu 901、rom902以及ram 903通过总线904彼此相连。输入/输出(i/o)接口905也连接至总线904。
66.设备900中的多个部件连接至i/o接口905,包括:输入单元906,例如键盘、鼠标等;输出单元907,例如各种类型的显示器、扬声器等;存储单元908,例如磁盘、光盘等;以及通信单元909,例如网卡、调制解调器、无线通信收发机等。通信单元909允许设备900通过诸如因特网的计算机网络和/或各种电信网络与其他设备交换信息/数据。
67.上文所描述的各个过程和处理,例如方法300,可由处理单元901执行。例如,在一些实现中,方法300可被实现为计算机软件程序,其被有形地包含于机器可读介质,例如存储单元908。在一些实现中,计算机程序的部分或者全部可以经由rom 902和/或通信单元909而被载入和/或安装到设备900上。当计算机程序被加载到ram 903并由cpu 901执行时,可以执行上文描述的方法300的一个或多个步骤。备选地,在其他实现中,cpu 901也可以以其他任何适当的方式被配置以实现上述过程/方法。
68.根据本公开的示例性实现,提供了一种电子设备,包括:至少一个处理器;易失性存储器;以及与至少一个处理器耦合的存储器,存储器具有存储于其中的指令,指令在被至少一个处理器执行时使得设备执行一种用于管理流式数据的存储系统的索引的方法。该索引的活跃层包括第一组分片,以及第一组分片中的分片用于存储存储系统中的一部分数据对象的索引。该方法包括:响应于确定第一组分片的状态满足预定扩展条件,在索引中创建第二组分片,第二组分片中的分片用于存储将要进入存储系统的数据对象的索引;将第二组分片所在的层标记为活跃层;将第二组分片所在的层以外的其他层标记为冻结层;以及基于索引中的活跃层和冻结层中的分片来管理存储系统。
69.根据本公开的示例性实现方式,预定扩展条件包括以下中的至少任一项:第一组分片存储的索引的数量高于阈值数量;以及基于第一组分片来存储进入存储系统的多个数据对象的索引的速度低于多个数据对象进入存储系统的速度。
70.根据本公开的示例性实现方式,管理存储系统包括:响应于接收到用于向存储系统插入数据对象的插入请求,生成数据对象的索引;以及将数据对象的索引存储至活跃层中的与数据对象相对应的分片。
71.根据本公开的示例性实现方式,管理存储系统包括:响应于接收到用于在存储系统中更新数据对象的更新请求,确定数据对象的索引是否被存储在活跃层;以及响应于确定数据对象的索引被存储在活跃层中的分片,更新数据对象并且将更新的数据对象的索引存储至分片。
72.根据本公开的示例性实现方式,该方法进一步包括:响应于确定数据对象的索引没有被存储在活跃层,向冻结层转发更新请求;以及响应于确定数据对象的索引被存储在冻结层中的分片,更新数据对象并且将更新的数据对象的索引存储至活跃层中的分片。
73.根据本公开的示例性实现方式,该方法进一步包括:从冻结层中的分片删除数据对象的索引。
74.根据本公开的示例性实现方式,管理存储系统包括:响应于接收到用于在存储系统中更新插入数据对象的更新插入请求,确定数据对象的索引是否被存储在活跃层;以及响应于确定数据对象的索引被存储在活跃层中的分片,更新数据对象并且将更新的数据对象的索引存储至分片。
75.根据本公开的示例性实现方式,该方法进一步包括:响应于确定数据对象的索引没有被存储在活跃层,向冻结层转发更新插入请求;以及响应于确定数据对象的索引没有被存储在冻结层,将数据对象的索引存储至活跃层中的分片。
76.根据本公开的示例性实现方式,该方法进一步包括:响应于确定数据对象的索引被存储在冻结层中的分片,基于更新插入请求来更新数据对象;以及将更新的数据对象的索引存储至活跃层中的分片。
77.根据本公开的示例性实现方式,该方法进一步包括:从冻结层中的分片删除数据对象的索引。
78.根据本公开的示例性实现方式,该方法管理存储系统包括:响应于接收到用于在存储系统中搜索数据对象的搜索请求,分别向活跃层和冻结层转发搜索请求;以及提供来自活跃层以及冻结层的搜索结果。
79.根据本公开的示例性实现方式,该方法管理存储系统包括:响应于接收到从存储系统中删除数据对象的删除请求,确定数据对象的索引是否被存储在活跃层;以及响应于确定数据对象的索引被存储在活跃层中的分片,从活跃层中的分片中删除数据对象的索引。
80.根据本公开的示例性实现方式,该方法进一步包括:响应于确定数据对象的索引没有被存储在活跃层,将删除请求添加至冻结层的删除队列,以向冻结层中的分片通知删除请求。
81.根据本公开的示例性实现方式,该方法进一步包括:响应于确定数据对象的索引被存储在冻结层中的分片,从冻结层中的分片删除数据对象的索引。
82.根据本公开的示例性实现方式,该方法进一步包括:响应于接收到针对存储系统中的数据对象的访问请求,基于删除队列的更新历史来搜索与数据对象相关联的删除请求,其中访问请求包括更新请求、删除请求和搜索请求中的至少任一项;以及响应于找到删
除请求,提供数据对象已经被删除的通知。
83.根据本公开的示例性实现,提供了一种计算机程序产品,计算机程序产品被有形地存储在非瞬态计算机可读介质上并且包括机器可执行指令,机器可执行指令用于执行根据本公开的方法。
84.根据本公开的示例性实现,提供了一种计算机可读介质。计算机可读介质上存储有机器可执行指令,当机器可执行指令在被至少一个处理器执行时,使得至少一个处理器实现根据本公开方法。
85.本公开可以是方法、设备、系统和/或计算机程序产品。计算机程序产品可以包括计算机可读存储介质,其上载有用于执行本公开的各个方面的计算机可读程序指令。
86.计算机可读存储介质可以是可以保持和存储由指令执行设备使用的指令的有形设备。计算机可读存储介质例如可以是――但不限于――电存储设备、磁存储设备、光存储设备、电磁存储设备、半导体存储设备或者上述的任意合适的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:便携式计算机盘、硬盘、随机存取存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、静态随机存取存储器(sram)、便携式压缩盘只读存储器(cd-rom)、数字多功能盘(dvd)、记忆棒、软盘、机械编码设备、例如其上存储有指令的打孔卡或凹槽内凸起结构、以及上述的任意合适的组合。这里所使用的计算机可读存储介质不被解释为瞬时信号本身,诸如无线电波或者其他自由传播的电磁波、通过波导或其他传输媒介传播的电磁波(例如,通过光纤电缆的光脉冲)、或者通过电线传输的电信号。
87.这里所描述的计算机可读程序指令可以从计算机可读存储介质下载到各个计算/处理设备,或者通过网络、例如因特网、局域网、广域网和/或无线网下载到外部计算机或外部存储设备。网络可以包括铜传输电缆、光纤传输、无线传输、路由器、防火墙、交换机、网关计算机和/或边缘服务器。每个计算/处理设备中的网络适配卡或者网络接口从网络接收计算机可读程序指令,并转发该计算机可读程序指令,以供存储在各个计算/处理设备中的计算机可读存储介质中。
88.用于执行本公开操作的计算机程序指令可以是汇编指令、指令集架构(isa)指令、机器指令、机器相关指令、微代码、固件指令、状态设置数据、或者以一种或多种编程语言的任意组合编写的源代码或目标代码,编程语言包括面向对象的编程语言—诸如smalltalk、c 等,以及常规的过程式编程语言—诸如“c”语言或类似的编程语言。计算机可读程序指令可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络—包括局域网(lan)或广域网(wan)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。在一些实现中,通过利用计算机可读程序指令的状态信息来个性化定制电子电路,例如可编程逻辑电路、现场可编程门阵列(fpga)或可编程逻辑阵列(pla),该电子电路可以执行计算机可读程序指令,从而实现本公开的各个方面。
89.这里参照根据本公开实现的方法、装置(系统)和计算机程序产品的流程图和/或框图描述了本公开的各个方面。应当理解,流程图和/或框图的每个方框以及流程图和/或框图中各方框的组合,都可以由计算机可读程序指令实现。
90.这些计算机可读程序指令可以提供给通用计算机、专用计算机或其他可编程数据处理装置的处理单元,从而生产出一种机器,使得这些指令在通过计算机或其他可编程数据处理装置的处理单元执行时,产生了实现流程图和/或框图中的一个或多个方框中规定的功能/动作的装置。也可以把这些计算机可读程序指令存储在计算机可读存储介质中,这些指令使得计算机、可编程数据处理装置和/或其他设备以特定方式工作,从而,存储有指令的计算机可读介质则包括一个制造品,其包括实现流程图和/或框图中的一个或多个方框中规定的功能/动作的各个方面的指令。
91.也可以把计算机可读程序指令加载到计算机、其他可编程数据处理装置、或其他设备上,使得在计算机、其他可编程数据处理装置或其他设备上执行一系列操作步骤,以产生计算机实现的过程,从而使得在计算机、其他可编程数据处理装置、或其他设备上执行的指令实现流程图和/或框图中的一个或多个方框中规定的功能/动作。
92.附图中的流程图和框图显示了根据本公开的多个实现的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或指令的一部分,模块、程序段或指令的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
93.以上已经描述了本公开的各实现,上述说明是示例性的,并非穷尽性的,并且也不限于所公开的各实现。在不偏离所说明的各实现的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实现的原理、实际应用或对市场中的技术的改进,或者使本技术领域的其他普通技术人员能理解本文公开的各实现。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献