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

数据管理系统及其控制方法与流程

2022-09-15 06:57:25 来源:中国专利 TAG:

数据管理系统及其控制方法
1.对相关申请的交叉引用
2.本技术要求以下申请的优先权和权益:(i)于2020年2月3日提交的题为“数据存储平台”的美国临时申请第62/969,623号;(ii)于2020年2月3日提交的题为“数据管理系统”的美国临时申请第62/969,650号;以及(iii)于2020年2月4日提交的题为“数据管理系统”的美国临时申请第62/970,158号;本段中标识的所有文献的全部内容通过引用并入本文。
3.第i部分
4.高性能分布式对象存储中处理小元数据对象和压紧的方法
5.本说明书的“第i部分”中的文本,包括任何附图标记或字符以及对附图的任何引用,参考并对应于具有标签“第i部分”的图1-5,并且不参考或对应于第ii-iv部分中的文本,也不参考或对应于附图页上具有标签“第ii”、“第iii”或“第iv”的任何附图标记、字符或具有标签的附图。也就是说,本说明书中的部分i-iv中的每一个应当分别在相同部分中的对应描述和用相同部分标记的附图的情境中解释。然而,尽管如此,各个部分的各个方面和发明构思可以应用于其他部分的各方面和发明构思。
技术领域
6.本公开的实施例的一个或多个方面总的说来涉及数据压紧、小元数据对象的处理以及分布式对象存储。


背景技术:

7.对象存储设备或对象存储可以将数据存储为一个或多个数据对象。存储在对象存储中的数据对象中的一个或多个可以由对应应用通过使用用于识别寻求访问的数据对象的对象标识符来访问。
8.可以通过使用分布式对象来进一步增强由对象存储提供的优点,这是因为分布式对象存储能够提供能够增长以适应一个或多个对应应用的请求的可缩放存储。然而,分布式应用的性能可以取决于在给定对象标识符的情况下,对应分布式对象存储能够如何有效地将数据提供给应用。


技术实现要素:

9.本文描述的实施例通过允许处理大量非结构化数据的应用有效地处理可变大小的元数据对象并有效地运行后台压紧来提供对数据存储装置的改进,从而增加驱动器耐久性,同时减少写入放大、读取放大和空间放大。
10.根据本公开的一些实施例,提供了一种数据存储系统中的数据存储的方法,该方法包括:识别分别对应于对象数据的对象头部;将对象数据存储在分配的数据组块(data chunk)的一侧;以及将对象头部存储在分配的数据组块的另一侧。
11.该方法还可以包括删除或聚集对象数据,使得无效数据导致分配的数据组块被碎裂,读取对象头部中的一个以确定对象数据中的对应对象数据是有效数据对象,以及将有
效数据对象移动到新分配的数据组块。
12.该方法还可以包括读取对象头部中的一个以确定对象数据中的对应对象数据是无效数据对象,并且避免读取无效数据对象。
13.该方法还可以包括读取对象头部以确定对象数据是有效对象数据,确定有效对象数据对应于单个对象,级联有效对象数据,以及将有效对象数据作为单个对象写入驱动器。
14.该方法还可以包括将对象数据暂存到持久性存储器中的连续缓冲器中,确定连续缓冲器已经达到阈值,以及将与对象数据相对应的数据顺序地写入驱动器。
15.该方法还可以包括确定对象头部中的一个具有被设置为长的属性,以及将所述对象头部中的一个暂存在持久性存储器中的活动块中,并将活动块写入驱动器,或者直接将活动块写入驱动器。
16.该方法还可以包括确定对象头部中的一个具有被设置为短的属性,以及将所述对象头部中的一个高速缓存在持久性存储器中。
17.根据本公开的其他实施例,提供了一种被配置为存储数据的数据存储系统,该数据存储系统包括存储节点和数据管理节点,该存储节点包括用于存储数据的键值存储,该数据管理节点用于从存储节点发送或检索数据,其中,该数据管理节点被配置为识别分别对应于对象数据的对象头部,将对象数据存储在分配的数据组块的一侧,并且将对象头部存储在分配的数据组块的另一侧。
18.数据管理节点还可以被配置为删除或聚集对象数据,使得无效数据导致分配的数据组块被碎裂,读取对象头部中的一个以确定对象数据中的对应对象数据是有效数据对象,以及将有效数据对象移动到新分配的数据组块。
19.数据管理节点还可以被配置为读取对象头部中的一个以确定对象数据中的对应对象数据是无效数据对象,并且避免读取无效数据对象。
20.数据管理节点还可以被配置为读取对象头部以确定对象数据是有效对象数据,确定有效对象数据对应于单个对象,级联有效对象数据,以及将有效对象数据作为单个对象写入驱动器。
21.数据管理节点还可以被配置为将对象数据暂存到持久性存储器中的连续缓冲器中,确定连续缓冲器已经达到阈值,并且将与对象数据相对应的数据顺序地写入驱动器。
22.数据管理节点还可以被配置为确定对象头部中的一个具有被设置为长的属性,并且将所述对象头部中的一个暂存在持久性存储器中的活动块中并将活动块写入驱动器,或者直接将活动块写入驱动器。
23.数据管理节点还可以被配置为确定对象头部中的一个具有被设置为短的属性,并且将所述对象头部中的一个高速缓存在持久性存储器中。
24.根据本公开的其他实施例,提供了一种在分布式对象存储系统上实现的非暂时性计算机可读介质,该非暂时性计算机可读介质具有计算机代码,该计算机代码当在处理器上执行时实现由数据管理节点进行的数据存储的方法,该方法包括识别分别对应于对象数据的对象头部,将对象数据存储在分配的数据组块的一侧,以及将对象头部存储在分配的数据组块的另一侧。
25.所述计算机代码在由处理器执行时,还通过使数据管理节点执行以下操作来实现数据存储的方法:删除或聚集对象数据,使得无效数据导致分配的数据组块被碎裂,读取对
象头部中的一个以确定对象数据中的对应对象数据是有效数据对象,并将有效数据对象移动到新分配的数据组块。
26.所述计算机代码在由处理器执行时,还通过使数据管理节点执行以下操作来实现数据存储的方法:读取对象头部中的一个以确定对象数据中的对应对象数据是无效数据对象,并避免读取无效数据对象。
27.所述计算机代码在由处理器执行时,还通过使数据管理节点执行以下操作来所述数据存储的方法:读取对象头部以确定对象数据是有效对象数据,确定有效对象数据对应于单个对象,级联有效对象数据,并将有效对象数据作为单个对象写入驱动器。
28.所述计算机代码在由处理器执行时,还通过使数据管理节点执行以下操作来实现数据存储的方法:将对象数据暂存到持久性存储器中的连续缓冲器中,确定连续缓冲器已经达到阈值,并且将与对象数据相对应的数据顺序地写入驱动器。
29.所述计算机代码在由处理器执行时,还通过使数据管理节点执行以下操作来实现数据存储的方法:确定对象头部中的一个具有被设置为短的属性,并且将所述对象头部中的一个高速缓存在持久性存储器中。
30.因此,本公开的实施例的方法和系统减少或避免了对存储在驱动器中的小对象的随机访问,从而减少了读取放大和写入放大。本公开的实施例的方法和系统还有效地使用持久性存储器以避免将频繁变化的对象写入驱动器。
附图说明
31.从以下结合附图对实施例的描述中,上述和/或其他方面将变得显而易见并且更容易理解,其中:
32.图1是根据本公开的一些实施例的存储系统的框图;
33.图2是根据本公开的一些实施例的存储系统的框图;
34.图3是描绘根据本公开的一些实施里的盘区的框图;
35.图4是描绘根据本公开的一些实施例的增补的框图;以及
36.图5是描绘根据本公开的一些实施例的用于存储键值对的值的事务日志的框图。
具体实施方式
37.通过参考实施例的详细描述和附图,可以更容易地理解本发明构思的特征和实现本发明构思的方法。在下文中,将参考附图更详细地描述实施例。然而,所描述的实施例可以以各种不同的形式体现,并且不应被解释为仅限于本文所示的实施例。相反,这些实施例是作为示例提供的,使得本公开将是彻底和完整的,并且将向本领域技术人员充分传达本发明构思的各方面和特征。因此,可以不描述本领域普通技术人员为了完全理解本发明构思的各方面和特征而不是必需的过程、元件和技术。除非另有说明,否则在整个附图和书面描述中,相同的附图标记表示相同的元件,因此,将不再重复其描述。此外,为了使描述清楚,可能未示出与实施例的描述无关的部分。在附图中,为了清楚起见,元件、层和区域的相对大小会被夸大。
38.本文参考作为实施例和/或中间结构的示意性图示的截面图示描述了各种实施例。因此,预期作为例如制造技术和/或公差的结果的图示形状的变化。此外,出于描述根据
本公开的构思的实施例的目的,本文公开的具体结构或功能描述仅仅是说明性的。因此,本文公开的实施例不应被解释为限于特定示出的区域形状,而是包括由例如制造引起的形状偏差。举例来说,示出为矩形的注入区将通常在其边缘处具有圆形或弯曲特征和/或注入浓度梯度,而非从注入区到非注入区的二元变化。同样地,通过注入形成的埋入区可以导致在埋入区和通过其发生注入的表面之间的区域中的一些注入。因此,附图中所示的区域本质上是示意性的,并且它们的形状不旨在示出设备的区域的实际形状,也不旨在进行限制。另外,如本领域技术人员将认识到的,可以以各种不同的方式修改所描述的实施例,所有这些都不脱离本公开的精神或范围。
39.图1是根据本公开的一些实施例的存储系统的框图。
40.参考图1,并且如上所述,存储系统100(例如,分布式存储系统、分布式对象存储、或存储)可以包括对象存储装置或对象存储,其可以将数据作为一个或多个数据对象存储在由相应的存储节点托管的一个或多个键-值存储110上。存储节点可以用于有效地存储不同类别的数据和与其相对应的元数据。可以存在应用为存储节点的相对大量的应用特定键值存储110。
41.键值存储110可以由托管在一个或多个数据管理节点(dmn)上的一个或多个数据管理器120控制。可以使用高性能、低等待时间kv结构来实现dmn和存储节点。dmn可以读取一个或多个数据对象,并且可以将与一个或多个对象相对应的某些元数据写入存储系统100中。
42.当经由数据管理器120连接到存储系统100的一个或多个应用130(例如,应用、工作负载或客户端)提供对应于要访问的数据对象的对象标识符时,数据对象可以由应用130访问。连接到存储系统100的应用130可以能够“看到”所有存储节点。
43.根据本公开的一些实施例,并且与传统的块存储或文件存储系统不同,访问存储系统100的应用130既不负责将存储在其中的逻辑数据组织为一组固定大小的块,也不负责将逻辑数据组织成结构化组织,诸如一个或多个目录或文件。因此,通过使用用于标识包括数据的对应数据对象的对象标识符,向应用130提供对存储在存储系统100中的数据的平坦(flat)访问(例如,对象的命名空间是平坦的),这意味着应用130可以具有在给定对象标识符的情况下直接访问对象的能力,这与文件和目录的分层访问形成对比。
44.因此,所描述的实施例为寻求处理存储在键值存储110中的相对大量的非结构化数据的应用130提供了优点。例如,如果寻求处理大量非结构化数据的应用130中的一个是分布式应用,这意味着该应用具有在单个命名空间上工作的dmn的许多数据管理器120,则通过使用分布式对象存储来进一步改进存储系统100。这是由于分布式对象存储能够提供能够随着新的或变化的应用的功能而增长的可缩放存储。
45.为了提供一致的等待时间和性能,所公开的实施例的数据平台软件可以使用共享存储模型,其中,dmn的数据管理器120负责将应用数据提供给应用130,而底层存储节点托管键-值存储110,并将应用数据导出到dmn作为共享存储。也就是说,存储系统100利用一个或多个存储节点(例如,键值存储110)来将不同类别的数据有效地存储到一个或多个底层驱动器,并且利用一个或多个数据管理节点(dmn)(例如,数据管理器120)来处理和管理数据。
46.图2是根据本公开的一些实施例的存储系统的框图。
47.参考图2,元数据存储(mds)200是可变键值(kv)存储。mds 200可以是存储节点(例如,图1的键值存储110)中的一个或多个的一部分。mds 200可以用于存储从一个或多个dmn(例如,图1的数据管理器120)生成的元数据。也就是说,对应于一个或多个数据对象的元数据可以由存储系统100在内部生成。元数据可以包括对象标识符。因此,并且以类似于键值对的方式,每个对象可以包括对象标识符和对象数据。
48.分布式应用130的性能可以取决于在给定对象标识符的情况下存储系统100可以如何有效地提供数据。例如,分布式对象存储的性能可以由相对于访问数据对象具有一致等待时间的能力来确定(例如,当分布式对象存储扩放时)。也就是说,分布式存储系统100可以通过添加存储节点来扩放或增长,从而增加存储系统100的存储容量。然而,随着分布式对象存储扩放,会影响相对于访问存储系统100的数据对象具有一致等待时间的能力。
49.分布式对象存储的性能也可以由管理底层持久性存储以用于有效数据布局的能力来确定。也就是说,当存储系统100缩放时,管理底层持久性存储设备以用于有效数据布局的能力也会受到影响。因此,一些实施例的存储系统100使用存储器模块(例如,非易失性双列直插存储器模块(nvdimm)、存储级存储器(scm)等)作为持久性存储器(pmem)。持久性存储器可以是存储类别存储器,但是在其他实施例中,任何系统存储器可以用于持久性存储器。
50.在一些实施例中,可以取决于对象的属性合适地存储对象。也就是说,可以基于与其相关联的一个或多个相应属性来确定对象如何、何时以及在何处被存储在mds 200中。例如,小对象的小写入可以被暂存(stage)在持久性存储器210的活动块中(例如,在下面关于图3进一步描述的活动块330中)或者被高速缓存在持久性存储器210中。
51.对于具有被设置为“长”的属性或具有未指定的属性的小对象,可以将小对象直接暂存在活动块330中以在稍后的时间写入驱动器(例如,固态驱动器(ssd)205)。例如,持久性存储器210可以将小对象或小写入(例如,用于写入相对小的对象的写入操作)暂存到连续缓冲器中(例如,在写入级295中),直到缓冲器大小达到用于显示平台软件将数据顺序地写入底层驱动器(例如,写入一个或多个固态驱动器(ssd)205)的最佳大小为止。也就是说,当活动块变满时,可以将在活动块330中暂存的具有“长”属性的小对象写入ssd 205。
52.可以基于用于ssd 205的合适的ssd写入大小来选择用于暂存小写入的活动块330的大小。例如,合适的ssd写入大小可以是大约128kb。通过在持久性存储器210中暂存所有小写入,可以避免否则将被直接写入ssd 205的频繁的小写入。此外,通过在持久性存储器210中暂存所有小写入,一旦写入被复制到持久性存储器210,就可以确认对应的输入输出线程(io),从而提供低等待时间。
53.相比之下,具有被设置为“短”的属性的小对象可以被高速缓存在持久性存储器210中(例如,在小对象高速缓存290中),因为具有“短”属性的小对象可能由于频繁更新而相对频繁地改变。然后,当对象准备好从高速缓存/从持久性存储器210清除(evict)时,对象可以被写入ssd 205并被标记为从持久性存储器210删除。
54.因此,本公开的实施例有效地利用持久性存储器(例如,持久性存储器210)来避免将不断或频繁变化的对象(例如,元数据对象)写入对应驱动器(例如,ssd 205)。也就是说,mds 200可以使用ssd 205和持久性存储器210来分别存储数据和对应的元数据。
55.持久性存储器210的适合用于对飞行中(in-flight)块(例如,参见关于图3进一步
讨论的飞行中块320)和活动块330进行暂存的资源量相对非常低。也就是说,用于对飞行中块320和活动块330进行暂存的持久性存储器210的资源可以是合适的ssd写入大小的非常小的因素。
56.图3是描绘根据本公开的一些实施例的盘区的框图。
57.参考图3,在存储节点上运行的数据平台软件可以将ssd 205“分块”或划分成相对小的相等大小的数据组块。相等大小的数据组块可以被称为“盘区”。单个盘区300的大小可以足够大,其中,可以将数千个对象写入给定盘区300中,并且,单个盘区300的大小可以足够小以具有找到空闲可用盘区的能力,而不必花费额外的努力来使空闲盘区可用(例如,当新数据被写入存储系统100中时)。
58.不被认为是小对象的对象可以被分类为大对象。根据对象大小,并且根据与对象相对应的一个或多个属性,可以将部分对象或整个对象直接写入ssd 205。因为ssd 205对于大写入可以是高效的,所以可以避免在持久性存储器210处的暂存。
59.盘区300可以对于大写入是开放的。例如,盘区分配器240可以根据需要从ssd 205分配lba范围,以提供存储在mds 200上的各种对象的布局。可以适合于mds 200的盘区300的数量没有特别限制。
60.在盘区300中,可能存在已经存留在ssd 205上的一些块(例如,写入完成块310)。一些块可以在转移中/飞行中(例如,飞行中块320),并且其他块可以是由持久性存储器210支持的活动块330(例如,尚未完全填充的块)。此外,可以存在一个或多个空闲块340。在一些实施例中,块中的每一个可以具有约128kb的大小,这可以实现ssd 205的高效性能,但本公开不限于此。
61.此外,返回参考图2,压紧模块260用于执行压紧过程。由于元数据对象的可变性质,数据平台软件可以通过被称为压紧的方法来管理存储空间碎片整理。也就是说,当对象被删除或聚集时,盘区300可以生成一些无效数据。在任何时候,在包括mds 200的存储系统100中可以存在开放的多个盘区300。然后,每个盘区300可以跟踪存储在mds 200中的无效数据的量,并且压紧过程可以使用盘区300的属性,或者可以使用指示对应数据无效的信息,以确定何时适当地开始对盘区300的压紧。因此,压紧模块260可以参与压紧,其中,有效数据从包括一些无效数据的碎裂盘区被移动到新盘区。
62.在本公开的一些实施例中,对象数据可以从左到右被写入到盘区300中。此外,头部数据可以从右到左被写入。因此,当输入对象数据时,用于管理mds 200的软件可以以串行化的方式将元数据推送到ssd 205。也就是说,关于数据的布局,可以从两个不同的方向输入可以包括盘区头部的元数据和对象数据。
63.常规地,将在压紧操作期间读取数据和元数据两者。然而,在本公开的一些实施例中,压紧模块260最初可以仅读取盘区头部(即,元数据),其可以小至128kb。通过避免读取对象数据,可以相对快速地读取盘区头部,从而通过减少处理器的工作负荷并减少与驱动器的交互量来改善系统操作。
64.也就是说,小对象不需要被随机访问,而是可以以包含多个对象的相对大的顺序组块(例如,约1mb)写入存储器中,其中,一些对象可能是无效的。因此,可以通过简单地读取盘区头部/元数据来识别有效对象,该盘区头部/元数据可以显著小于对应对象(例如,128kb),然后可以将有效对象移动到新的或不同的盘区。因此,新盘区300可以(最初)仅包
含有效对象(例如,可以包含1mb的有效对象)。如果盘区头部指示盘区中没有对象有效,则系统可以完全避免读取盘区。通过在执行用于读取对象数据的读取操作之前读取盘区头部而不读取对象数据,可以改善等待时间。
65.在读取盘区头部之后,处理器可以确定哪些对象是有效的以及哪些对象是无效的。在做出这样的确定之后,可以将可以以1mb组块的有效对象数据(连同对应的元数据)移动到新的或不同的盘区,而可以忽略对应于无效盘区头部的对象数据。对有效的1mb数据组块的读取可以继续,直到整个盘区被读取并且有效对象被移动到不同的盘区为止。
66.压紧可以确保小对象不在ssd 205中被随机访问,而是以1mb大小的顺序组块被读取到存储器中。这确保了完全避免到ssd 205的业务,并且避免了随机访问,从而减少了读取放大。应当注意,尽管本文描述的顺序组块的大小被描述为1mb,但是在不同的实施例中,组块可以大小不同。例如,如果典型的数据对象仅为64字节,这可以由数据收集统计指示(即,如果大多数数据对象是相对小的对象),则可以将顺序块的大小减小到更小的粒度以减少处理。
67.当盘区分配器240达到可用盘区300的数量的阈值时,盘区分配器240可以调用存储以执行关于其盘区300的“垃圾收集”。垃圾收集过程可以查看盘区300的列表,并且可以在具有合适量的无效数据(例如,超过可允许的无效数据的阈值量)的盘区上开始压紧。
68.因此,本公开的实施例通过具有高效地运行后台压紧的能力来提供对数据存储装置的改进,这可以通过减少对其的写入数量来增加对应驱动器(例如,ssd 205)的耐久性,同时减少或最小化写入放大、读取放大和空间放大。例如,可以通过避免随机访问存储在对应驱动器中的小对象来减少读取放大。
69.此外,如图2所示,用于执行写入操作的写入器250可以使用盘区300来为磁盘上(例如,在ssd 205上)的对象提供布局。写入器250可以向ssd 205发出写入。也就是说,用户应用(例如,图1的应用130中的一个)可以引导写入器250(例如,经由访问管理器,诸如驱动器/ssd访问管理器270)将对象写入存储系统100。取决于io线程的大小,写入过程可以将数据暂存在持久性存储器210中(例如,在用于小写入的写入级295中),或者可以将io线程直接发布到ssd 205。写入过程可以分配盘区300,并且可以打包要写入到ssd 205的数据。在完成写入操作时,写入器250可以发起合适的协议以更新映射条目(例如,在映射模块220中)以指向数据所在的ssd地址。
70.此外,可以调整mds 200以减少写入放大,同时提供电源故障保证。数据和元数据的特性可能非常不同。mds 200可以被调整或优化以用于低等待时间、较小的大小的写入,诸如元数据对象,其通常比元数据对象所对应的数据对象小得多。来自dmn的数据对象通常大小较大并且是不可变的,而写入mds 200的元数据可以是非常小的对象。例如,元数据对象和数据对象可以分别小至约64字节和大至约1mb。小对象写入可以是例如具有大约4kb或更小的大小的对象,但是本公开不限于此。
71.图4是描绘根据本公开的一些实施例的增补的框图。
72.参考图2和图4,根据一些实施例,mds 200可以支持增补功能。在增补功能中,对数据的增量更新被增补在当前对象的末尾,从而使对象可变。由于对象易变性,一些对象可以从非常小的大小增长到高达约2mb或更大的大小。基于工作负载,这些可变元数据对象可能被删除,从而潜在地引起碎裂问题。
73.可以通过使用映射模块220来实现增补功能。映射模块220可以将键410(例如,元数据对象键)映射到存储对应于键410的值(或多个)420的物理逻辑块地址(lba)(例如,ssd 205和/或持久性存储器210上的lba)。可以为每个组222维持映射。每个键410可以具有可以被用作组标识符的相对少量的字节。每个组222可以被映射到dmn放置组。查询操作(例如,用于搜索、过滤、分组、连结、选择或排序数据)可以限于组222。dmn(或多个)可以负责管理跨组或多组操作。
74.由映射模块220创建的映射/映射树中的条目可以指向持久性存储器210或ssd 205中的位置,这取决于与该条目相对应的对象位于何处。
75.可以是与由映射模块220创建的映射树相对应的映射条目的附件400可以根据附件400的大小和/或一个或多个属性而在持久性存储器210处被暂存。通常,mds 200可以预期大多数附件400的大小相对较小。
76.在小附件的情况下,附件400的数据可以被暂存在持久性存储器210中。持久性存储器页大小的单位可以是例如约4kb。如果持久性存储器页已满(例如,如果对应于用于页写入的写入级275的缓冲器已满),则可以将其冲刷到ssd 205。如果键410在持久性存储器210中具有多个页,则当冲刷到ssd 205时(例如,当将键410写入ssd 205而同时标记在持久性存储器210中暂存的键410的副本以进行删除时),可以合并键410。
77.取决于附件400发生于对应对象的时间,可以使用键410来指向多个物理地址。也就是说,键410可以对应于多个值420。图4描绘了附件400的值420可以如何指向多个数据组块430(例如,指向ssd 205上的lba)。数据块430可以共同对应于数据对象。
78.例如,在与存储在mds 200中的元数据对象相对应的元数据操作的情境中,可以初始地存储元数据对象。在此后的某个时间,附加数据被添加到元数据对象可能是合适的。然而,因为其他对象可能已经在中间被存储在mds 200中,所以与附加数据相对应的对象可能不能与初始存储的元数据对象一起被布局。也就是说,因为会寻求在不同时间将不同的数据存储在mds 200中,所以会无法将与不同数据相对应的各个对象布局在一起。
79.因此,每个附件400可以被视为元数据对象的片段。通过映射数据块430(例如,通过使用映射模块220将裂片放入映射中)使得级联成为可能。最初,可以存在一个键和仅一个对应的值。当新数据被添加到初始对象时,附加值420被附接到附件400。可以附接每个附加值以指示新数据被存储在ssd 205上的对应的附加数据块430。因此,可以将与数据块430相对应并且基于映射条目的值420的各种对象拼接在一起。
80.应当注意,即使与数据块430相对应的各种对象被分裂,mds 200也可以执行用于将分裂的对象写入不同位置的写入操作,作为仅具有一个单个对应值的单个块(例如,在执行用于读取与多个数据块相对应的对象的读取操作之后不久)。也就是说,例如,在读取操作期间,可以将各种数据块430拼接在一起以将单个对象发送到客户端,这可以被用作将表示对象的单个值写入ssd 205而不会显著磨损ssd 205的机会。
81.使用足够大小的dram来将所有索引节点或内部节点保持在dram中可能是合适的。存留在ssd 205上的映射页可以具有仅指向ssd 205的条目。例如,ssd 205上的磁盘上映射页可能永远不会指向持久性存储器210。
82.然而,取决于所存储的对象的数量,并且取决于对象如何被存储(例如,通过使用附件400),映射树可能不能够适合动态随机存取存储器(dram)。因此,用于实现分页
(paging)系统的分页模块230可以适合于对指示相应映射树的映射页进行换进(page in)和换出(page out)。
83.由于两个原因,分页模块230可能是合适的。首先,分页操作可以使mds 200能够避免在mds 200关闭或故障之后重新创建映射树,这是因为所有映射节点都可以存留在ssd 205上。其次,因为dram的大小可以使得少于所有映射页可以适配在dram中,所以分页操作可以帮助将页交换到ssd 205中和/或从ssd 205交换出页。在一些实施例中,所有映射页的大小可以是大约4kb。此外,在一些实施例中,映射条目可以被降级到仅单个映射页(即,可能不跨越两个映射页)以提供操作的进一步简化。
84.持久性存储器210还可以包括日志(journal)280。日志280的主要消费者可以是映射模块220。在映射页被存留在驱动器/ssd 205上之前,映射模块220可以使用日志280来存储瞬态映射条目。
85.日志280可以被实现为循环缓冲器,并且可以具有固定长度的元素和连续块循环缓冲器。可以将条目添加到头部并从尾部移除,但是一些条目在头部和尾部之间可能是无效的。
86.图5是描绘根据本公开的一些实施例的用于存储键值对的值的事务日志的框图。
87.参考图5,根据本公开的一些实施例,一个或多个dmn可以使用事务日志510来恢复存储器事务(例如,在系统崩溃或电源故障的情况下)。事务日志510可以是短期对象,其通常大小非常小并且旨在具有有限的生命周期。每一事务日志510可以具有固定大小。此外,事务日志510的总数也可以是固定的。事务日志510可以被存储在持久性存储器210中的事务日志模块285中。
88.事务日志510具有键值语义。例如,散列表(例如,事务日志映射)530可以用于将键520存储在存储器中,并且键520可以用于识别持久存储器210中存留的值(事务日志510)的位置。
89.另外,在一些实施例中,在任何给定时间点可以存在最大数量的未完成事务日志510。因此,用于映射到存储在持久性存储器210中的值520的键520可以被保持在简单的散列表中,作为dram中的事务日志映射530。因为键520被映射在存储在dram中的散列表中,所以可以在电力故障或系统崩溃之后的恢复期间重新创建散列表。散列表中的每个日志条目可以包含键。
90.在一些实施例中,事务日志映射530可以被存储在dram中。然而,在其他实施例中,事务日志映射530可以被保存在持久性存储器210中(例如,在事务日志模块285中)。因此,事务日志映射530不需要被写入驱动器/ssd 205。因此,事务日志映射530可以用于减少在电力故障或系统崩溃之后进行重建的时间量。
91.因此,mds 200可以将事务日志520作为键存储在持久性存储器(例如,dram或持久性存储器210)中,以在适当的时间删除而不会已经被写入ssd 205,从而增加ssd的耐久性。
92.如上所述,本公开的实施例提供了一种分布式存储系统,其能够通过允许数据跨所有可用存储节点分布而相对于可能并行发生的读取和写入操作线性地缩放,其中,数据的结构由数据管理节点维护。
93.此外,本公开的实施例通过具有对象存储的能力来提供对数据存储的改进,该对象存储是相对大且可缩放的分布式存储系统的一部分,并且被设计用于可以具有可变大小
的对象的元数据工作负载。
94.此外,本公开的实施例通过向驱动器写入大对象和顺序写入来改进驱动器功能,同时避免以随机访问方式将小对象写入驱动器。也就是说,实施例提供了一种有效地将小对象写入对象存储的方法,其吸收了以随机访问方式将小对象写入驱动器的开销。因此,通过减少对驱动器的写入数量,可以改善驱动器的耐久性,并且可以改善io等待时间。
95.因此,本公开的实施例为用于处理相对大量的非结构化数据的应用提供了优点,这样的优点为其中数据管理节点在单个命名空间上工作的分布式系统提供了增加的益处,同时在负载下保持性能的一致性。
96.根据本公开的一个或多个实施例可以包括以下条款中的一个或多个的一个或多个特征(但实施例不限于此):
97.条款1:一种数据存储系统中的数据存储的方法,所述方法包括:
98.识别分别对应于对象数据的对象头部;
99.将对象数据存储在分配的数据组块的一侧;以及
100.将对象头部存储在分配的数据组块的另一侧。
101.条款2:如条款1所述的方法,还包括:
102.删除或聚集对象数据,使得无效数据导致分配的数据组块被碎裂;
103.读取对象头部中的一个以确定对象数据中的对应对象数据是有效数据对象;以及
104.将有效数据对象移动到新分配的数据组块。
105.条款3:如条款1所述的方法,还包括:
106.读取对象头部中的一个以确定对象数据中的对应对象数据是无效数据对象;以及
107.避免读取无效数据对象。
108.条款4:如条款1所述的方法,还包括:
109.读取对象头部以确定对象数据是有效对象数据;
110.确定有效对象数据对应于单个对象;
111.级联有效对象数据;以及
112.将有效对象数据作为单个对象写入驱动器。
113.条款5:如条款1所述的方法,还包括:
114.将对象数据暂存到持久性存储器中的连续缓冲器中;
115.确定连续缓冲器已经达到阈值;以及
116.将与对象数据相对应的数据顺序地写入驱动器。
117.条款6:如条款1所述的方法,还包括:
118.确定对象头部中的一个具有被设置为长的属性;以及
119.将所述对象头部中的一个暂存在持久性存储器中的活动块中,并将活动块写入驱动器;或
120.直接将活动块写入驱动器。
121.条款7:如条款1所述的方法,还包括:
122.确定对象头部中的一个具有被设置为短的属性;以及
123.将所述对象头部中的一个高速缓存在持久性存储器中。
124.条款8:一种被配置为存储数据的数据存储系统,所述数据存储系统包括存储节点
和数据管理节点,所述存储节点包括用于存储数据的键值存储,所述数据管理节点用于从存储节点发送或检索数据,其中,所述数据管理节点被配置为:
125.识别分别对应于对象数据的对象头部;
126.将对象数据存储在分配的数据组块的一侧;以及
127.将对象头部存储在分配的数据组块的另一侧。
128.条款9:如条款8所述的数据存储系统,其中,所述数据管理节点还被配置为:
129.删除或聚集对象数据,使得无效数据导致分配的数据组块被碎裂;
130.读取对象头部中的一个以确定对象数据中的对应对象数据是有效数据对象;以及
131.将有效数据对象移动到新分配的数据组块。
132.条款10:如条款8所述的数据存储系统,其中,所述数据管理节点还被配置为:
133.读取对象头部中的一个以确定对象数据中的对应对象数据是无效数据对象;以及
134.避免读取无效数据对象。
135.条款11:如条款8所述的数据存储系统,其中,所述数据管理节点还被配置为:
136.读取对象头部以确定对象数据是有效对象数据;
137.确定有效对象数据对应于单个对象;
138.级联有效对象数据;以及
139.将有效对象数据作为单个对象写入驱动器。
140.条款12:如条款8所述的数据存储系统,其中,所述数据管理节点还被配置为:
141.将对象数据暂存到持久性存储器中的连续缓冲器中;
142.确定连续缓冲器已经达到阈值;以及
143.将与对象数据相对应的数据顺序地写入驱动器。
144.条款13:如条款8所述的数据存储系统,其中,所述数据管理节点还被配置为:
145.确定所述对象头部中的一个具有被设置为长的属性;以及
146.将所述对象头部中的一个暂存在持久性存储器中的活动块中,并将活动块写入驱动器;或者
147.直接将活动块写入驱动器。
148.条款14:如条款8所述的数据存储系统,其中,所述数据管理节点还被配置为:
149.确定所述对象头部中的一个具有被设置为短的属性;以及
150.将所述对象头部中的一个高速缓存在持久性存储器中。
151.条款15:一种在分布式对象存储系统上实现的非暂时性计算机可读介质,所述非暂时性计算机可读介质具有计算机代码,所述计算机代码当在处理器上执行时实现由数据管理节点进行的数据存储的方法,所述方法包括:
152.识别分别对应于对象数据的对象头部;
153.将对象数据存储在分配的数据组块的一侧;以及
154.将对象头部存储在分配的数据组块的另一侧。
155.条款16:如条款15所述的非暂时性计算机可读介质,其中,所述计算机代码在由处理器执行时,还通过使数据管理节点执行以下操作来实现数据存储的方法:
156.删除或聚集对象数据,使得无效数据导致分配的数据组块被碎裂;
157.读取对象头部中的一个以确定对象数据中的对应对象数据是有效数据对象;以及
158.将有效数据对象移动到新分配的数据组块。
159.条款17:如条款15所述的非暂时性计算机可读介质,其中,所述计算机代码在由处理器执行时,还通过使数据管理节点执行以下操作来实现数据存储的方法:
160.读取对象头部中的一个以确定对象数据中的对应对象数据是无效数据对象;以及
161.避免读取无效数据对象。
162.条款18:如条款15所述的非暂时性计算机可读介质,其中,所述计算机代码在由处理器执行时,还通过使数据管理节点执行以下操作来实现数据存储的方法:
163.读取对象头部以确定对象数据是有效对象数据;
164.确定有效对象数据对应于单个对象;
165.级联有效对象数据;以及
166.将有效对象数据作为单个对象写入驱动器。
167.条款19:如条款15所述的非暂时性计算机可读介质,其中,所述计算机代码在由处理器执行时,还通过使数据管理节点执行以下操作来实现数据存储的方法:
168.将对象数据暂存到持久性存储器中的连续缓冲器中;
169.确定连续缓冲器已经达到阈值;以及
170.将与对象数据相对应的数据顺序地写入驱动器。
171.条款20:如条款15所述的非暂时性计算机可读介质,其中,所述计算机代码在由处理器执行时,还通过使数据管理节点执行以下操作来实现数据存储的方法:
172.确定对象头部中的一个具有被设置为短的属性;以及
173.将所述对象头部中的一个高速缓存在持久性存储器中。
174.在说明书中,出于解释的目的,许多具体细节提供了对各种实施例的透彻理解。然而,显而易见的是,可以在没有这些具体细节或具有一个或多个等效布置的情况下实践各种实施例。在其他实例中,以框图形式示出了公知的结构和设备,以避免不必要地模糊各种实施例。
175.本文使用的术语仅用于描述特定实施例的目的,并不旨在限制本公开。如本文所使用的,单数形式旨在也包括复数形式,除非情境另有明确说明。将进一步理解,术语“由

组成(comprises)”、“具有(have)”、“包括(includes)”当在本说明书中使用时,指定所述特征、整数、步骤、操作、元件和/或组件的存在,但不排除一个或多个其他特征、整数、步骤、操作、元件、组件和/或其组的存在或添加。如本文所使用的,术语“和/或”包括相关联的所列项目中的一个或多个的任何和所有组合。
176.当可以不同地实现某个实施例时,可以与所描述的顺序不同地执行特定的处理顺序。例如,两个连续描述的过程可以基本上同时执行或者以与所描述的顺序相反的顺序执行。
177.根据本文描述的本公开的实施例的电子或电气设备和/或任何其他相关设备或组件可以利用任何合适的硬件、固件(例如,专用集成电路)、软件或软件、固件和硬件的组合来实现。举例来说,这些设备的各种组件可以形成于一个集成电路(ic)芯片上或单独ic芯片上。此外,这些设备的各种组件可以在柔性印刷电路膜、载带封装(tcp)、印刷电路板(pcb)上实现,或者形成在一个基板上。此外,这些设备的各种组件可以是在一个或多个计算设备中的一个或多个处理器上运行的进程或线程,其执行计算机程序指令并与其他系统
组件交互以执行本文描述的各种功能。计算机程序指令存储在存储器中,该存储器可以使用标准存储器设备(诸如,作为示例,随机存取存储器(ram))在计算设备中实现。计算机程序指令还可以存储在其他非暂时性计算机可读介质中,诸如,作为示例,cd-rom、闪速存储器驱动器等。此外,本领域技术人员应当认识到,在不脱离本公开的实施例的精神和范围的情况下,各种计算设备的功能可以组合或集成到单个计算设备中,或者特定计算设备的功能可以分布在一个或多个其他计算设备上。
178.除非另有定义,否则本文使用的所有术语(包括技术和科学术语)具有与本发明构思所属领域的普通技术人员通常理解的含义相同的含义。将进一步理解的是,诸如在常用词典中定义的那些术语应当被解释为具有与其在相关领域和/或本说明书的情境中的含义一致的含义,并且不应当以理想化或过于正式的意义来解释,除非在本文中明确地如此定义。
179.本文已经公开了实施例,并且尽管采用了特定术语,但是它们被使用并且仅在一般和描述性意义上被解释,而不是为了限制的目的。在一些情况下,如本领域普通技术人员在提交本技术时将显而易见的,除非另有说明,否则结合特定实施例描述的特征、特性和/或元件可以单独使用或与结合其他实施例描述的特征、特性和/或元件组合使用。因此,本领域技术人员将理解,在不脱离如所附权利要求中阐述的本公开的精神和范围的情况下,可以进行形式和细节上的各种改变,其中包括其功能等同物。
180.第ii部分
181.用于数据版本化和快照的系统和方法
182.本说明书的“第ii部分”中的文本,包括任何附图标记或字符以及对附图的任何引用,参考并对应于具有标签“第ii部分”的图6-14,并且不参考或对应于第i、第iii或第iv部分中的文本,也不参考或对应于附图页上具有标签“第i”、“第iii”或“第iv”的任何附图标记、字符或具有标签的附图。也就是说,本说明书中的部分i-iv中的每一个应当分别在相同部分中的对应描述和用相同部分标记的附图的情境中解释。然而,尽管如此,各个部分的各个方面和发明构思可以应用于其他部分的各方面和发明构思。
技术领域
[0183][0184]
本公开的实施例的各方面涉及数据存储系统,包括用于数据版本化和快照的系统和方法。
背景技术
[0185][0186]
通常,数据存储系统(诸如文件系统)的各方面经由快照(snapshot)或文件版本化(versioning)保护免受数据丢失。快照在系统范围的基础上提供文件系统的时间点映像。文件版本化通过在逐个文件的基础上保存文件的先前版本来提供保护。
发明内容
[0187]
[0188]
本公开的实施例的各方面涉及高效的始终在线文件或对象版本化和快照,其通过组合文件(或对象)版本化和快照实现来提供针对数据存储系统中的数据丢失的保护,以提供连续的数据保护和基于快照的保护。快照方面在特定时间点提供数据(例如,文件系统)的一致视图。文件或对象版本化方面允许恢复在不同快照之间对文件或对象做出的任何改变。两者对于数据存储系统是本机的,例如,在实施例被实现为文件系统的情况下,对于文件系统是本机的。
[0189]
根据本公开的一个实施例,一种用于存储数据版本的方法包括:由连接到存储设备的存储控制器接收包括一个或多个数据组块和数据访问标识符的写入命令;由存储控制器将一个或多个数据组块写入存储设备中的一个或多个对应位置;以及由存储控制器更新与数据访问标识符相关联的版本日志,以添加版本条目,版本条目包括指向存储设备中存储所述一个或多个数据组块的一个或多个位置的指针。
[0190]
数据访问标识符可以识别要存储的新数据,并且版本条目可以是版本日志的第一条目。
[0191]
数据访问标识符可以标识先前存储的数据,版本条目可以包括指向存储设备中存储未被写入命令修改的、与数据访问标识符相关联的数据组块的一个或多个位置的指针,并且所述方法还可以包括由存储控制器将版本条目附接到版本日志。
[0192]
存储控制器还可以存储与数据访问标识符相关联的活动版本指针,活动版本指针标识对应于与数据访问标识符相关联的数据的当前版本的版本条目。
[0193]
所述方法还可以包括在将每个数据组块写入存储设备之前独立地压缩一个或多个数据组块中的每一个。
[0194]
根据本公开的一个实施例,一种用于读取数据的版本的方法包括:由连接到存储设备的存储控制器接收包括数据访问标识符的读取命令;由存储控制器从与数据访问标识符相关联的版本日志检索版本条目,版本条目标识存储设备中的一个或多个位置;由存储控制器从存储设备中的所述一个或多个位置读取一个或多个数据组块;以及由存储控制器返回与数据访问标识符相关联的一个或多个数据组块。
[0195]
读取命令还可以包括版本标识符,并且从版本日志检索版本条目可以包括识别对应于版本标识符的版本条目。
[0196]
读取命令可以省略版本标识符,并且从版本日志检索版本条目可以包括检索对应于版本日志的活动版本指针,其中,活动版本指针标识版本条目。
[0197]
可以单独地压缩一个或多个数据组块,并且该方法还可以包括单独地解压缩所述一个或多个数据组块。
[0198]
根据本公开的一个实施例,一种用于存储数据的版本和快照的方法包括:由连接到存储设备的存储控制器接收捕获快照的命令;由存储控制器生成快照id;由存储控制器将快照id存储为当前快照id;由存储控制器接收包括一个或多个数据组块和数据访问标识符的写入命令;由存储控制器生成具有当前快照id的数据访问标识符的快照条目;由存储控制器将快照条目附接到与数据访问标识符相关联的快照日志;由存储控制器将所述一个或多个数据组块写入存储设备中的一个或多个位置;以及由存储控制器响应于写入命令而更新与数据访问标识符相关联的版本日志以添加版本条目,所述版本条目包括指向存储设备中存储所述一个或多个数据组块的一个或多个位置的指针。
[0199]
快照条目可以包括在响应于写入命令而生成的版本条目之前的版本日志的一部分。
[0200]
快照日志可以包括先前快照条目,并且版本日志的一部分可以包括先前快照条目与响应于写入命令而生成的版本条目之间的版本条目。
[0201]
该方法还可以包括:由存储控制器接收用于基于快照条目生成克隆的命令;以及由存储控制器添加具有识别快照条目的父指针的分支可写头部。
[0202]
该方法还可以包括:由存储控制器接收捕获第二快照的命令;由存储控制器生成第二快照id;由存储控制器将第二快照id存储为当前快照id;由存储控制器接收包括一个或多个第二数据组块和第二数据访问标识符的第二写入命令;由存储控制器生成具有当前快照id的数据访问标识符的第二快照条目;由存储控制器将第二快照条目附接到与数据访问标识符和分支可写头部相关联的快照日志,所述第二快照条目具有识别快照条目的父指针;由存储控制器将所述一个或多个数据组块写入存储设备中的一个或多个第二位置;以及由存储控制器响应于写入命令而更新与数据访问标识符相关联的版本日志以添加第二版本条目,所述版本条目包括指向存储设备中存储所述一个或多个第二数据组块的一个或多个第二位置的第二指针。
[0203]
根据本公开的一个实施例,一种用于基于快照读取数据版本的方法包括:由连接到存储设备的存储控制器接收包括数据访问标识符和所请求的快照标识符的读取命令;由存储控制器检索与数据访问标识符相关联的快照日志;由存储控制器从快照日志检索具有小于或等于所请求的快照标识符的最大快照标识符的快照条目;由存储控制器从快照条目检索版本条目,所述版本条目包括指向存储设备中的一个或多个位置的指针;以及由存储控制器从版本条目中识别的所述一个或多个位置检索一个或多个数据组块,所述一个或多个数据组块对应于与所请求的快照标识符处的数据访问标识符相关联的数据版本。
[0204]
检索快照日志可以包括识别与当前可写头部相对应的快照树的分支。
[0205]
快照条目可以包括与数据访问标识符相关联的版本日志的一部分。
[0206]
快照条目还可以包括识别版本日志中的第一版本条目的对象活动版本和识别版本日志中的第二版本条目的文件活动版本。
[0207]
数据访问标识符可以对应于对象标识符,并且检索版本条目可以包括检索由快照条目的对象活动版本识别的第一版本条目。
[0208]
数据访问标识符可以对应于文件标识符,并且检索版本条目可以包括检索由快照条目的文件活动版本识别的第二版本条目。
[0209]
根据本公开的一些实施例,包括处理器和存储器的系统可以被配置为实现根据任何上述实施例的存储控制器。
附图说明
[0210][0211]
附图与说明书一起示出了本发明的一些示例实施例的各方面,并且与描述一起用于解释本发明的原理。
[0212]
图6是根据本公开的一个实施例的存储系统的示意性框图。
[0213]
图7是描绘根据本发明的一个实施例的用于处理写入命令的方法的流程图。
[0214]
图8a是描绘根据本公开的一个实施例的多个组块中的文件和/或对象的数据存储装置以及所存储的文件或对象的版本与所存储的数据组块之间的指针的示意图。
[0215]
图8b是描绘根据本公开的一个实施例的对文件的相同组块的多次写入的情况的示意图。
[0216]
图8c是描绘根据本公开的一个实施例的替换与文件相关联的所有数据组块的写入的情况的示意图。
[0217]
图9是描绘根据本公开的一个实施例的用于基于文件版本从存储设备读取文件或对象的方法的流程图。
[0218]
图10是根据本公开的一个实施例的文件的快照日志的示意图。
[0219]
图11是描绘根据本公开的一个实施例的捕获容器的快照的方法的流程图。
[0220]
图12是描绘根据本公开的一个实施例的在已经捕获容器的快照之后执行写入操作的方法的流程图。
[0221]
图13是描绘根据本公开的一个实施例的从特定快照读取数据的方法的流程图。
[0222]
图14是根据本公开的一个实施例的快照树的示意图。
具体实施方式
[0223][0224]
在以下详细描述中,通过说明的方式仅示出和描述了本发明的某些示例实施例。如本领域技术人员将认识到的,本发明可以以许多不同的形式实施,并且不应被解释为限于本文阐述的实施例。相反,这些实施例是作为示例提供的,使得本公开将是彻底和完整的,并且将向本领域技术人员充分传达本公开的各方面和特征。因此,可以不描述本领域普通技术人员为了完全理解本公开内容的各方面和特征而不是必需的过程、元件和技术。除非另有说明,否则在整个附图和书面描述中,相同的附图标记表示相同的元件,因此,可以不重复其描述。
[0225]
本公开的实施例的各方面涉及用于基于文件或对象版本化和快照的数据保护的系统和方法。诸如文件系统的一些数据存储架构将数据存储在文件分层中,其中,数据存储在位于分层树结构(例如,目录或文件夹结构)内的文件中,并且由文件系统内的路径或文件路径唯一地识别。诸如对象存储系统(或“键值”存储系统)的一些数据存储架构存储与全局唯一标识符(有时称为“键”)相关联的数据(有时称为“值”、“对象”或“团块”)。
[0226]
这里将主要在为存储在文件系统内的文件中的数据提供版本化的情境中描述本公开的实施例的各方面。然而,本公开的实施例不限于此,并且还可以更一般地应用于存储在其他数据存储架构中存储的多个版本的数据,诸如提供存储在对象存储或键值存储中的对象的版本化。
[0227]
根据本公开的实施例的一些方面的始终在线(always-on)文件版本化针对系统中的非预期覆写进行保护。非预期覆写的示例包括由用户发起的更改或破坏一些信息的写入操作(例如,“保存”命令),并且本公开的实施例使得用户能够在一些实际约束内稍后复原或恢复覆写的信息。与在系统范围或分区基础上(例如,在文件系统基础上)提供保护的系统相比,本公开的实施例的一些方面在逐个文件的基础上提供保护。在一些实施例中,文件版本化被构建到数据管理系统中(例如,用于文件系统的驱动器和/或用于诸如网络附接存
储(nas)设备的存储设备的控制器),因为数据管理系统确保每个文件具有存储在系统中的至少一个先前版本。另外,本公开的实施例的一些方面涉及保持文件的先前版本的存储对用户透明,使得用户不需要明确地请求存储文件的新版本。在实施例的一些方面,文件的新版本的创建是非调度的(例如,版本不是在时间基础上(诸如每小时基础上)创建的),而是基于应用于文件的改变(例如,写入和/或附接)来创建的。此外,实施例的一些方面涉及通过在不同文件版本之间共享公共数据组块(例如,未改变的数据组块)来提高存储效率。
[0228]
除了文件版本化之外,本公开的实施例的一些方面涉及存储和读取在特定时间点(例如,调度的时间点或如用户所请求的)捕获的数据的快照。这些快照可以利用上面讨论的文件版本化系统来提高存储快照的副本和在不同快照之间共享数据的效率。
[0229]
图6是根据本公开的一个实施例的存储系统的示意性框图。如图6所示,根据本公开的实施例,存储控制器100被配置为执行各种操作,诸如文件和对象版本化和快照。在一些实施例中,存储控制器100包括处理器110和非暂时性计算机可读存储器120,其中,存储器120存储指令,该指令在由处理器执行时使处理器110执行下面更详细描述的专用操作。在本公开的各种实施例中,处理器110可以包括例如通用中央处理单元(cpu)、图形处理单元(gpu)、现场可编程门阵列(fpga)、专用集成电路(asic)等,或其组合。存储控制器100通过数据总线140连接到存储设备130,并且被配置为向存储设备130写入数据和从存储设备130读取数据。存储设备130可以是非易失性大容量存储设备,诸如固态驱动器(ssd)中的闪速存储器、硬盘驱动器(hdd)的磁存储器、非易失性双列直插式存储器模块(nvdimm)等。然而,本公开的实施例不限于此,并且还可以包括数据在被存留到非易失性存储器之前被临时存储或高速缓存在易失性存储器(例如,动态随机存取存储器(dram))中的情况。另外,本公开的实施例可以被实现为在一个或多个存储抽象层之上操作,该一个或多个存储抽象层提供对隐藏关于底层存储介质(例如,文件系统、固态驱动器的存储器控制器、诸如虚拟化块存储设备(例如,amazon弹性块存储)的虚拟化数据存储设备等)的细节的数据存储服务的更高级访问。
[0230]
此外,虽然存储控制器100被示出为单个集成模块,但是本领域技术人员将认识到,在不脱离本发明构思的精神和范围的情况下,存储控制器100的功能可以被细分为另外的子模块。
[0231]
存储控制器100可以连接到网络适配器150以通过网络连接(例如,以太网连接或无线连接)与外部设备通信,以通过诸如局域网(lan)和/或互联网的网络与其他计算设备通信。
[0232]
作为一个示例,由存储控制器100执行的操作可以被实现为操作系统的软件组件(例如,作为文件系统的驱动器)或用户空间数据存储系统,其中,处理器110和存储器120是诸如服务器的计算机系统的组件,并且,其中,操作系统和存储控制器在计算机系统上运行(无论是直接在处理器110和存储器120上还是通过硬件虚拟化层在虚拟机中)。存储控制器100可以被配置为向在计算机系统上本地运行的应用程序提供数据存储服务和/或使用一个或多个网络数据存储协议通过网络连接向远程计算机提供数据存储服务。作为另一示例,存储控制器100可以在专用存储设备(诸如可以经由一个或多个网络数据存储协议提供存储服务的网络附接存储(nas)设备)中以固件实现。网络数据存储协议的示例包括基于对象或基于键值的存储协议(例如,amazonweb服务简单存储服务(s3)、memcached、redis等)
或基于文件的存储协议(例如,网络文件系统(nfs)、服务器消息块(smb)等)。
[0233]
文件和对象版本化
[0234]
如上所述,本公开的实施例的一些方面涉及用于在逐个文件的基础上存储多个版本的数据的系统和方法。
[0235]
图7是描绘根据本发明的一个实施例的用于处理写入命令的方法200的流程图。
[0236]
图8a是描绘根据本公开的一个实施例的多个组块中的文件和/或对象的数据存储以及所存储的文件或对象的版本与所存储的数据组块之间的指针的示意图。
[0237]
如图8a所示,在时间t0处,并且根据操作210,存储控制器100可以接收写入命令310以写入包含数据组块a、b和c的具有数据访问标识符的文件(或对象)w,其中,完整文件或对象w的数据是块a、b和c的(有序)级联。例如,数据访问标识符w在文件系统中的文件的情况下可以是文件路径,或者在对象存储系统的情况下可以是唯一对象标识符或键。为了本文讨论的目的,块a、b和c中的每一个具有相同的大小,其中,通过根据本公开的实施例的存储控制器100写入和/或检索的任何数据被分成相同大小的一个或多个块(在一些实施例中,小于组块的大小或具有不是组块大小的倍数的大小的数据被填充以达到组块大小)。组块在本文也可以被称为“原子”或“原子对象”。在本公开的一些实施例中,每个组块的大小对应于存储设备130内的最小可寻址单元,诸如4千字节(kib)。例如,在使用闪速存储器的存储设备130的情况下,组块大小或原子对象大小可以对应于闪速存储器内的单个页(或整数个页)的大小(例如,常见的闪速存储器页大小包括4kib、8kib和16kib)。在一些实施例中,每个组块的大小独立于存储设备130内的最小可寻址单元。例如,在一些实施例中,组块可以具有256kib、512kib或1mib的大小。
[0238]
在操作250中,并且如图8a所示,存储控制器100将新添加的数据写入存储设备130中的一个或多个未使用的位置。一个或多个未使用的位置可以是被标记为空闲空间的位置(例如,闪速存储器的擦除块内的页),或者可以是被标记为被覆写的位置(例如,在存储控制器100自动回收较旧的备份副本的情况下,存储设备中存储较旧版本的数据组块的位置)。在一些情况下,数据组块可以分布在存储设备中的多个物理或逻辑位置上,诸如存储设备130不具有足够大的位置来存储整个组块的情况,或者组块由于冗余或性能原因而分布在多个存储介质上的情况(例如,独立磁盘冗余阵列(raid)中的条带化)。
[0239]
在操作270中,并且如图8a所示,存储控制器100更新与具有正被写入210的数据访问标识符w的文件(或对象)相对应的版本日志。版本日志可以是与由存储控制器100管理的数据相关联的元数据,并且可以存储在与数据相同的存储设备130上,或者可以存储在连接到存储控制器100的不同计算机可读存储器中。在创建新文件或对象的情况下,诸如图8a所示,存储控制器100为新文件或对象创建新版本日志320。版本日志存储一个或多个版本条目的有序集合,并且每个版本条目对应于文件或对象的不同版本。每个版本条目是指向组成文件的版本的数据组块的位置的指针的有序集合。在图8a所示的示例中,具有由数据访问标识符w识别的新写入文件的序列#0的版本条目由标识存储设备130内的对应组块a、b和c的位置的三个指针&a、&b和&c的有序列表表示。文件版本条目内的这些组块指针也可以利用它们的序列号0、0和0来标记。存储控制器100还可以维护标识文件或对象的当前版本的活动版本指针。在这种情况下,活动版本指针将版本条目#0识别为当前(且唯一)版本条目。在一些实施例中,存储控制器100对于不同的数据访问协议维护不同的活动版本指针,诸如
用于基于文件的访问协议(例如,nfs和smb)的文件活动版本指针和用于基于对象的访问协议(例如,s3)的对象活动版本指针。这使得存储控制器100能够符合各种数据访问协议的语义或行为。
[0240]
再次参考图8a,在稍后的时间t1,第二写入命令330由存储控制器100接收(操作210),其中,第二写入命令330指示修改,以用新数据组块c'替换数据组块c(例如,新数据组块c'在从文件的开始起以与先前组块c'相同的偏移处开始)。因此,在操作250中,存储控制器100将新数据组块c'写入存储设备130内的未使用位置(以“写入重定向”方式),并更新版本日志321以创建文件的新版本条目#1,该文件包含指向存储设备130中的原始组块a和b的位置的指针&a和&b,以及指向更新后的组块c'的位置的指针&c'。组块a和b的序列号保持相同(序列号0),并且更新后的组块c'的序列号增加到下一个可用的序列号(在这种情况下为序列号1)。活动版本指针也被更新以将版本条目#1标识为具有数据访问标识符w的文件的当前版本。
[0241]
仍然参考图8a,版本条目#0保留在更新的版本日志321中,并且指向原始组块a、b和c的位置的指针&a、&b、&c保持有效,这是因为那些数据组块保留在存储设备130中。另外,如图8a所示,由数据访问标识符w识别的文件的两个不同版本条目(版本#0和版本#1)是可用的,并且未修改的组块a和b不被复制。
[0242]
注意,由版本日志标识的位置(例如,&a、&b、&c和&c')不必指示存储设备130内的物理位置,而是指示由存储设备130呈现给存储控制器100的逻辑地址。例如,在执行垃圾收集以合并使用的页中的有效数据时,固态驱动器的控制器在其闪速存储器晶片内的不同物理位置之间周期性地移动数据,但是将数据的相同逻辑地址呈现给存储设备,如由存储设备的闪速存储器转换层(ftl)所维持的。
[0243]
在一些情况下,对同一文件的多个写入被捆绑或分组在一起,使得这些多个写入不创建多个版本。例如,可以基于打开和关闭文件(例如,调用c库函数fopen和fclose)或在发送到存储控制器100的显式文件刷新和/或文件关闭命令之间发生的写入的实例将写入捆绑在一起。
[0244]
图8b是描绘根据本公开的一个实施例的对文件的相同块的多次写入的情况的示意图。如图8b所示,在时间t2,执行第三写入命令350以利用新数据a'更新对应于组块a的数据组块(例如,在具有数据访问标识符w的文件的开始处的第一组块)。另外,在时间t3,存储控制器100接收第四写入命令370,以在使第三写入命令350和第四写入命令370被聚集的时段内写入具有数据存取标识符w和进一步修改的数据a”的相同的第一文件组块,随后是关闭命令390,以关闭与数据存取标识符w相关联的文件。
[0245]
在一些实施例中,如前所述,新数据a'被写入存储设备130中的新位置,并且具有数据访问标识符w的文件的新版本条目#2被创建并添加到版本日志322,其中,版本条目#2包含指向数据存储设备130中的组块a'、b和c'的位置的指针&a'、&b和&c'(为了清楚起见,图8b中未示出版本条目#0)。为了与各种数据访问协议的行为和语义一致,写入的数据(a')在经由基于文件的协议(例如,nfs)访问时立即可用,但是在处理关闭命令之前可能不可用于基于对象或基于键值的协议(例如,s3)。因此,如图8b所示,文件活动版本指针被更新为指向版本#2,并且对象活动版本指针保持在写入命令350之前的版本。在图8b所示的实施例中,组块a

的后续写入使得数据a

被写入存储设备130中的新位置。然而,因为组块a'和a

由存储控制器100聚集或合并(例如,因为在t2和t3之间没有接收到针对由标识符w标识的文件的基于文件的“关闭”命令),所以在两个写入已经完成之后(例如,在时间t3之后),只有最终组块a

被包括在版本日志323中,并且组块a'不出现在版本日志中。另外,在时间t3接收到关闭命令390。因此,存储控制器100还更新对象活动版本指针以将版本条目#2识别为与数据访问标识符w相关联的数据的当前版本(文件活动版本指针在时间t2已经被更新为版本#2)。注意,在执行写入命令370和执行关闭文件命令390之间,对象活动版本指针将仍然指向版本#1。因此,为了与基于文件和基于对象的语义一致,存储控制器100维护指向版本日志中的版本条目的单独的“文件活动版本”和“对象活动版本”指针。
[0246]
在一些实施例中,在时间t2和t3之间发生的对具有数据访问标识符w的文件的当前版本的读取命令(下面参考图9更详细地描述)返回数据a'、b、c'。在一些实施例中,在时间t2和t3之间发生的对由数据访问标识符w识别的文件的当前版本的读取命令将返回文件a、b、c'的先前版本(例如,因为直到不再可能聚集写入之后才可以设置文档的当前版本)。在一些实施例中,读取行为(例如,返回a、b、c'还是a'、b、c')取决于用于执行写入命令和读取命令的协议。例如,在一些实施例中,如果使用基于文件的操作(例如,nfs或smb)来执行写入命令350和370,并且使用基于文件的操作来执行读取命令,则基于文件的读取将返回a'、b、c'以便与标准的基于文件的访问语义(例如,诸如nfs或smb的基于文件的协议的行为)一致,但是如果使用基于文件的操作来执行写入命令350和370,并且使用基于对象或基于键值存储的操作(例如,amazon s3)来执行读取命令,则读取将返回先前的值a、b、c’。
[0247]
在一些实施例中,响应于接收到第四写入命令370,并不会如图8b所示将数据组块a”写入到新位置,而是用数据组块a”覆写响应于第三写入命令350的数据组块a'的先前写入。例如,在一些情况下,数据组块a'可以在被写入存储设备130之前被存储在写入缓冲器中,并且因此可用于在时间t2和时间t3之间通过读取命令读取。在一些情况下,数据在与组块a'相同的逻辑地址处被覆写(例如,其中,&a'和&a

指示存储设备130中的相同位置)。
[0248]
图8c是描绘根据本公开的一个实施例的替换与文件相关联的所有数据组块的写入的情况的示意图。如图8c所示,在时间t4,存储控制器100接收(例如,在操作210中)第五写入命令390以写入由标识符w识别的文件,其中,所有三个组块(例如,版本#0的原始组块a、b和c)被新组块a、b和c替换。因此,在操作250中,存储控制器100将新组块a、b和c写入存储设备130中的未使用位置,并且在操作270中,更新版本日志324以进一步包括包含指向存储设备130中的组块a、b和c的位置的指针&a、&b和&c的新版本条目#3,并且更新活动版本指针以将版本条目#3识别为表示由数据访问标识符w识别的文件的当前版本。与指针&a、&b和&c相关联的标识符被设置为下一可用的序列号(在这种情况下,序列#3)。
[0249]
因此,本公开的实施例的各方面涉及以存储高效的方式存储文件(或对象)的多个版本,诸如通过将对文件的不同组块的写入重定向到存储设备中的不同位置并维护文件的版本日志,其中,版本日志中的每个版本条目包括指向存储设备中的位置的指针的有序集合,所述位置包含与关联于数据访问标识符的特定数据版本相关联的数据组块。
[0250]
图9是描绘根据本公开的一个实施例的用于基于版本从存储设备读取文件或对象的方法400的流程图。在操作410中,存储控制器100接收具有数据访问标识符(例如,识别要读取的文件或对象)以及,可选地,版本标识符的读取命令。在一些情况下,读取命令可以省略要读取的文件的版本,在这种情况下,读取命令隐式地标识要读取的文件的当前或活动
版本。作为一个示例,参考图8c,在时间t5,读取命令395可以请求与由数据访问标识符w识别的文件的版本条目#2相关联的数据。
[0251]
在操作430中,存储控制器100确定读取命令是否包括版本标识符。如果是,则在操作450中,存储控制器100识别与要读取的文件相关联的版本日志,并从版本日志中检索所识别的版本条目。继续上述示例,存储控制器100从图8c所示的版本日志324检索所请求的版本条目#2。如图8c所示,版本条目#2包括指针&a”、&b和&c’。如果读取命令不包括版本标识符,则在操作460中,存储控制器100读取与当前活动版本(例如,如下面更详细讨论的,当前文件活动版本或当前对象活动版本)相对应的版本条目。
[0252]
在操作470中,存储控制器100在由来自版本日志的识别的版本条目(#2)的指针(&a”、&b和&c’)识别的位置处从存储设备130读取数据,并将读取的数据(数据组块a”、b和c’)返回到请求应用。
[0253]
因此,本公开的实施例的各方面提供了用于在存储设备中有效地存储和检索数据文件和/或对象的多个版本的系统和方法。
[0254]
数据压缩
[0255]
本公开的实施例的一些方面涉及以组块为基础的数据压缩。用于数据压缩的一些比较技术以文件为基础或以对象为基础执行数据压缩。在这些比较技术中,进行修改以选择文件或对象的部分或将数据附接到对象可能需要解压缩整个文件、写入附加数据以及重新压缩整个文件。
[0256]
相比之下,本公开的实施例的一些方面涉及在逐个组块的基础上独立地将数据压缩应用于每个组块(例如,其中,一个组块的压缩不受其他组块的压缩的影响)。通过这样做,存储控制器100能够读取或解压缩文件的单个组块而不解压缩其他组块,并且还能够通过仅重新压缩受影响的组块来写入文件的一部分,从而节省对不受应用于文件的写入命令影响的组块解压缩和重新压缩的计算代价。在一些实施例中,在子组块的基础上对每个组块独立地执行压缩,其中,每个组块被划分为子组块,并且,其中,子组块也被独立地压缩或解压缩。例如,在组块大小为256kib、512kib或1mib的情况下,每个子组块的大小可以是32kib。
[0257]
作为具体示例,并且返回参考图8a,假设第一写入命令310是以压缩形式写入数据组块a、b、c的命令。因此,存储控制器100将数据压缩算法(例如,霍夫曼编码、lempel-ziv(lz)压缩、bzip2、gzip等)分别应用于数据组块a、b、c中的每一个,并将压缩数据写入存储设备130。当接收到第二写入命令330以用组块c'替换组块c时,存储控制器100仅压缩新组块c'并将新组块c'写入存储设备130,而不解压缩组块a和b,并且不重新压缩组块a和b,因为组块c'的压缩独立于组块a和b的压缩。
[0258]
因此,通过以逐个组块为基础而不是以文件或对象为基础执行压缩,本公开的实施例通过避免文件或对象的未修改组块的解压缩和重新压缩来提供增加的计算效率。
[0259]
元数据共享
[0260]
本公开的实施例的一些方面还涉及在不同访问协议之间共享元数据,诸如本地文件系统(例如,ext4、btrfs、新技术文件系统(ntfs)等)、网络文件系统(nfs)、服务器消息块(smb)、亚马逊简单存储服务(s3)等。
[0261]
许多不同的文件系统和网络数据访问协议可以指定与经由这些协议访问的文件
或对象相关联地存储特定类型的元数据。这些元数据的示例包括:创建时间、修改时间、访问时间、到期时间(或生存时间(ttl))、数据大小、存储配额、用户访问许可等。
[0262]
这些元数据中的一些对于特定协议可以是唯一的。例如,对特定文件或对象的用户访问许可可以取决于对于特定数据访问协议(例如,smb服务器中的特定认证用户)是唯一的特定用户标识符集,因此必须为每个支持的协议存储这些唯一数据。
[0263]
另一方面,一些元数据对于由存储控制器100实现的多个协议(例如,所有协议)是共享的或共同的。在这些情况下,并非存储每个协议的共享元数据的单独副本,本公开的一些实施例涉及存储这些公共元数据的单个副本,并将来自这些协议中的每一个的对特定元数据的请求自动映射到数据的适当共享副本,并且如果需要,则将元数据自动转换为适当的格式。多个协议共有的元数据的示例包括:创建时间、修改时间和访问时间。变换的示例包括例如以秒对毫秒为单位的unix时间(或历元时间或posix时间)的时间表示、ntfs时间戳、时间和日期的国际标准化组织(iso)8601表示等之间的变换。
[0264]
拍快照
[0265]
本公开的实施例的一些方面涉及用于在特定时间点捕获存储在集合中的数据的快照(或“图像”)的系统和方法,所述集合诸如存储在存储设备130中的数据的根集合(例如,整个文件系统)或任何子树集合(例如,子目录或子文件夹或存储桶(bucket))。快照是图像在该特定时间点的只读副本。这允许在特定时间点一致地查看整个文件系统或文件系统的分支,从而使得更容易确定多个文件的哪些特定版本在特定快照的时间一起使用。
[0266]
根据本公开的一些实施例,存储控制器100使用三个设计构思来实现快照功能:快照id编号、快照日志和快照树。
[0267]
在本公开的一些实施例中,快照id编号是标识快照生成的单调递增的数字。最近捕获的快照比更早捕获的快照具有更大的快照id编号。快照id编号在每个根集合的基础上(即,命名空间、文件系统、存储桶等)被维护,并且每当在根集合中的任何地方创建快照时被递增(例如,增加1)。
[0268]
图10是根据本公开的一个实施例的文件的快照日志500的示意图。快照日志用于表示根据捕获的快照和/或文件版本化对文件或目录的所有修改。与数据访问标识符(例如,存储在系统中的每个文件或对象)或数据集合(例如,目录或存储桶)相关联的每个数据单元具有其自己的相关联的快照日志500。图10描绘了特定文件的快照日志500,包括具有快照id 1 510、快照id 5 550和快照id 8 580的三个快照。快照日志500捕获对不同快照之间(例如,快照id 1 510与快照id 5 550之间)的数据单元的修改。当且仅当当前适用的快照id(从快照树获得,如下面更详细地讨论的)与快照日志500中的最近条目不同时,将新条目添加到快照日志。数据单元的新快照(例如,在已经在快照日志中的快照之后捕获的)被附接到快照日志500(例如,添加到其末尾)。
[0269]
快照日志500中的每个条目(例如,条目或快照510、550和580)指定与写入的数据相关联的快照id以及如何检索该快照的数据。快照日志中没有两个条目具有相同的快照id。另外,在一些实施例中,当跨快照发生写入(修改)时,确切地创建一个新条目,而不管在中间可能已经创建了多少快照。
[0270]
更详细地,快照日志500中的每个条目包括版本阵列、文件活动版本指针和对象活动版本指针。如上所述,每个条目中的版本阵列对应于为每个文件维护的版本阵列的一部
分(或切片),其中,每个快照的版本阵列包括先前快照条目(例如,下一个较低编号的快照)(如果有的话)与下一个快照条目(如果有的话)之间的文件的所有版本。例如,考虑由数据访问标识符w标识的给定文件的快照日志500,快照550的版本阵列(具有快照id 5)包括具有数据访问标识符w的文件的版本阵列中的、在捕获先前快照510(具有快照id 1)之后创建的所有版本,直到在创建下一个快照580(具有快照id 8)之前具有数据访问标识符w的文件的最后一个版本为止。给定快照条目的对象活动版本指针和文件活动版本指针指示与该快照条目相关联的版本阵列内的特定版本,该特定版本在分别根据对象访问协议与文件访问协议被访问时将被默认读取。如上所述,可以基于不同协议的访问语义或行为来维护不同的活动版本指针。在上面给出的示例中,即使在nfs关闭操作被处理之前,nfs写入在后续nfs读取中立即可见,而这些写入对于对象(例如,s3)读取操作是不可见的,直到关闭操作已经被处理之后。另一方面,在使用基于对象的操作(例如,使用s3操作)执行对对象或文件w的写入的示例情况下,对文件的写入是不可见的,直到使用基于对象的关闭操作关闭文件。在这种情况下,文件活动版本指针和对象活动版本指针二者可以继续标识文件的先前版本,直到对文件处理基于对象的关闭操作为止。
[0271]
图11是描绘根据本公开的一个实施例的捕获容器的快照的方法600的流程图。在操作610中,存储控制器100接收快照请求,其可以识别特定集合(例如,根集合、诸如子目录的特定子集合、或对象的存储桶)。在操作630,存储控制器100生成新的快照id,诸如通过将1加到由存储控制器100使用的最高编号的快照id。在操作650中,存储控制器100将生成的快照id作为当前快照id存储在由快照请求标识的集合上。在一些实施例中,基本上不响应于接收到快照请求对任何快照日志或版本日志进行进一步的写入或修改。
[0272]
图12是描绘根据本公开的一个实施例的在已经捕获容器的快照之后执行写入操作的方法700的流程图。在本发明的实施例中,除了用于处置写入命令的操作(例如图7中所展示的方法200)之外,还可以执行图12中所展示的操作。如图12所示,在操作710中,存储控制器100接收写入命令310以写入具有数据访问标识符w的文件(或对象)。在操作730中,存储控制器100确定当前快照id(例如,如在图11的操作650中存储的)。在操作750中,存储控制器100基于快照id生成所识别的文件的快照条目,其中,快照条目包括从文件的快照日志中的最新条目起直到文件的当前版本(在处理当前写入命令之前)的版本日志的区域或切片。存储控制器100还可以为新快照条目生成对象活动版本指针和文件活动版本指针。在操作770中,存储控制器100将新生成的快照条目附接到写入命令所针对的识别的文件和/或对象的快照日志的末尾。然后,存储控制器100可以继续处理写入命令,诸如根据图7的方法200,包括将接收到的数据组块写入存储设备130并更新文件的版本日志。
[0273]
图13是描绘根据本公开的一个实施例的从特定快照读取数据的方法的流程图。在操作810中,存储控制器100接收请求读取出现在所请求的快照id处的文件和/或对象的读取命令。在操作830中,存储控制器100检索与由读取命令识别的文件和/或对象相对应的快照日志。
[0274]
在操作850中,存储控制器100从快照日志中检索与所请求的快照id相对应的快照条目。当快照日志包含与所请求的确切快照id匹配的快照条目时,则该匹配的快照条目作为对应的快照条目被返回。然而,在一些情况下,快照日志不包含确切匹配的条目(参见例如图10中所示的示例快照日志500,其中,不存在具有id 2、3、4、6或7的快照日志条目)。如
果是这种情况,则在具有下一最低快照id的条目与具有下一最高快照id的条目之间的快照之间不对文件进行写入(例如,再次参考图10,如果读取命令请求到快照id 3为止的与数据访问标识符w相关联的文件,则存储控制器100确定具有大于或等于所请求的快照id的最小快照id的快照条目是对应的快照条目-在这种情况下是具有id 5的快照条目510)。如果没有下一个最高快照id,则头部快照条目是匹配的快照条目。
[0275]
在操作870中,存储控制器100检索并返回由快照条目识别的文件的请求版本。例如,如果读取命令请求特定快照id处的文件,则存储控制器读取由存储在快照条目中的文件活动版本识别的文件版本。同样,如果读取命令请求特定快照id处的对象,则存储控制器读取由存储在快照条目中的对象活动版本识别的对象版本。在任一种情况下,存储控制器从由所识别的版本中的指针标识的位置读取组块,并将数据组块返回到请求应用。
[0276]
快照树
[0277]
本公开的实施例的一些方面涉及使用快照树来表示快照之间的快照关系或分层(即,基于何时拍摄快照)。在一些实施例中,已经拍摄一个或多个快照的每个集合具有快照树。
[0278]
图14是根据本公开的一个实施例的快照树900的示意图。图14所示的快照树900表示以下事件序列:
[0279]
可写(wr)snap 0表示列表的头部。头部是活动内容,并且总是在头部中找到任何对象的最新版本。
[0280]
当创建快照时,根集合的当前快照id编号递增1,并且在该示例中,表示只读(ro)snap 1的条目被添加到快照树900。
[0281]
稍后,创建根集合的另一个快照,并且根集合的当前快照id编号增加到2,从而在该快照树中产生ro snap 2。同样地,在稍后的时间,在ro snap 2之后从头部创建另一快照ro snap 3。
[0282]
然后将ro snap 3的可写克隆被创建为wr snap 4。创建可写克隆建立新的头部,并因此建立快照树的新分支。该新头部成为能够从其创建快照的附加点(例如,可以从由wr snap 0标识的第一头部或从由wr snap 4标识的第二头部进行改变)。
[0283]
在图14所示的示例中,ro snap 5是从第一头部创建的。
[0284]
然后从第二头部wr snap 4创建ro snap 6,接着也从在wr snap 4处的第二头部创建ro snap 7和ro snap 8。
[0285]
从图14的示例可以看出,快照树提供关于以下的信息:为快照集合创建的快照之间的关系;以及可应用于该集合及其子集合的最近快照id。在图14的示例中,wr snap 0的最高可用快照id是5,并且wr snap 4的最高可用快照id是快照id 8。
[0286]
当创建快照条目时,该信息是重要的,其中,新创建的快照条目包括识别其直接父快照条目的父指针,以便维护关于不同快照条目之间的父子关系的信息。
[0287]
当基于所请求的快照id检索对应条目时(例如,在图13的操作850中),基于特定可写头部执行搜索,并且仅通过在与特定可写头部相关联的快照树的特定分支中包含的特定快照条目来执行搜索。因此,在一些实施例中,当检索或识别与特定数据访问标识符相关联的快照日志时(例如,在操作830中),通过识别与关联于特定头部的快照树的特定分支相关联的快照条目来检索与数据访问标识符相关联的快照日志。
[0288]
例如,当基于第一可写头部(wr snap 0)请求到特定快照id为止的文件时,快照树的相关分支仅包含条目ro snap 5、ro snap 3、ro snap 2和ro snap 1。不考虑另一分支(ro snap 8、ro snap 7和ro snap 6)中的快照条目,因为它们是快照树的不同分支的成员。因此,检索到的快照日志将包括条目ro snap 5、ro snap 3、ro snap 2和ro snap 1。
[0289]
同样地,当基于第二可写头部(wr snap 4)请求到特定快照id为止的文件时,将考虑快照ro snap 8、ro snap 7和ro snap 6,以及快照树的共享部分,包括快照ro snap 3、ro snap 2和ro snap 1。然而,在wr snap 4处创建克隆之后创建的ro snap 5将不被认为是快照日志的一部分。因此,检索到的快照日志将包括条目ro snap 8、ro snap 7、ro snap 6、ro snap 3、ro snap 2和ro snap 1。
[0290]
因此,如上所述,本公开的实施例的各方面提供:在逐个文件的基础上的文件的自动版本化,并且仅在文件改变(不基于时间)时进行版本化,包括整个文件系统或文件系统的分支的时间点快照以及文件版本化;有效使用存储空间,因为文件的内容可以在快照和文件的特定版本之间共享,或者在快照和另一个快照之间共享,或者在文件的不同版本之间共享;以及存储在存储设备上的数据的高效压缩。
[0291]
根据本公开的一个或多个实施例可以包括以下条款中的一个或多个的一个或多个特征(但实施例不限于此):
[0292]
条款1:一种用于存储数据版本的方法,包括:
[0293]
由连接到存储设备的存储控制器接收包括一个或多个数据组块和数据访问标识符的写入命令;
[0294]
由存储控制器将一个或多个数据组块写入存储设备中的一个或多个对应位置;以及
[0295]
由存储控制器更新与数据访问标识符相关联的版本日志,以添加版本条目,版本条目包括指向存储设备中存储所述一个或多个数据组块的一个或多个位置的指针。
[0296]
条款2:如条款1所述的方法,其中,所述数据访问标识符标识要存储的新数据,并且
[0297]
其中,所述版本条目是版本日志的第一条目。
[0298]
条款3:如条款1所述的方法,其中,数据访问标识符标识先前存储的数据,
[0299]
其中,版本条目包括指向存储设备中存储未被写入命令修改的与数据访问标识符相关联的数据组块的一个或多个位置的指针,并且
[0300]
其中,所述方法还包括由存储控制器将版本条目附接到版本日志。
[0301]
条款4:如条款1所述的方法,其中,所述存储控制器还存储与数据访问标识符相关联的活动版本指针,活动版本指针识别对应于与数据访问标识符相关联的数据的当前版本的版本条目。
[0302]
条款5:如条款1所述的方法,还包括在将每个数据组块写入存储设备之前独立地压缩一个或多个数据组块中的每一个。
[0303]
条款6:一种用于读取数据的版本的方法,包括:
[0304]
由连接到存储设备的存储控制器接收包括数据访问标识符的读取命令;
[0305]
由存储控制器从与数据访问标识符相关联的版本日志检索版本条目,所述版本条目标识存储设备中的一个或多个位置;
[0306]
由存储控制器从存储设备中的所述一个或多个位置读取一个或多个数据组块;以及
[0307]
由存储控制器返回与数据访问标识符相关联的一个或多个数据组块。
[0308]
条款7:如条款6所述的方法,其中,读取命令还包括版本标识符,并且
[0309]
其中,从版本日志检索版本条目包括识别对应于版本标识符的版本条目。条款8:如条款6所述的方法,其中,读取命令省略版本标识符,并且
[0310]
其中,从版本日志检索版本条目包括检索对应于版本日志的活动版本指针,其中,活动版本指针标识版本条目。
[0311]
条款9:如条款6所述的方法,其中,所述一个或多个数据组块被单独压缩,并且
[0312]
其中,所述方法还包括单独地解压缩所述一个或多个数据组块。
[0313]
条款10:一种用于存储数据的版本和快照的方法,包括:
[0314]
由连接到存储设备的存储控制器接收捕获快照的命令;
[0315]
由存储控制器生成快照id;
[0316]
由存储控制器将快照id存储为当前快照id;
[0317]
由存储控制器接收包括一个或多个数据组块和数据访问标识符的写入命令;
[0318]
由存储控制器生成具有当前快照id的数据访问标识符的快照条目;
[0319]
由存储控制器将快照条目附接到与数据访问标识符相关联的快照日志;
[0320]
由存储控制器将一个或多个数据组块写入存储设备中的一个或多个位置;以及
[0321]
由存储控制器响应于写入命令而更新与数据访问标识符相关联的版本日志以添加版本条目,版本条目包括指向存储设备中存储所述一个或多个数据组块的一个或多个位置的指针。
[0322]
条款11:如条款10所述的方法,其中,快照条目包括在响应于写入命令而生成的版本条目之前的版本日志的一部分。
[0323]
条款12:根据条款11所述的方法,其中,快照日志包括先前快照条目,并且
[0324]
其中,版本日志的所述一部分包括先前快照条目与响应于写入命令而生成的版本条目之间的版本条目。
[0325]
条款13:如条款10所述的方法,还包括:
[0326]
由存储控制器接收基于快照条目生成克隆的命令;以及
[0327]
由存储控制器添加具有标识快照条目的父指针的分支可写头部。
[0328]
条款14:如条款13所述的方法,还包括:
[0329]
由存储控制器接收捕获第二快照的命令;
[0330]
由存储控制器生成第二快照id;
[0331]
由存储控制器将第二快照id存储为当前快照id;
[0332]
由存储控制器接收包括一个或多个第二数据组块和第二数据访问标识符的第二写入命令;
[0333]
由存储控制器生成具有当前快照id的数据访问标识符的第二快照条目;
[0334]
由存储控制器将第二快照条目附接到与数据访问标识符和分支可写头部相关联的快照日志,所述第二快照条目具有标识快照条目的父指针;
[0335]
由存储控制器将一个或多个数据组块写入存储设备中的一个或多个第二位置;以

[0336]
由存储控制器响应于写入命令而更新与数据访问标识符相关联的版本日志以添加第二版本条目,所述版本条目包括指向存储设备中存储所述一个或多个第二数据组块的一个或多个第二位置的第二指针。
[0337]
条款15:一种用于基于快照读取数据的版本的方法,包括:
[0338]
由连接到存储设备的存储控制器接收包括数据访问标识符和所请求的快照标识符的读取命令;
[0339]
由存储控制器检索与数据访问标识符相关联的快照日志;
[0340]
由存储控制器从快照日志检索具有小于或等于所请求的快照标识符的最大快照标识符的快照条目;
[0341]
由存储控制器从快照条目检索版本条目,所述版本条目包括指向存储设备中的一个或多个位置的指针;以及
[0342]
由存储控制器从版本条目中识别的一个或多个位置检索一个或多个数据组块,所述一个或多个数据组块对应于与所请求的快照标识符处的数据访问标识符相关联的数据版本。
[0343]
条款16:如条款15所述的方法,其中,检索快照日志包括识别与当前可写头部相对应的快照树的分支。
[0344]
条款17:如条款15所述的方法,其中,快照条目包括与数据访问标识符相关联的版本日志的一部分。
[0345]
条款18:如条款17所述的方法,其中,快照条目还包括标识版本日志中的第一版本条目的对象活动版本和标识版本日志中的第二版本条目的文件活动版本。
[0346]
条款19:如条款18所述的方法,其中,数据访问标识符对应于对象标识符,并且
[0347]
其中,检索版本条目包括检索由快照条目的对象活动版本标识的第一版本条目。
[0348]
条款20:如条款18所述的方法,其中,数据访问标识符对应于文件标识符,并且
[0349]
其中,检索版本条目包括检索由快照条目的文件活动版本标识的第二版本条目。
[0350]
条款21:一种包括处理器和存储器的系统,其被配置为实现根据条款1-20中任一项的存储控制器。
[0351]
在一些实施例中,上面讨论的存储控制器100在一个或多个处理器中实现。术语处理器可以指示一个或多个处理器和/或一个或多个处理核。一个或多个处理器可以托管在单个设备中或分布在多个设备上(例如,通过云系统)。处理器可以包括例如专用集成电路(asic)、通用或专用中央处理单元(cpu)、数字信号处理器(dsp)、图形处理单元(gpu)、诸如现场可编程门阵列(fpga)的可编程逻辑器件。在处理器中,如本文中所使用,每一功能由被配置(即,硬连线)为执行所述功能的硬件执行,或由被配置为执行存储于非暂时性存储介质(例如,存储器)中的指令的更通用硬件(例如cpu)执行。处理器可以制造在单个印刷电路板(pcb)上或分布在若干互连的pcb上。处理器可以包含其他处理电路;例如,处理电路可以包括在pcb上互连的两个处理电路,fpga和cpu。
[0352]
应当理解,尽管本文可以使用术语“第一”、“第二”、“第三”等来描述各种元件、组件、区域、层和/或部分,但是这些元件、组件、区域、层和/或部分不应受这些术语的限制。这些术语仅用于将一个元件、组件、区域、层或部分与另一个元件、组件、区域或部分区分开。
因此,在不脱离本发明构思的精神和范围的情况下,本文讨论的第一元件、组件、区域或部分可以被称为第二元件、组件、区域或部分。
[0353]
本文使用的术语仅用于描述特定实施例的目的,并不旨在限制本发明构思。如本文所用,术语“基本上”、“约”和类似术语用作近似术语而不是程度术语,并且旨在考虑本领域普通技术人员将认识到的测量或计算值的固有偏差。
[0354]
如本文所使用的,单数形式旨在也包括复数形式,除非情境另有明确说明。将进一步理解,当在本说明书中使用时,术语“包括”和/或“包含”指定所述特征、整数、步骤、操作、元件和/或组件的存在,但不排除一个或多个其他特征、整数、步骤、操作、元件、组件和/或其组合的存在或添加。如本文所使用的,术语“和/或”包括相关联的所列项目中的一个或多个的任何和所有组合。诸如
“……
中的至少一个”的表达在元素列表之后时修饰整个元素列表,而不修饰列表的各个元素。此外,在描述本发明构思的实施例时使用“可以”是指“本公开的一个或多个实施例”。此外,术语“示例性”旨在指示示例或说明。如本文所用,术语“使用”、“正在使用”和“已经使用”可以被认为分别与术语“利用”、“正在利用”和“已经利用”同义。
[0355]
虽然已经结合某些示例实施例描述了本发明,但是应当理解,本发明不限于所公开的实施例,而是相反,旨在覆盖包括在所附权利要求及其等同物的精神和范围内的各种修改和等同布置。
[0356]
第iii部分
[0357]
高度可缩放的分布式对象存储
[0358]
本说明书的“第iii部分”中的文本,包括任何附图标记或字符以及对附图的任何引用,参考并对应于具有标签“第iii部分”的图15-19,并且不参考或对应于第i、ii或iv部分中的文本,也不参考或对应于附图页上具有标签“第i”、“第ii”或“第iv”的任何附图标记、字符或具有标签的附图。也就是说,本说明书中的部分i-iv中的每一个应当分别在相同部分中的对应描述和用相同部分标记的附图的情境中解释。然而,尽管如此,各个部分的各个方面和发明构思可以应用于其他部分的各方面和发明构思。
技术领域
[0359][0360]
本公开的实施例的各方面总体涉及存储系统及其操作方法。
背景技术
[0361][0362]
对象存储系统将数据存储为可由提供对应对象标识符的应用访问的对象。与传统的块或文件存储系统不同,访问对象存储的应用不需要负责将其逻辑数据组织为一组固定大小的块或组织成如目录或文件的结构化组织,从而在给定对象标识符的情况下提供对数据的平坦访问。
[0363]
这种方法对于需要处理大量非结构化数据的应用是期望的。特别地,在分布式应用(例如,其中,许多数据管理节点在单个命名空间上工作的分布式应用)中,对象存储的优点可以通过分布式对象存储进一步增强,这是因为分布式对象存储能够提供能够随着应用
的需要而增长的可缩放存储装置。分布式应用的性能取决于在给定对象标识符的情况下,分布式对象存储能够多有效地服务数据。分布式对象存储的性能可以由以下因素确定:1)具有访问这些对象的一致读取/写入等待时间的能力,尤其是当分布式对象存储扩放时;2)在给定对象标识符的情况下有效地映射对象的能力;3)管理底层持久性存储以实现有效数据布局的能力。
[0364]
然而,为了在分布式对象存储中实现上述目的,会存在许多开销。例如,写入新对象或检索现有对象的能力涉及维护和更新映射表或其一些变体。这些表的大小能够随着分布式系统的规模增长而显著增长。维护巨大表的软件开销会很高。此外,在分布式系统中,该表也能够是分布式的,但是会导致同步该表的开销。此外,随着分布式对象存储系统扩展,性能受到影响。
[0365]
本背景技术部分中公开的上述信息仅用于增强对本公开的理解,因此其可以包含不形成本领域普通技术人员已知的现有技术的信息。
发明内容
[0366][0367]
本公开的实施例的各方面涉及分布式对象存储,其通过每个固态驱动器(ssd)和本地包含的映射具有单个线程来实现大规模并行性。即使在大规模分布式系统中,本地映射也很小,这意味着本地映射的树深度能够非常小,与分布式对象存储生成的键的数量成比例。因此,分布式对象存储可以在不同负载下维持性能的一致性。此外,分布式对象存储可以线性地缩放以用于读取和写入操作。
[0368]
根据本发明的一些实施例,提供了一种分布式数据存储的键值(kv)存储节点中的数据处理单元,所述数据处理单元包括:存储器,托管与对象存储相对应的命令队列和完成队列;以及处理器,耦接到固态驱动器(ssd)并且被配置为执行:从命令队列检索命令;基于命令生成输入/输出(i/o)情境;通过对象存储将命令异步地发布到ssd;识别来自ssd的成功命令完成信号;异步地更新与对象存储相对应的本地映射;以及通过将i/o情境公布到完成队列来确认命令完成。
[0369]
在一些实施例中,命令的源是分布式数据存储装置的数据管理器,并且命令对应于由数据管理器接收的应用i/o请求。
[0370]
在一些实施例中,命令队列和完成队列可由数据管理器访问。
[0371]
在一些实施例中,对象存储是被配置为管理ssd中的不可变数据的存储的不可变数据存储、被配置为管理ssd中的暂存数据的存储的暂存存储、或被配置为管理ssd中的元数据的存储的元数据存储,并且不可变数据存储、暂存存储和元数据存储具有彼此不同的特性。
[0372]
在一些实施例中,命令是put(放置)命令、append(附接)命令、overwrite(覆写)命令或erase(擦除)命令。
[0373]
在一些实施例中,i/o情境包括对象存储的标识、命令的类型、指向与命令相对应的对象的位置的指针以及命令的当前状态中的至少一个。
[0374]
在一些实施例中,基于命令生成i/o情境包括:从检索到的命令中识别对象id、对象存储的标识和命令的类型;以及基于本地映射和对象id来识别指向对象的位置的指针。
[0375]
在一些实施例中,数据处理单元还包括:验证i/o情境,其中,向ssd异步地发布命令是响应于i/o情境的验证。
[0376]
在一些实施例中,通过对象存储将命令异步地发布到ssd包括:将命令发布到ssd;以及在由ssd完成命令之前处理来自命令队列的另一命令。
[0377]
在一些实施例中,从ssd识别成功命令完成信号包括以下中的一个:针对成功命令完成信号轮询ssd;以及从ssd接收指示由ssd的成功完成命令的中断或回调函数。
[0378]
在一些实施例中,本地映射是包括不可变数据映射、暂存数据映射和元数据映射的多个映射中的一个,多个映射被存储在ssd处,其中,不可变数据映射包括存储在ssd处的不可变数据的对象id和不可变数据在ssd处的对应位置,其中,暂存数据映射包括存储在存储器处的暂存数据的对象id和暂存数据在存储器处的对应位置,并且,其中,元数据映射包括存储在ssd处的元数据的对象id和元数据在ssd处的对应位置。
[0379]
在一些实施例中,异步地更新本地映射包括:更新本地映射;以及在完成更新本地映射之前处理来自命令队列的另一命令。
[0380]
根据本发明的一些实施例,提供了一种分布式数据存储的键值(kv)存储节点中的数据处理单元,所述数据处理单元包括:存储器,托管与第一对象存储相对应的第一命令队列和第一完成队列,以及与第二对象存储相对应的第二命令队列和第二完成队列;以及处理器,耦接到固态驱动器(ssd)并且被配置为:通过以下操作来处理第一命令:从第一命令队列检索第一命令;基于第一命令生成第一输入/输出(i/o)情境;通过第一对象存储将第一命令异步地发布到ssd;以及异步地更新与第一对象存储相对应的第一本地映射;以及通过以下方式处理第二命令:从第二命令队列检索第二命令;基于第二命令生成第二i/o情境;通过第二对象存储将第二命令异步地发布到ssd;以及异步地更新与第二对象存储相对应的第二本地映射,其中,所述处理器被配置为独立地处理第一命令和第二命令。
[0381]
在一些实施例中,所述处理器被配置为在不访问第二本地映射的情况下处理第一命令,并且在不访问第一本地映射的情况下处理第二命令。
[0382]
在一些实施例中,第一本地映射具有与第二本地映射的树结构分离的树结构。
[0383]
在一些实施例中,第一命令队列不同于第二命令队列。
[0384]
根据本发明的一些实施例,提供了一种分布式数据存储的键值存储(kvs)节点,所述kvs节点包括:第一数据处理单元,包括:第一存储器,托管与第一对象存储相对应的第一命令队列;以及第一处理器,耦接到第一固态驱动器(ssd)并且被配置为执行:从第一命令队列检索第一命令;基于第一命令生成第一输入/输出(i/o)情境;通过第一对象存储将第一命令异步地发布到第一ssd;以及异步地更新与第一对象存储相对应的第一本地映射;以及第二数据处理单元,包括:第二存储器,托管与第二对象存储相对应的第二命令队列;以及第二处理器,耦接到第二ssd并且被配置为执行:从第二命令队列检索第二命令;基于第二命令生成第二i/o情境;通过第二对象存储将第二命令异步地发布到第二ssd;以及异步地更新与第二对象存储相对应的第二本地映射。
[0385]
在一些实施例中,第一ssd与第二ssd分离并且在第二ssd外部。
[0386]
在一些实施例中,kvs节点被配置为向分布式数据存储的数据管理器识别第一对象存储和第二对象存储。
[0387]
在一些实施例中,第一处理器被配置为通过将第一i/o情境公布到第一数据处理
单元的第一完成队列来向分布式数据存储装置的数据管理器确认第一命令的完成,第二处理器被配置为通过将第二i/o情境公布到第二数据处理单元的第二完成队列来向数据管理器确认第二命令的完成,并且第一完成队列和第二完成队列可由数据管理器访问。
附图说明
[0388][0389]
附图与说明书一起示出了本公开的示例实施例,并且与描述一起用于解释本公开的原理。
[0390]
图15是示出根据本公开的一些实施例的数据平台的框图。
[0391]
图16是根据本公开的一些实施例的键值(kv)存储节点的框图。
[0392]
图17是根据本公开的一些实施例的在kv存储节点的处理器上运行的kv软件栈的框图。
[0393]
图18是示出根据本公开的一些实施例的kv存储节点的线程化模型的框图。
[0394]
图19是示出根据本公开的一些实施例的由数据处理单元的处理器处理从数据管理器接收的命令的方法的流程图。
具体实施方式
[0395][0396]
下面阐述的详细描述旨在作为根据本公开提供的用于图像压缩、存储和解压缩的系统和方法的示例实施例的描述,并且不旨在表示可以构造或利用本公开的唯一形式。该描述结合所示实施例阐述了本公开的特征。然而,应当理解,相同或等同的功能和结构可以通过也旨在包含在本公开的范围内的不同实施例来实现。如本文其他地方所表示的,相同的元件编号旨在指示相同的元件或特征。
[0397]
图15是示出根据本公开的一些实施例的数据平台的框图。图16是根据本公开的一些实施例的键-值存储节点的框图。
[0398]
参考图15,根据一些实施例,数据平台10(也称为集群)是向应用和工作负载20提供可缩放分布式对象存储的并行数据计算机。数据平台10能够处理用于数据密集型工作负载(诸如认知人工智能(ai)、机器学习、高速显微镜、基因组测序、数据流应用等)的基于文件和对象的数据(此后称为对象)。在一些实施例中,数据平台包括多个数据管理器30(也称为数据管理节点)和对应的多个键值(kv)存储节点40。
[0399]
数据管理器30通过诸如nfs(网络文件系统)、smb(服务器消息块)、s3(简单存储服务)等接口向客户端应用20提供对数据存储装置的输入/输出(i/o)访问。当从应用20接收数据时,数据管理器30可以在跨一个或多个键存储节点分发数据之前对数据执行一个或多个操作,诸如增加数据弹性、将数据文件转换为对象、将接收到的数据分割成更小的对象(例如,原子对象)等。当数据正被应用20读取时,数据管理器30可以执行逆操作。
[0400]
当将大文件分割成多个较小对象(例如,原子对象)时,数据管理器30跟踪每个对象存储在何处。例如,当数据管理器30接收到对大数据文件(例如,1gb)的i/o请求时,数据管理器将文件转换成多个较小的对象(例如,1mb),并且跨不同的kv存储节点40分布对象(例如,每个对象被引导到不同的kv存储节点40)。通过将单个大i/o请求转换成大量(例如,
1000)原子i/o请求,数据管理器30在系统中产生实质并行性,这显著减少原始i/o请求的处理时间(例如,写入时间可减少2或3个数量级)。由该过程生成的元数据(其跟踪原子对象与原始文件的关系)可以存储为一个或多个元数据对象,作为适当数量的kv存储节点40中的存储(例如,通过节点40内的对应元数据存储)。数据管理器30控制并跟踪对象和相关联的元数据的分布。
[0401]
在一些实施例中,kv存储节点40将对象存储在固态驱动器(ssd)中并维护正在存储的数据的本地映射。因为kv存储节点40将映射表本地化到特定ssd,所以即使当分布式对象存储能够扩展以支持非常大的数据存储(例如,兆字节的存储)时,映射表的大小和复杂性也限于给定ssd。这里,小映射结构意味着树深度能够非常小,与由分布式对象存储生成的键的数量成比例。
[0402]
参考图16,根据一些实施例,kv存储节点40包括多个数据处理单元45,每个数据处理单元45包括耦接到ssd 60的处理器50以及存储器70。处理器50和ssd 60可以具有一对一的对应关系。每个处理器50可以运行由键值(kv)软件栈100表示的单个数据线程,并且可以访问(例如,写入/读取)单个ssd 60。根据一些实施例,每个处理器50托管针对不同类型的数据调整的多个键值存储(即,对象存储)。多个kv存储可以共享kv存储节点40中的持久性存储器。存储器70可以包括持久性存储器(例如,非易失性双列直插存储器模块(nvdimm))和易失性存储器(例如,动态随机存取存储器(dram))。处理器50可以包括运行数据线程的单个处理核(例如,多核cpu的)或多个核。当每个处理器50包括一组核时,该组中的单个核可以与ssd 60和数据管理器30通信,并且将其操作中的一些卸载到该组中的剩余核,其可以充当协处理核。在一些实施例中,每个ssd的映射操作对于对应的处理器/线程是本地的,并且每个处理器50完全独立于kv存储节点40和数据平台10中的其他处理器50操作。
[0403]
在一些实施例中,kv存储中的每一个通过集群范围的唯一存储id跨数据平台唯一地可识别。数据管理器30可以在设备发现阶段期间识别每个kvs节点40的所有kv存储,这可以例如在数据平台通电或重新启动时发生。一旦发现,数据管理器30就可以使用其唯一存储id将一个或多个对象(例如,一个或多个原子对象)发送到数据平台中的特定kv存储。
[0404]
图17是根据本公开的一些实施例的在处理器50上运行的kv软件栈100的框图。
[0405]
根据一些实施例,kv软件栈包括结构服务层102、存储层104、映射层106、盘区管理器108和ssd访问管理器层110。
[0406]
结构服务层102提供数据管理器30与包括处理器50的kv存储节点40之间的连接。结构服务层102可以接收包含(例如,包装)本地键值请求的命令分组(例如,nvme命令分组)。它将这些命令分组转换(例如,解包)为键值请求,并将键值请求发布到存储层104。类似地,结构服务层102从存储层104接收对键值请求的响应,并将它们包装在命令分组(例如,nvme命令分组)中以传输到数据管理器30。
[0407]
在一些实施例中,存储层104包括多个kv存储(也称为对象存储),每个kv存储具有其自己的特性并且被配置为管理不同类型的数据的存储装置。kv存储可以共享一组公共特性(例如,诸如get(获取)、put、erase的操作对于所有kv存储可以是公共的),并且可以具有多个个性化/不同设置的特性以改善(例如,加速)io请求的处理。除了呈现每个物理ssd(例如,nvme ssd)的键值存储之外,存储层104还被配置为根据存储在映射层106处的映射信息将从结构服务层102接收的本机键值请求转换为要发送到底层物理ssd 60的一个或多个块
请求(例如,nvme块请求)。存储层104利用存储器70(例如,持久性存储器,诸如nvdimm)来高速缓存和聚结(例如,聚集)块请求,以确保底层ssd 60(例如,块nvmessd)看到顺序写入业务。这可以帮助避免对ssd 60内的块的随机访问并且促进对大的大小的顺序写入,这能够整体上改善ssd 60和数据平台10的性能。
[0408]
根据一些实施例,存储层104中的多个kv存储包括不可变数据存储、暂存存储(例如,可变数据存储)和元数据存储。
[0409]
在一些实施例中,不可变数据存储被配置为存储不可变用户数据(例如,以不可变原子对象的形式)。不可变数据存储以一组kv对的形式在映射层106内维护不可变数据映射,每个kv对对应于存储在ssd 60处的不同对象。在一些示例中,不可变数据映射可以是用于有效存储、更新和检索对象id到物理位置映射的树状数据结构形式的数据结构,诸如b树/b 树。不可变数据映射中的每个kv对包括作为对应对象的对象标识符的键和作为指向ssd 60中的对应对象的物理位置的指针的值。该数据集中的kv对可能不会频繁改变并且具有长寿命。因此,由不可变数据存储管理的数据会主要受到读取请求的影响,并且很少被删除或被新值覆写。因此,不可变数据存储可以主要被配置用于(例如,调整/优化用于)读取、覆写和删除请求的处理,以及用于ssd容量的有效使用。不可变数据存储可以执行到ssd 60的大顺序写入。例如,该kv存储可以以64kb到1mb的单位写入。在一些示例中,不可变数据存储可以通过不支持诸如附接和覆写的操作来提高其i/o效率(例如,更低的i/o等待时间)。在一些示例中,不可变数据存储可以利用ssd 60的约90%的容量。
[0410]
在一些实施例中,暂存存储被配置为在中间数据(例如,可变对象)被最终确定并移动到不可变存储之前存储中间数据。暂存存储可以被配置(例如,优化)为在以下方面表现出高性能:(i)其通过聚集对对象数据的更新来处理对可变数据的改变的能力,以及(ii)其通过被调整用于处理这些操作的高效数据布局来维持针对多个可变操作的一致性能的能力。因此,暂存存储通过将可变数据集与不可变数据集分离并将分布式对象存储上的可变操作的处理本地化来帮助分布式对象存储的整体性能。
[0411]
根据一些示例,暂存存储可以使用ssd内的存储布局,该存储布局包括并利用持久性类存储器技术作为暂存存储的底层持久性存储。这样的持久性类存储器技术可以提供性能和字节可寻址性,其(i)使得客户端应用10和处理活动工作数据集的性能显著更高,并且(ii)减少对象存储中的底层存储的整体磨损。
[0412]
暂存存储中的每个kv对包括作为对应对象的对象标识符的键和作为指向存储器70中的对应对象的物理位置的指针的值。该数据集中的kv对(其包括正由应用20主动修改的数据)可以是频繁更新的小对象(例如,经由附接操作)。因此,暂存存储可以被配置为执行(例如,被调整/优化用于)诸如附接和覆写的操作。在一些实施例中,暂存存储维护对对象(例如,原子对象)进行的所有修改的日志。例如,每次要进行修改时,处理器50将改变附接到日志的末尾。当数据管理器30确定日志已经达到特定大小(即,日志大小超过大小阈值,诸如1mb)或者从开始日志起已经经过一定量的时间(即,经过的时间超过时间阈值)时,处理器50执行记录在日志中的动作/操作,清除日志,并将修改后的对象传递到不可变数据存储(也称为离台修改后的数据)。在没有暂存存储的情况下,当正修改原子对象时(例如,即使当正仅改变对象的几个比特时),必须从ssd读取原子对象,修改原子对象,然后将原子对象存储回ssd中。每次修改对象时必须重复该读写过程,这能够是耗时且非常低效的。因
此,暂存存储通过在对对象执行修改之前聚集对对象的修改来改善kv存储节点40和数据平台10的性能。在一些实施例中,暂存存储中的每个kv对对应于对象(例如,原子对象),其中,键是对象标识符,并且值是指向ssd中的暂存数据的位置的指针。
[0413]
根据一些实施例,元数据存储被配置为将频繁更新的元数据信息存储在ssd 60的一部分中,并且以kv对的形式维护元数据映射。元数据存储中的每个kv对包括作为对应对象的对象标识符的键和作为ssd 60中的对应对象的物理位置的指针的值。可以通过诸如覆写和附接的操作频繁地更新该数据集中的kv对。因此,该存储中的kv对的一些子集会是短暂的或高度易变的(例如,经历频繁的变化)。因此,元数据kv存储可以被配置用于(例如,调整/优化用于)数据易失性、小大小数据请求、附件类型请求等。例如,该kv存储可以以64字节为单位写入ssd 60至128kb。存储在元数据存储中的信息可以是内部生成的和/或外部生成的元数据。作为示例,当将大文件或对象分割成多个较小的原子对象时,内部生成的元数据可以由数据管理器30产生。用于拼接回数据的元数据信息可以存储在元数据存储中。作为另一示例,外部生成的元数据可以是与接收到的文件相关联的元数据,其用于管理文件。在一些示例中,处理器50可以将ssd 60的容量的大约5%分配给元数据存储。
[0414]
在一些实施例中,不可变数据映射、暂存数据映射和元数据映射中的每一个存储在ssd中。当被访问时,每个映射被放入易失性存储器(例如,dram)中,更新被累积并存储在持久性存储器(例如,nvdimm)中,然后在后台被缓慢地刷新到ssd 60。
[0415]
虽然图17示出了其中存储层104包括元数据存储、暂存存储和不可变数据存储的实施例,但是本公开的实施例不限于此。例如,存储层104可以包括任何数量和任何类型的kv存储,其针对给定应用或一组应用被适当调整。
[0416]
在数据平台10的设备发现阶段期间,kv存储节点40可以识别数据管理器30可用的kv存储(例如,不可变数据、暂存和元数据存储)。因此,当服务于客户端应用20时,数据管理器30知道每个kv存储节点40处有哪些kv存储。因此,当数据平台接收到应用数据时,数据管理器30能够将数据或数据的一部分(例如,以原子对象的形式)转发到对应的kv存储节点40处的适当kv存储。
[0417]
映射层106促进键值业务。在一些实施例中,映射层106包括由存储层104利用的多个高速映射(例如,不可变数据映射、暂存数据映射和元数据映射),以将本机对象标识符映射到ssd(例如,nvme块ssd)60处或存储器70(例如,当对象被高速缓存时)处存储对应对象的物理位置(例如,底层逻辑块地址(lba))。映射利用作为存储器70的一部分的持久性存储器(例如,nvdimm)来将更新作为日志记录到映射,高速缓存频繁的映射查找,并合并多个映射更新。该层被配置为支持有效的范围操作,包括获得指定范围内的所有键的列表(即,范围查询)、删除指定范围中的所有键(即,范围删除)等。范围操作可以通过减少要从ssd 60读取的闪存页的量来改进由数据管理器30提供的数据分布功能的操作。在一些实施例中,映射层106为每个kv存储创建单独的映射数据结构(例如,映射树),其被独立地持久化。通过具有单独的小映射结构(例如,不可变数据映射、暂存数据映射和元数据映射),映射结构的树深度能够非常小,与由分布式对象存储生成的键的数量成比例。
[0418]
根据一些示例,ssd盘区管理层108管理物理ssd 60上用于多个kv存储(例如,不可变数据存储、元数据存储和暂存存储)的空间分配,并且ssd访问管理层110管理nvme块驱动器112以向底层ssd发出块io请求。
[0419]
在一些示例中,处理器50利用命令队列120的集合来对由数据管理器30引导到kv存储中的每一个的命令(例如,读取和写入命令)进行排队,且利用完成队列122的对应集合来对来自kv存储的命令完成进行排队,所述命令完成向数据管理器30指示一或多个命令的完成。每个kv存储可以具有对应的一对命令队列120和完成队列122。处理器50还可以利用一个或多个nvme队列124来对被引导到对应ssd 60的传出nvme命令进行排队。在一些示例中,每个kv存储可以具有对应的nvme队列124,或者不同的kv存储可以共享公共nvme队列124。
[0420]
图18是示出根据本公开的一些实施例的kv存储节点40的线程化模型的框图。
[0421]
在一些实施例中,托管n个ssd的kv存储节点具有在n个不同处理器50上独立、并行且没有任何争用地运行的n个kv软件栈100。每个软件栈100具有其自己的专用处理器和存储器资源(也参见图16)。这允许在kv存储节点40内和跨kv存储节点40两者的性能的线性缩放。在一些示例中,kv存储节点40具有运行控制线程的第k 1个处理器,该控制线程跨在kv存储节点40上运行的不同线程控制和管理结构、kv存储系统和nvme驱动器。通过使用该线程模型,kv存储软件栈100是无锁的,其中,它在处理器50(例如,核或核的集合)上独立运行,而不必跨多个处理器50同步。这在访问对象时提供了一致的等待时间,而不管作为分布式对象存储的数据平台如何扩展。
[0422]
此外,kv存储节点40将映射表定位到特定ssd 60。在存在驻留在给定ssd中的多个kv存储的实施例中,映射表被本地化到该ssd内的特定存储。因此,即使当分布式对象存储可以扩展以支持非常大的数据存储(例如,兆字节的存储)时,映射表的大小和复杂性也限于给定的ssd。这减少或消除了在相关技术的解决方案中可能出现的竞争。例如,在元数据存储在具有其自己的专用ssd的单独的元数据服务器中的相关技术平台中,当访问不同的服务器时可能发生竞争。
[0423]
图19是示出根据本公开的一些实施例的由数据处理单元45的处理器50处理从数据管理器接收的命令的方法s500的流程图。
[0424]
根据一些实施例,数据管理器30使用存储的唯一存储id将命令发送到特定对象存储。对象存储可以是被配置为管理ssd 60中的不可变数据的存储的不可变数据存储、被配置为管理ssd 60中的暂存数据的存储的暂存存储、或者被配置为管理ssd 60中的元数据的存储的元数据存储。该命令可以是put命令、get命令、append命令、overwrite命令或erase命令。该命令可以由对应于存储id的命令队列120接收(例如,在其中排队)。
[0425]
对应于存储id的数据处理单元45的处理器50从命令队列检索命令(s502),并且基于命令生成输入/输出(i/o)情境(s504)。i/o情境可以包括存储id、命令的类型(例如,get、put、erase等)、指向对应于命令的对象的位置的指针以及命令的当前状态中的一个或多个。在一些示例中,处理器50可以从检索到的命令中识别与命令相对应的对象id、存储id和命令的类型,并且可以基于与存储id和对象id相对应的本地映射来识别指向对象的位置的指针。
[0426]
然后,处理器5进行验证以验证i/o情境(例如,以确保对象或对象id实际上存在于ssd 60或存储器70中),并且当i/o情境有效时,处理器50通过对象存储将命令异步地发布到ssd 60(s506)。通过异步地这样做,处理器50在进行到下一操作之前不等待ssd 60的命令完成,并且一旦命令被发布到ssd 60就开始下一操作。这里,通过利用与存储id相对应的
对象存储,处理器50受益于对象存储的特定特性(例如,小或大的写入大小、仅存在某些操作等),以改善命令的处理时间。
[0427]
处理器识别来自ssd 60的成功命令完成信号(s508)。在一些示例中,处理器50可以通过针对成功命令完成信号轮询ssd 60或者通过从ssd 60接收指示ssd成功命令完成的中断或回调功能来这样做。响应于识别成功命令完成信号,处理器异步地更新与对象存储相对应的本地映射(s510)。然后,处理器50通过将i/o情境公布到对应于存储id的完成队列122来确认命令完成(s512)。
[0428]
在一些示例中,数据管理器30可以发送引导向同一数据处理单元45内的不同对象存储的多个命令。举例来说,数据管理器30可以异步地将第一命令发送到同一数据处理单元45内的第一命令队列120且将第二命令发送到同一数据处理单元45内的第二命令队列120。这里,处理器50可以如上所述独立地处理每个命令,并且没有任何同步点(即,没有共享任何资源)。例如,处理器50可以在不访问与第二对象存储相对应的第二本地映射的情况下处理第一命令,并且在不访问与第一对象存储相对应的第一本地映射的情况下处理第二命令。通过使每个对象存储具有它们自己的本地映射,这意味着不存在为了访问映射而需要的同步点(例如,锁、互斥)。相比之下,具有共享资源的相关技术的多线程系统可以在对共享资源的任何访问之前需要同步点(例如,锁、互斥)。这通常需要大量的cpu周期,并且会降低整体性能。在一些实施例中,第一本地映射具有与第二本地映射的树结构分离的树结构。根据一些实施例,使用树状数据结构(例如,b 树)来实现所有不同的映射,并且每个存储具有其自己的映射实例,该映射实例仅包含对于该特定存储已知且相关的对象。
[0429]
在一些示例中,数据管理器30可以发送从不同数据处理单元45引导到不同对象存储的多个命令。举例来说,数据管理器30可以异步地将第一命令发送到第一数据处理单元45处的第一命令队列120,并将第二命令发送到第二数据处理单元45处的第二命令队列120。如前所述,与第一数据处理单元45中的第一命令队列120相关联的第一处理器50可以处理第一命令,并且与第二数据处理单元45中的第二命令队列120相关联的第二处理器50可以处理第二命令。由于每一数据处理单元的资源(例如,处理器50、ssd 60、本地映射等)与其它数据处理单元的资源完全分离(且例如在其外部),因此并行且彼此完全独立地处理两个命令。
[0430]
如本领域普通技术人员将理解的,可以在同一数据处理单元45内或甚至跨kvs节点40并行处理的命令的数量不限于两个,并且可以是任何合适的数量。
[0431]
因此,处理器50为每个ssd 60提供一致的等待时间。随着分布式系统中ssd的数量增加,处理器的数量也增加,从而确保一致的等待时间,因为这些处理器是独立的并且没有同步点。
[0432]
根据本公开的一个或多个实施例可以包括以下条款中的一个或多个的一个或多个特征(但实施例不限于此):
[0433]
条款1:一种分布式数据存储的键值(kv)存储节点中的数据处理单元,所述数据处理单元包括:
[0434]
a memory hosting a command
[0435]
存储器,托管与对象存储相对应的命令队列和完成队列;以及
[0436]
处理器,耦接到固态驱动器(ssd)并且被配置为执行:
[0437]
从命令队列检索命令;
[0438]
基于命令生成输入/输出(i/o)情境;
[0439]
通过对象存储将命令异步地发布到ssd;
[0440]
识别来自ssd的成功命令完成信号;
[0441]
异步地更新与对象存储相对应的本地映射;以及
[0442]
通过将i/o情境发布到完成队列来确认命令完成。
[0443]
条款2:如条款1所述的数据处理单元,其中,所述命令的源是分布式数据存储的数据管理器,并且,所述命令对应于由数据管理器接收的应用i/o请求。
[0444]
条款3:如条款2所述的数据处理单元,其中,所述命令队列和完成队列可由数据管理器访问。
[0445]
条款4:如条款1所述的数据处理单元,其中,所述对象存储是被配置为管理ssd中的不可变数据的存储的不可变数据存储、被配置为管理ssd中的暂存数据的存储的暂存存储、或被配置为管理ssd中的元数据的存储的元数据存储,并且
[0446]
其中,所述不可变数据存储、暂存存储和元数据存储具有彼此不同的特性。
[0447]
条款5:如条款1所述的数据处理单元,其中,所述命令是put命令、append命令、overwrite命令或erase命令。
[0448]
条款6:如条款1所述的数据处理单元,其中,所述i/o情境包括对象存储的标识、命令的类型、指向与命令相对应的对象的位置的指针以及命令的当前状态中的至少一个。
[0449]
条款7:如条款6所述的数据处理单元,其中,所述基于命令生成i/o情境包括:
[0450]
从检索到的命令中识别对象id、对象存储的标识和命令的类型;以及
[0451]
基于本地映射和对象id识别指向对象的位置的指针。
[0452]
条款8:如条款1所述的数据处理单元,还包括:
[0453]
验证i/o情境,
[0454]
其中,所述向ssd异步地发布命令是响应于i/o情境的验证。
[0455]
条款9:如条款1所述的数据处理单元,其中,所述通过对象存储将命令异步地发布到ssd包括:
[0456]
将命令发布到ssd;以及
[0457]
在由ssd完成命令之前,处理来自命令队列的另一命令。
[0458]
条款10:如条款1所述的数据处理单元,其中,从ssd识别成功命令完成信号包括以下中的一个:
[0459]
针对成功命令完成信号轮询ssd;以及
[0460]
从ssd接收指示由ssd成功完成命令的中断或回调函数。
[0461]
条款11:如条款1所述的数据处理单元,其中,所述本地映射是包括不可变数据映射、暂存数据映射和元数据映射的多个映射中的一个,所述多个映射存储在ssd处,
[0462]
其中,所述不可变数据映射包括存储在ssd处的不可变数据的对象id和不可变数据在ssd处的对应位置,
[0463]
其中,所述暂存数据映射包括存储在存储器处的暂存数据的对象id和暂存数据在存储器处的对应位置,并且
[0464]
其中,所述元数据映射包括存储在ssd处的元数据的对象id和元数据在ssd处的对
应位置。
[0465]
条款12:如条款1所述的数据处理单元,其中,所述异步地更新本地映射包括:
[0466]
更新本地映射;以及
[0467]
在完成更新本地映射之前处理来自命令队列的另一命令。
[0468]
条款13:一种分布式数据存储设备的键值(kv)存储节点中的数据处理单元,所述数据处理单元包括:
[0469]
存储器,托管与第一对象存储相对应的第一命令队列和第一完成队列以及与第二对象存储相对应的第二命令队列和第二完成队列;以及
[0470]
处理器,耦接到固态驱动器(ssd)并且被配置为:
[0471]
通过以下方式处理第一命令:
[0472]
从第一命令队列检索第一命令;
[0473]
基于第一命令生成第一输入/输出(i/o)情境;
[0474]
通过第一对象存储将第一命令异步地发布到ssd;以及
[0475]
异步地更新与第一对象存储相对应的第一本地映射;以及
[0476]
通过以下方式处理第二命令:
[0477]
从第二命令队列检索第二命令;
[0478]
基于第二命令生成第二i/o情境;
[0479]
通过第二对象存储将第二命令异步地发布到ssd;以及
[0480]
异步地更新与第二对象存储相对应的第二本地映射,
[0481]
其中,所述处理器被配置为独立地处理第一命令和第二命令。
[0482]
条款14:如条款13所述的数据处理单元,其中,所述处理器被配置为在不访问第二本地映射的情况下处理第一命令,并且在不访问第一本地映射的情况下处理第二命令。
[0483]
条款15:如条款13所述的数据处理单元,其中,所述第一本地映射具有与第二本地映射的树结构分离的树结构。
[0484]
条款16:如条款13所述的数据处理单元,其中,所述第一命令队列不同于第二命令队列。
[0485]
条款17:一种分布式数据存储的键值存储(kvs)节点,所述kvs节点包括:
[0486]
第一数据处理单元,包括:
[0487]
第一存储器,托管与第一对象存储相对应的第一命令队列;以及
[0488]
第一处理器,耦接到第一固态驱动器(ssd)并且被配置为执行:
[0489]
从第一命令队列检索第一命令;
[0490]
基于第一命令生成第一输入/输出(i/o)情境;
[0491]
通过第一对象存储将第一命令异步地发布到第一ssd;以及
[0492]
异步地更新与第一对象存储相对应的第一本地映射;以及
[0493]
第二数据处理单元,包括:
[0494]
第二存储器,托管与第二对象存储相对应的第二命令队列;以及
[0495]
第二处理器,耦接到第二ssd并且被配置为执行:
[0496]
从第二命令队列检索第二命令;
[0497]
基于第二命令生成第二i/o情境;
[0498]
通过第二对象存储将第二命令异步地发布到第二ssd;以及
[0499]
异步地更新与第二对象存储相对应的第二本地映射。
[0500]
条款18:如条款17所述的kvs节点,其中,所述第一ssd与第二ssd分离并且在第二ssd外部。
[0501]
条款19:如条款17所述的kvs节点,其中,所述kvs节点被配置为向分布式数据存储的数据管理器识别第一对象存储和第二对象存储。
[0502]
条款20:如条款17所述的kvs节点,其中,所述第一处理器被配置为通过将第一i/o情境发布到第一数据处理单元的第一完成队列来向分布式数据存储设备的数据管理器确认第一命令的完成,
[0503]
其中,所述第二处理器被配置为通过将第二i/o情境发布到第二数据处理单元的第二完成队列来向数据管理器确认第二命令的完成,并且
[0504]
其中,第一完成队列和第二完成队列可由数据管理器访问。
[0505]
这里,处理器50或“处理电路”可以包括用于处理数据或数字信号的硬件、固件和软件的任何组合。处理电路硬件可以包括例如专用集成电路(asic)、通用或专用中央处理单元(cpu)、数字信号处理器(dsp)、图形处理单元(gpu)、诸如现场可编程门阵列(fpga)的可编程逻辑器件。在处理电路中,如本文中所使用,每一功能由被配置(即,硬连线)为执行所述功能的硬件执行,或由被配置为执行存储于非暂时性存储介质中的指令的更通用硬件(例如cpu)执行。处理电路可以制造在单个印刷线路板(pwb)上或分布在若干互连的pwb上。处理电路可以包含其他处理电路;例如,处理电路可以包括在pwb上互连的两个处理电路,fpga和cpu。
[0506]
应当理解,尽管本文可以使用术语“第一”、“第二”、“第三”等来描述各种元件、组件、区域、层和/或部分,但是这些元件、组件、区域、层和/或部分不应受这些术语的限制。这些术语用于将一个元件、组件、区域、层或部分与另一个元件、组件、区域、层或部分区分开。因此,在不脱离本发明构思的范围的情况下,下面讨论的第一元件、组件、区域、层或部分可以被称为第二元件、部件、区域、层或部分。
[0507]
本文使用的术语是为了描述特定实施例的目的,而不旨在限制本发明构思。如本文所使用的,单数形式旨在也包括复数形式,除非情境另有明确说明。将进一步理解,当在本说明书中使用时,术语“包括”、“包含”和/或“由

组成”指定所述特征、整数、步骤、操作、元件和/或组件的存在,但不排除一个或多个其他特征、整数、步骤、操作、元件、组件和/或其组的存在或添加。如本文所使用的,术语“和/或”包括相关联的所列项目中的一个或多个的任何和所有组合。此外,在描述本发明构思的实施例时使用“可以”是指“本发明构思的一个或多个实施例”。此外,术语“示例性”旨在指示示例或说明。
[0508]
如本文所用,术语“使用”、“正在使用”和“已经使用”可以被认为分别与术语“利用”、“正在利用”和“已经利用”同义。
[0509]
出于本公开的目的,“x、y和z中的至少一个”和“选自由x、y和z组成的组中的至少一个”可以被解释为仅x、仅y、仅z,或者x、y和z中的两个或更多个的任何组合,诸如,作为示例,xyz、xyy、yz和zz。
[0510]
此外,当描述本发明构思的实施例时,“可以”的使用是指“本发明构思的一个或多个实施例”。此外,术语“示例性”旨在指示示例或说明。
[0511]
虽然已经具体参考本公开的说明性实施例详细描述了本公开,但是本文描述的实施例并不旨在穷举或将本公开的范围限制于所公开的确切形式。本公开所属领域和技术的技术人员将理解,在没有有意义地脱离如所附权利要求及其等同物中阐述的本公开的原理和范围的情况下,可以实践所描述的结构以及组装和操作方法的改变和变化。
[0512]
第iv部分
[0513]
用于管理集群文件系统中的度量的系统和方法
[0514]
本说明书的“第iv部分”中的文本,包括任何附图标记或字符以及对附图的任何引用,参考并对应于具有标签“第iv部分”的图20和图21,并且不参考或对应于第i-iii部分中的文本,也不参考或对应于附图页上具有标签“第i”、“第ii”或“第iii”的任何附图标记、字符或具有标签的附图。也就是说,本说明书中的部分i-iv中的每一个应当分别在相同部分中的对应描述和用相同部分标记的附图的情境中解释。然而,尽管如此,各个部分的各个方面和发明构思可以应用于其他部分的各方面和发明构思。
技术领域
[0515][0516]
根据本公开实施例的一个或多个方面涉及数据存储,并且更具体地,涉及一种用于管理集群文件系统中的度量的系统和方法。
背景技术
[0517][0518]
诸如磁盘使用或数据访问速率之类的度量在操作和管理诸如集群文件系统的文件系统时会是有用的。然而,收集这样的度量的一些方法可能是缓慢且繁重的。例如,通过检查文件系统的每个目录并对获得的总和求和来计算磁盘使用会是耗时的,从而导致在结果可用之前的显著延迟。此外,用于管理度量的某些方法会需要用于一些操作的系统范围锁定;这样的锁定会显著降低文件系统的性能。
[0519]
因此,需要一种用于管理集群文件系统中的度量的系统和方法。
发明内容
[0520][0521]
根据本公开的实施例,提供了一种用于跟踪集群文件系统中的度量的方法,所述集群文件系统包括多个目录,所述方法包括:确定针对多个目录中的第一目录的第一度量满足第一报告准则;以及向多个目录中的第二目录报告针对第一目录的第一度量的更新,所述第一目录是第二目录的子目录。
[0522]
在一些实施例中:集群文件系统还包括多个节点,并且,目录中的每一个具有来自多个节点中的主要所有者节点。
[0523]
在一些实施例中,报告包括由第一节点向第二节点发送针对第一度量的更新,第一节点是第一目录的主要所有者节点,并且第二节点是第二目录的主要所有者节点。
[0524]
在一些实施例中,报告还包括由第一节点计算第二节点的节点标识符,该计算包括计算第二目录的名称的散列。
[0525]
在一些实施例中,该方法还包括从第一节点的父高速缓存中检索第二目录的名称。
[0526]
在一些实施例中,散列是一致性散列。
[0527]
在一些实施例中:目录中的每一个还具有来自多个节点中的次要所有者节点,并且该方法还包括:确定第一目录的主要所有者节点已经失效,以及向第二目录报告第二度量的更新,报告第二度量的更新包括由第一节点向第三节点发送第二度量的更新,第三节点是第二目录的次要所有者节点。
[0528]
在一些实施例中,更新的报告包括报告第一目录的第一度量的变化。
[0529]
在一些实施例中,所述方法还包括:向第一目录报告第一更新,第一更新是第三目录的第二度量的更新,第三目录是第一目录的子目录;向第一目录报告第二更新,第二更新是对第四目录的第二度量的更新,第四目录是第一目录的子目录;以及基于第一更新和第二更新来更新第二度量的聚集值。
[0530]
在一些实施例中,该方法还包括向第二目录报告聚集值的更新。
[0531]
在一些实施例中,第一目录的第一度量是在第一目录中分配给第一用户的存储量。
[0532]
在一些实施例中,该方法还包括计算第二目录的第一度量的聚集值小于第一用户的存储配额的量。
[0533]
在一些实施例中,所述第一目录的第一度量是第一目录中的访问速率的测量。
[0534]
在一些实施例中,所述方法还包括识别多个目录中具有第一度量的最大值的目录。
[0535]
在一些实施例中,第一目录的第一度量是第一用户在第一目录中的聚集访问速率的测量。
[0536]
在一些实施例中,该方法还包括:针对包括第一用户的多个用户中的每一个计算针对第二目录的聚集访问速率,以及识别具有针对第二目录的聚集访问速率的最大值的用户。
[0537]
根据本公开的实施例,提供了一种系统,包括:共享存储;以及多个节点,所述共享存储被配置为存储多个目录,所述目录中的每一个具有主要所有者节点、包括第一处理电路且为多个目录中的第一目录的主要所有者节点的第一节点、包括第二处理电路且为多个目录中的第二目录的主要所有者节点的第二节点,第一目录为第二目录的子目录,第一处理电路被配置为:确定针对第一目录的第一度量满足第一报告准则;以及向第二处理电路发送针对第一目录的第一度量的更新。
[0538]
在一些实施例中,第一度量是在第一目录中分配给第一用户的存储量。
[0539]
在一些实施例中,所述第一目录的第一度量是第一目录中的访问速率的测量。
[0540]
根据本公开的实施例,提供了一种系统,包括:共享存储;以及多个节点,所述共享存储被配置为存储多个目录,所述目录中的每一个具有主要所有者节点、包括第一处理部件且为多个目录中的第一目录的主要所有者节点的第一节点、包括第二处理部件且为多个目录中的第二目录的主要所有者节点的第二节点,第一目录为第二目录的子目录,第一处理部件被配置为:确定针对第一目录的第一度量满足第一报告准则;以及向第二处理部件发送针对第一目录的第一度量的更新。
附图说明
[0541][0542]
参考说明书、权利要求书和附图将领会和理解本公开的这些和其他特征和优点,其中:
[0543]
图20是根据本公开的实施例的集群文件系统的框图;以及
[0544]
图21是根据本公开的实施例的数据组织图。
具体实施方式
[0545][0546]
下面结合附图阐述的详细描述旨在作为对根据本公开提供的用于管理集群文件系统中的度量的系统和方法的一些示例实施例的描述,并且不旨在表示可以构造或利用本公开的唯一形式。该描述结合所示实施例阐述了本公开的特征。然而,应当理解,相同或等同的功能和结构可以通过也旨在包含在本公开的范围内的不同实施例来实现。如本文其他地方所表示的,相同的元件编号旨在指示相同的元件或特征。
[0547]
一些实施例允许创建在集群化文件系统命名空间中的目录或文件的情境中生成的定制度量。如此创建的度量可以具有它们自己的规则,用于跨集群文件系统的同步以及用于将相关度量值聚集到每个父节点一直到集群文件系统命名空间的根目录。支持定制度量可能不需要盘布局变化或事务变化,并且可以用很少的编码工作来适应。
[0548]
如下面进一步详细讨论的,集群文件系统可以包括允许对集群文件系统命名空间中的各种目录和文件同时进行文件和目录操作的多个节点,并且每个节点能够潜在地更新相同目录的度量值或者更新不同目录的度量值,然后可以在文件系统命名空间分层上连续地累积和表示这些度量值。
[0549]
一些实施例提供了一种机制,该机制表示来自跨集群的相同目录可能发生的度量更新的聚集值,而不必为这样的更新创建事务,并且能够以最小的消息传递开销来同步这样的更新的累积值。一些实施例还允许文件系统分层中的各种目录处的相关度量沿着命名空间分层向上连续地聚集,使得父级能够反映其子级的所有相关度量的集群范围的同步值。此外,一些实施例保持目录的直接子级的累积集群同步值或所有相关度量与孙级的累积集群同步值或所有相关度量分离,以允许在文件系统命名空间中的目录从一个父项移动到另一父项时容易地移植度量值的操作。
[0550]
参考图20,集群文件系统可以包括多个节点(或“数据管理器节点”(dmn))105,每个节点被配置为访问共享存储110(例如,在其上执行读取和写入操作)。共享存储设备可以包括一个或多个持久性存储设备(诸如固态驱动器),以及一个或多个主机处理器或其他处理电路,用于在节点105与一个或多个持久性存储设备之间进行接口连接。存储在集群文件系统中的数据可以被组织为多个目录,每个目录包含零个或更多个文件以及零个或更多个目录。除了根目录之外的每个目录可以具有父目录以及零个或多个子目录。紧接在第二目录内的第一目录可以被称为第二目录的“直接子”或简称为第二目录的“子”;在这种情况下,第二目录可以被称为第一目录的“直接父”或简称为“父”。如果第一目录包含另一目录,例如第三目录,则第三目录可以被称为第二目录的“间接子”,并且第二目录可以被称为第三目录的“间接父”。类似地,直接存储在目录内(即,在目录的任何子目录之外)的文件可以
被称为“直接”存储在目录中,并且存储在目录中(例如,在目录的子目录内,或在目录的子目录的子目录内)的其他文件可以被称为“间接”存储在目录中。
[0551]
集群文件系统会对各种度量感兴趣。例如,对于每个目录(或“集合”),确定用于将文件存储在目录中的存储空间的量(该度量可以被称为“存储字节”)、存储在目录中的文件中的用户数据的量(其可以被称为“用户字节”)会是有用的。例如,如果一些存储空间用于存储奇偶校验数据,则用户字节度量可以小于存储字节度量,其中,在共享存储110中的存储设备发生故障的情况下,可以从该奇偶校验数据重构用户数据。可以管理的其他度量包括每个目录中的文件数量以及每个目录中的子目录数量。
[0552]
在操作中,例如,可以如下在整个集群文件系统中更新第一度量(例如,用户字节度量)(可以以类似的方式更新其他度量)。图21示出了简化目录分层的示例,包括多个目录205和多个文件210(为了便于说明,仅示出了其中的一个文件210)。在图21的例子中,根目录被命名为“gns”;它具有名为“vstore(v存储)”的子,该子具有名为“volume(卷)”的子,该子包含所示的文件210。图21的示例中的目录名称仅被选择以识别目录,并且不旨在具有进一步的重要性。
[0553]
当在目录卷中进行影响度量的改变时(例如,当将新文件写入目录卷时),拥有目录卷的第一节点可以从其他节点接收信息。可以基于一个或多个报告标准来做出关于何时将报告信息的决定。例如,当基于从其他节点接收到的这种信息(并且基于其本身可以在目录卷中做出的任何改变)满足第一报告准则时,第一节点可以将度量信息的更新报告(或“冒泡”)给父目录,即,在图21的示例中,报告给目录“vstore”。该报告可以通过由第一节点向第二节点发送消息来完成,第二节点是目录vstore的主要所有者。如果目录vstore具有多个子(包括目录卷和图21中未示出的其他子),则第二节点可以聚集它从其子接收的度量,使得它可以存储例如存储在其所有(直接和间接)子中的所有文件的总用户字节。更新可以是度量的新值(例如,目录卷的聚集用户字节的新值),或者它可以是自从上次将目录卷报告给目录vstore以来度量的变化(即,度量的值)。如本文所使用的,“向目录报告”意味着使得所报告的信息或所报告的更新与目录相关联(例如,通过向目录的主要所有者节点发送信息或更新)。
[0554]
当自上次将目录卷报告给目录vstore以来已经过了某个时间间隔时,或者当自上次将目录卷报告给目录vstore以来度量已经变化了超过阈值的值时,可以满足第一报告准则。为了识别目录卷的父目录,目录卷的主要所有者节点可以查询文件系统,该文件系统可以将所有目录的名称及其父子关系存储在合适的数据库中,以获得其父的全名。在一些实施例中,目录卷的主要所有者节点(即,第一节点)可以在执行这样的查询之后,将结果存储在本地父高速缓存中,并且随后根据需要从父高速缓存中检索该信息,使得每次将消息发送到目录卷的直接父节点的主要所有者节点时,不必用这样的查询来加重文件系统的负担。
[0555]
第一节点可以使用寻址到第二节点的节点标识符的消息向第二节点报告。可以由第一节点通过使用目录vstore的标识符或“内部名称”作为自变量评估散列函数来计算节点标识符。该内部名称可以是集群文件系统内的目录vstore唯一的整数。在其他实施例中,除了目录vstore的内部名称之外或代替目录vstore的内部名称,散列函数的自变量可以包括目录vstore的完整用户可读名称的一部分。如本文所使用的,目录的“完整用户可读名
称”是通过将目录的用户可读名称与其所有(直接和间接)父的用户可读名称组合而形成的名称,例如,通过级联名称,或者将它们与诸如“/”的分隔符连接。散列函数可以实现一致性散列,使得如果节点105变得不可用(例如,故障或离线),则向所有者节点分配目录的改变尽可能小。
[0556]
当在目录卷中进行改变时(例如,当新文件被写入时),可以如下通知第一节点。如果第三节点105执行将新文件添加到目录卷的写操作,则第三节点105可以在本地日志文件中存储与文件的添加相对应的日志条目。随着时间的推移,第三节点105可以继续执行操作,包括例如将另外的新文件添加到目录卷的附加写入操作。当在第三节点中对于目录卷的第一度量(在该示例中,对于用户字节度量)满足第二报告准则时,第三节点可以向第一节点报告更新,该更新对应于影响目录卷的所有日志条目。例如,如果自上次第三节点向第一节点报告以来,已经由第三节点向目录卷添加了五个新文件,则第三节点可以报告五个文件的大小(以用户字节为单位)、五个文件的大小(以存储字节为单位)、以及五个文件中的每一个的用户标识符(识别代表其创建文件的用户帐户)。
[0557]
当自第三节点上次向第一节点报告以来已经过去某个时间间隔时,或者当自第三节点上次向第一节点报告以来已经添加了某个阈值数量的新文件时,或者当自第三节点上次向第一节点报告以来已经执行了导致用户字节(或存储字节)变化阈值量的写入或删除时,可以满足第二报告准则。这样的标准可以具有限制第一节点中的数据可能过时的程度,或者第一节点中保存的用户字节数据或存储字节数据不完全准确的程度的效果。
[0558]
可以选择第一报告准则和第二报告准则两者以平衡(i)度量数据的准确性和最新性(其针对更容易满足的报告准则而改进)与(ii)报告负担(其针对更容易满足的报告准则而增加)。
[0559]
每个父目录可以维护两组度量数据或(“集群组”):(i)一组本地度量数据220,即,对应于直接存储在父目录中的文件的数据,以及(ii)一组聚集子数据225,即,对应于由其一个或多个子目录报告给父目录的度量数据的聚集数据。因此,例如,目录vstore存储与目录vstore中的本地文件(为了便于说明,图21中未示出的本地文件)相对应的一组本地度量数据220,以及与直接和间接存储在目录vstore的子中的文件相对应的一组聚集子数据225。度量(例如,本地用户字节)对于每个目录可以具有不同的值。如本文所使用的,“针对目录”的度量意味着该度量针对该目录所取的值。例如,目录卷的本地用户字节是直接分配在卷内的用户字节的数量,并且目录vstore的用户字节是直接分配在vstore内的用户字节的数量。
[0560]
如上所述,可以以类似的方式处理除用户字节度量之外的度量。例如,目录的访问速率度量可以被定义为在定义的时间间隔期间(例如,在最近午夜结束的24小时时段期间)在目录内进行的数据访问的数量。然后可以识别一个或多个“热点”目录(例如,具有超过阈值的访问速率的目录,或按访问速率排序的前5%的目录,或具有最高访问速率的目录),并且可选地作为图形表示显示给管理集群文件系统的操作者。也可以为每个用户保持接入速率度量。在这种情况下,根目录处的聚集每用户访问速率度量可以用于按照访问使用的顺序对用户进行排名。类似地,可以为每个用户保持其他度量(例如,每个用户的本地或聚集存储字节,其可以是本地或聚集地分配给用户的数据量)。根目录的这些每用户度量的聚集值可以用于评估任何用户正在使用集群化文件系统的资源(例如,存储空间和带宽)的程
度。在一些实施例中,根目录级别的每个用户的聚集用户字节表示在集群文件系统中分配给用户的总存储(以用户字节为单位)。可以计算根目录的每个用户的用户字节的聚集值小于用户的存储配额的量。当正在存储新数据时,该信息可以用于确定新数据的存储是否将导致用户超过用户的配额。
[0561]
在一些实施例中,可以自适应地更新该组度量,并且可以无缝地添加新度量,其中,节点105被配置为自动报告从其他节点接收的任何新度量。每个度量可以具有其自己的报告标准。在一些实施例中,报告是完全异步的,并且可以执行度量的收集和报告,而对集群文件系统的性能的影响最多很小。度量的收集和报告的负载是分布式的,不需要群集范围的锁,并且可以基本上立即响应关于目录处的度量的查询,而不必首先执行子目录的查询。除了主要所有者节点之外,每个目录可以具有一个或多个次要所有者节点。每当主要所有者节点获得度量数据的更新时,次要所有者节点可以获得这样的更新,使得如果主要所有者节点发生故障或停止服务,则它们能够接管主要所有者节点的责任。如果对于每个目录存在若干(例如,三个)次要所有者节点,则集群化文件系统可以对若干(例如,多达三个)节点的并发故障(或脱机)具有弹性。尽管本文提供的示例涉及在分层文件系统中使用分层分布式报告,但是在一些实施例中,在不同的分层系统中采用类似的方法。
[0562]
根据一些实施例,采用用于管理度量的系统和方法的集群文件系统可以提供各种优点,包括以下优点。系统可以能够接收关于任何节点上的感兴趣的任何可测量度量的更新,而不引入任何锁定开销,并且它可以允许在文件系统命名空间中的某个点处发生度量变化的构思的关联。系统可以通过跨集群发送这些更新并且通过将这些值与引起或报告更新的线程情境断开连接来以懒惰的方式同步这些值的累积效果,从而在这些更新跨集群发生时累积这些更新。系统可以将更新聚集到文件系统命名空间中的任何和每个节点,使得来自该节点的分层下的所有子的相关度量的所有值的累积效果被传播到所述节点。由于(i)该节点的直接子且由于(ii)该节点的间接子(例如,孙),系统可以在任何节点处分离累积度量更新。当文件系统命名空间中的节点从一个父节点下方移动到另一父节点下方时,系统可以允许将度量从一个节点容易地移植到另一节点,而不必重新计算旧父节点或新父节点中的任何一个的度量。系统可以允许存储消耗是度量中的一个,使得在文件系统命名空间中的任何级别下消耗的所有存储被表示为由于该级别的直接子和由于该级别的孙。该系统还可以允许所述存储消耗像配额一样被处理,该配额能够通过创建每用户或每组存储消耗度量来跟踪。系统可以在文件系统命名空间中的任何级别给出存储消耗的非事务性估计,其能够用于在每个用户或每个组的基础上强制执行文件系统配额,而不需要任何集群范围的锁来进行决策。
[0563]
根据本公开的一个或多个实施例可以包括以下条款中的一个或多个的一个或多个特征(但实施例不限于此):
[0564]
条款1:一种用于跟踪集群文件系统中的度量的方法,所述集群文件系统包括多个目录,所述方法包括:
[0565]
确定针对多个目录中的第一目录的第一度量满足第一报告标准;以及
[0566]
向多个目录中的第二目录报告针对第一目录的第一度量的更新,
[0567]
所述第一目录是所述第二目录的子目录。
[0568]
条款2:如条款1所述的方法,其中:
[0569]
所述集群文件系统还包括多个节点,并且,
[0570]
目录中的每一个具有来自多个节点中的主要所有者节点。
[0571]
第3项:如条款2所述的方法,其中,所述报告包括由第一节点向第二节点发送针对第一度量的更新,第一节点是第一目录的主要所有者节点,并且第二节点是第二目录的主要所有者节点。
[0572]
条款4:如条款3所述的方法,其中,所述报告还包括由第一节点计算第二节点的节点标识符,所述计算包括计算第二目录的名称的散列。
[0573]
第5项:如条款4所述的方法,还包括从第一节点的父高速缓存中检索第二目录的名称。
[0574]
条款6:如条款4所述的方法,其中,所述散列是一致性散列。
[0575]
条款7:如条款3所述的方法,其中:
[0576]
所述目录中的每一个还具有来自多个节点中的次要所有者节点,并且
[0577]
所述方法还包括:
[0578]
确定第一目录的主要所有者节点已经失效,以及
[0579]
向第二目录报告第二度量的更新,报告第二度量的更新包括由第一节点向第三节点发送第二度量的更新,第三节点是第二目录的次要所有者节点。
[0580]
条款8:如条款1所述的方法,其中,更新的所述报告包括报告第一目录的第一度量的变化。
[0581]
第9项:如条款1所述的方法,还包括:
[0582]
向第一目录报告第一更新,第一更新是第三目录的第二度量的更新,第三目录是第一目录的子目录;
[0583]
向第一目录报告第二更新,第二更新是对第四目录的第二度量的更新,第四目录是第一目录的子目录;以及
[0584]
基于第一更新和第二更新来更新第二度量的聚集值。
[0585]
条款10:如条款9所述的方法,还包括向第二目录报告聚集值的更新。
[0586]
条款11:如条款1所述的方法,其中,第一目录的第一度量是在第一目录中分配给第一用户的存储量。
[0587]
第12项:如条款11所述的方法,还包括计算第二目录的第一度量的聚集值小于第一用户的存储配额的量。
[0588]
条款13:如条款1所述的方法,其中,所述第一目录的第一度量是第一目录中的访问速率的度量。
[0589]
条款14:如条款13所述的方法,还包括识别多个目录中具有第一度量的最大值的目录。
[0590]
条款15:如条款1所述的方法,其中,所述第一目录的第一度量是第一用户在第一目录中的聚集访问速率的测量。
[0591]
条款16:如条款15所述的方法,还包括:
[0592]
针对包括第一用户的多个用户中的每一个用户,计算针对第二目录的聚集访问速率,以及
[0593]
识别具有针对第二目录的聚集访问速率的最大值的用户。
[0594]
条款17:一种系统,包括:
[0595]
共享存储;以及
[0596]
多个节点,
[0597]
所述共享存储设备被配置为存储多个目录,所述目录中的每一个具有主要所有者节点,
[0598]
第一节点,包括第一处理电路且为多个目录中的第一目录的主要所有者节点,
[0599]
第二节点,包括第二处理电路且为多个目录中的第二目录的主要所有者节点,
[0600]
第一目录为第二目录的子目录,
[0601]
第一处理电路被配置为:
[0602]
确定针对第一目录的第一度量满足第一报告准则;以及
[0603]
向第二处理电路发送针对第一目录的第一度量的更新。
[0604]
条款18:如条款17所述的系统,其中,第一度量是在第一目录中分配给第一用户的存储量。
[0605]
条款19:如条款17所述的系统,其中,所述第一目录的第一度量是第一目录中的访问速率的测量。
[0606]
条款20:一种系统,包括:
[0607]
共享存储;以及
[0608]
多个节点,
[0609]
所述共享存储设备被配置为存储多个目录,所述目录中的每一个具有主要所有者节点,
[0610]
第一节点,包括用于处理的第一装置且为多个目录中的第一目录的主要所有者节点,
[0611]
第二节点,包括用于处理的第二装置且为多个目录中的第二目录的主要所有者节点,
[0612]
第一目录为第二目录的子目录,
[0613]
用于处理的第一装置被配置为:
[0614]
确定针对第一目录的第一度量满足第一报告准则;以及
[0615]
向用于处理的第二装置发送针对第一目录的第一度量的更新。
[0616]
如本文所使用的,某物的“一部分”意指该物的“至少一些”,并且因此可以意指少于该物的全部或作为该物的全部。因此,物的“一部分”包括整个物作为特殊情况,即,整个物是物的一部分的示例。如本文所用,术语“或”应解释为“和/或”,使得例如“a或b”意指“a”或“b”或“a和b”中的任一个。
[0617]
术语“处理电路”和“用于处理的装置”中的每一个在本文中用于意指用于处理数据或数字信号的硬件、固件和软件的任何组合。处理电路硬件可以包括例如专用集成电路(asic)、通用或专用中央处理单元(cpu)、数字信号处理器(dsp)、图形处理单元(gpu)、诸如现场可编程门阵列(fpga)的可编程逻辑器件。在处理电路中,如本文中所使用,每一功能由被配置(即,硬连线)为执行所述功能的硬件执行,或由被配置为执行存储于非暂时性存储介质中的指令的更通用硬件(诸如cpu)执行。处理电路可以制造在单个印刷电路板(pcb)上或者分布在若干互连的pcb上。处理电路可以包含其他处理电路;例如,处理电路可以包括
在pcb上互连的两个处理电路,fpga和cpu。
[0618]
如本文所使用的,术语“阵列”是指数字的有序集合,而不管如何存储(例如,是存储在连续的存储器位置中还是存储在链表中)。如本文所使用的,当方法(例如,调整)或第一数量(例如,第一变量)被称为“基于”第二数量(例如,第二变量)时,这意味着第二数量是对方法的输入或影响第一数量,例如,第二数量可以是对计算第一数量的函数的输入(例如,唯一输入或若干输入中的一个),或者第一数量可以等于第二数量,或者第一数量可以与第二数量相同(例如,存储在存储器中与第二数量相同的一个或多个位置处)。
[0619]
将理解,尽管本文可以使用术语“第一”、“第二”、“第三”等来描述各种元件、组件、区域、层和/或部分,但是这些元件、组件、区域、层和/或部分不应受这些术语的限制。这些术语仅用于将一个元件、组件、区域、层或部分与另一个元件、组件、区域、层或部分区分开。因此,在不脱离本发明构思的精神和范围的情况下,本文讨论的第一元件、组件、区域、层或部分可以被称为第二元件、组件、区域、层或部分。
[0620]
本文使用的术语仅用于描述特定实施例的目的,并不旨在限制本发明构思。如本文所用,术语“基本上”、“约”和类似术语用作近似术语而不是程度术语,并且旨在考虑本领域普通技术人员将认识到的测量或计算值的固有偏差。
[0621]
如本文所使用的,单数形式“一”和“一个”旨在也包括复数形式,除非情境另有明确说明。将进一步理解,当在本说明书中使用时,术语“包括”和/或“包含”指定所述特征、整数、步骤、操作、元件和/或组件的存在,但不排除一个或多个其他特征、整数、步骤、操作、元件、组件和/或其组的存在或添加。如本文所使用的,术语“和/或”包括相关联的所列项目中的一个或多个的任何和所有组合。诸如
“……
中的至少一个”的表达在元素列表之后时修饰整个元素列表,而不修饰列表的各个元素。此外,在描述本发明构思的实施例时使用“可以”是指“本公开的一个或多个实施例”。此外,术语“示例性”旨在指示示例或说明。如本文所用,术语“使用”、“正在使用”和“已经使用”可以被认为分别与术语“利用”、“正在利用”和“已经利用”同义。
[0622]
应当理解,当元件或层被称为在另一元件或层“上”、“连接到”、“耦接到”或“相邻于”另一元件或层时,它可以直接在另一元件或层上、连接到、耦接到或相邻于另一元件或层,或者可以存在一个或多个中间元件或层。相反,当元件或层被称为“直接在另一元件或层上”、“直接连接到”、“直接耦接到”或“紧邻”另一元件或层时,不存在中间元件或层。
[0623]
尽管本文已经具体描述和示出了用于管理集群文件系统中的度量的系统和方法的一些示例实施例的各方面,但是许多修改和变型对于本领域技术人员而言将是显而易见的。因此,应当理解,根据本公开的原理构造的用于管理集群文件系统中的度量的系统和方法可以以不同于本文具体描述的方式来体现。本发明还在以下权利要求及其等同物中限定。
再多了解一些

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

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

相关文献