在存储集群系统中协调命令的并行执行和取消的技术的制作方法

文档序号:11532609阅读:206来源:国知局
在存储集群系统中协调命令的并行执行和取消的技术的制造方法与工艺

相关申请

本申请要求2014年9月19日提交的、名称为“techniquesforcoordinatingparallelperformanceandcancellationofcommandsinastorageclustersystem”的美国专利申请no.14/491,799的优先权,其通过引用并入于此。



背景技术:

远程访问的存储集群系统可以包括可以在地理上分散的多个互连的节点,以便以容错的方式执行客户端设备数据的存储并且能够快速地检索该数据。每个这样的节点可以包括多个互连的模块,每个模块可以专门用于执行存储和检索客户端设备数据的任务的一部分。远程通信可能需要在多个这样的节点之间在短时间内发生,以协调在执行这些任务时可能出现的错误的处理。因此,这样的存储集群系统的架构可能相当复杂。

相比之下,客户端设备可能没有被配置为监测和/或控制这样的复杂架构的各方面或其实现容错的方式的复杂性。客户端设备可以使用不太适合传送这样的复杂性的细节的协议来与存储集群系统通信,并且客户端设备可以采用在处理由这样的复杂性引起的延迟时几乎不提供灵活性的操作系统。

附图说明

图1示出了存储集群系统的示例实施例。

图2a示出了集群的一对高可用性组的示例实施例。

图2b示出了不同集群的一对高可用性组的示例实施例。

图3示出了合作节点的ha组的示例实施例。

图4示出了在共享的存储设备集合内复录和存储元数据的示例实施例。

图5a示出了在节点之间复制命令的示例实施例。

图5b示出了中继对节点之间的复制命令的响应的示例实施例。

图6示出了节点之间的命令和元数据的同步的示例实施例。

图7示出了节点之间的通信会话的网格的示例实施例。

图8示出了交换副本数据访问命令的不同ha组中的活动节点的示例实施例。

图9a和图9b一起示出了在两个活动节点之间的副本命令集的形成和传输的示例实施例。

图10a和图10b一起示出了在两个活动节点之间的网络分组内的各部分中的副本命令集的传输的示例实施例。

图11示出了根据实施例的逻辑流程。

图12示出了根据实施例的逻辑流程。

图13示出了根据实施例的逻辑流程。

图14示出了根据实施例的逻辑流程。

图15示出了根据实施例的处理架构。

具体实施方式

各种实施例总体上涉及用于协调存储集群系统的节点之间的数据访问命令的至少部分并行执行和取消的技术。在存储集群系统中,多个节点可以被分组成两个或更多个集群,每个集群可以由一个或多个高可用性(ha)节点组组成。两个或更多个集群可以位于地理上远离的位置,并且可以经由延伸通过网络(诸如,因特网或专用租用线路)的一个或多个互连耦合。每个集群的ha组中的单个节点可以是活动节点,活动节点经由活动通信会话与其他节点通信以交换数据访问命令的副本,以实现这些数据访问命令的至少部分并行执行,以便同步客户端设备数据在其ha组之间的状态。这些活动节点还可以交换取消命令,以实现数据访问命令的取消的至少部分并行执行,以便再次同步客户端设备数据在其ha组之间的状态。此外,这些活动节点中的一个活动节点还可以与一个或多个客户端设备通信,以接收对存储服务的请求并且将这些请求转换为数据访问命令。在每个ha组内,至少一个其他节点可以是与活动节点合作,并且经由元数据在ha组内的节点之间的复录来被准备,以响应于错误来接管活动节点的非活动节点。

为了支持副本数据访问命令的这种交换、取消命令的交换和这种接管,每个ha组中的多个节点可以协作以形成通信会话的网格,其中包括一个活动通信会话和多个非活动通信会话。当ha组中的非活动节点响应于错误而接管同一ha组中的活动节点时,活动通信会话可能变为非活动,并且其中一个非活动通信会话可能变为活动通信会话。为了支持形成网格,包括一个或多个其他节点的网络地址的元数据可以在每个ha组内的节点之间被复录并且分布,以最小化在重新启动一个或多个节点之后在形成网格时的延迟。

每个节点可以包括管理模块(m模块)、网络协议模块(n模块)和数据存储模块(d模块)中的每个模块中的一个或多个模块。m模块可以将活动节点耦合到客户端互连,以向一个或多个客户端设备提供可以远程配置存储集群系统的至少一部分的机制。n模块可以将活动节点耦合到客户端互连,以使得一个或多个客户端设备能够向节点传输对存储服务的请求。n模块可以将存储服务请求转换成至少一个数据访问命令。d模块可以耦合到n模块以从其接收至少一个数据访问命令。d模块还可以将节点耦合到一个或多个存储设备以存储客户端设备数据,并且客户端设备数据从其可以被检索。这些存储设备中的个别存储设备和/或这些存储设备的组可以由d模块指定和处理为逻辑单元(lu)。d模块可以在由单个lu或一组lu提供的存储空间内定义聚合,并且可以在该聚合的存储空间内定义一个或多个卷。客户端设备数据可以存储在如此在该聚合内定义的一个或多个卷内。

除了执行从n模块接收的数据访问命令之外,第一ha组中的一个活动节点的d模块可以复制数据访问命令,并且将该数据访问命令的结果副本传输到第二ha组中的另一活动节点的另一d模块,以实现由两个活动节点的d模块进行的数据访问命令的至少部分并行执行。副本数据访问命令的这种传输可以经由可以延伸通过客户端互连可以延伸的同一网络的集群间互连来执行。该另一节点的d模块可以在副本数据访问命令的执行中通过成功或失败的指示来应答副本数据访问命令的传输。

为了支持在第一ha组中的活动节点和第二ha组中的活动节点之间进行副本数据访问命令及其响应的交换,两个活动节点可以协作以通过集群互连来形成和维持其之间的活动通信会话。在这样的活动通信会话中,有关两个活动节点中的每个的当前状态的信息可以在它们之间循环交换。而且,第一ha组和第二ha组中的非活动节点还可以建立和维持在第一ha组和第二ha组中的节点之间延伸的非活动通信会话,以支持由同一ha组中的非活动节点响应于任一ha组中的活动节点内发生的错误来接管该活动节点。两个活动节点可以交换关于第一和第二ha组中的非活动节点的信息,以使得能够形成这些非活动通信会话,从而完成通信会话的网格。在导致非活动节点接管其中一个活动节点的错误的情况下,两个活动节点之间的活动通信会话可能变为非活动,而一个非活动通信会话可能变为活动通信会话。

为了支持形成和维持通信会话的网格,每个活动节点的m模块、n模块和/或d模块可以协作以导出、存储和/或交换包括第一和第二ha组中的节点中的多个分组节点的网络地址的指示和/或与建立网格的通信会话的至少子集有关的其它信息的元数据。在每个ha组内,活动节点的m模块可以接收构成元数据的一部分的信息和/或活动节点的n模块可以执行测试以发现构成元数据的另一部分的信息。然后,m模块和n模块中的一个或两者可以将它们的元数据部分提供给活动节点的d模块。d模块可以将元数据的复录传输到同一ha组中的一个或多个非活动节点的d模块,并且可以将元数据的拷贝存储在一个或多个存储设备内的卷和/或聚合中,活动节点以及同一ha组中的一个或多个非活动节点的d模块可以共享对其的访问。结果,当其中一个这样的d模块在复位或上电之后重新启动时,该d模块可以能够通过从一个或多个存储设备检索来检索与其节点建立与另一ha组中的节点的通信会话相关的信息,然后,可以使用该信息更快地形成网格的通信会话中的一个或多个。在多个ha组中的每个中的各个节点中的不同节点可以由于各种原因中的任何一种而被偶然重新启动的实施例中,在这种重新启动之后更快地重新建立通信会话可以用于最小化这种通信会话的网格的各部分不到位的时间段。如果遇到导致其中节点和/或通信会话处于活动或非活动的变化的错误,则可以更新存储在一个或多个存储设备内的元数据,以便能够通过在重新启动之后的活动和非活动通信会话的新配置更快地重新建立通信会话。

当第一ha组中的活动节点的d模块复制数据访问命令时,该d模块可以向每个数据访问命令及其被传输到第二ha组中的活动节点的d模块的副本数据访问命令分配匹配的序列标识符(序列id)。第一ha组中的活动节点的d模块可以将多个连续的数据访问命令分组成命令集,并且将匹配的连续的副本数据访问命令分组成匹配的副本命令集。每个新的命令集和匹配的副本命令集可以以重复的时间间隔和/或响应于命令本身的各种特性来创建。第一ha组中的活动节点的d模块也可以向命令集和匹配的副本命令集分配匹配的集合标识符(集合id)。当连续的副本数据访问命令的每一组都被传输到第二ha组中的活动节点的d模块时,该d模块可以使用被分配给每个副本数据访问命令的序列id和被分配给每个副本命令集的集合id,以更有效地将来自每个可以在单独的网络分组中传输的其各部分的副本命令集重新组合。作为示例,第二ha组中的活动节点的d模块可以使用集合id来更有效地标识和丢弃传送副本命令集的冗余部分的网络分组,该副本命令集的冗余部分可以在网络内生成并通过网络分组传输。

第一ha组和第二ha组中的活动节点的d模块还可以使用集合id来协调并且更快地实现来自客户端设备的取消一系列数据访问命令的执行,并且至少部分地在并行进行这一操作的请求。第一ha组中的活动节点的d模块可以确定命令集的集合id以及包括要被取消的一系列数据访问命令的匹配的副本命令集。然后,第一ha组中的活动节点的d模块可以使用这些集合id来选择要丢弃的一个或多个命令集,继而作为停止和防止进一步执行一个或多个命令集中的数据访问命令二者的一部分来进行这一操作。第一ha组中的活动节点的d模块还可以通过传送这些集合id的取消命令来通知第二ha组中的活动节点的d模块。响应于接收到取消命令,第二ha组中的活动节点可以使用这些集合id来选择要丢弃的一个或多个副本命令集,继而作为停止和防止进一步执行一个或多个副本命令集中的副本数据访问命令二者的部分来进行这一操作,至少部分与此并行地,停止和防止由第一ha组中的活动节点进一步执行数据访问命令。

通常参考本文中使用的符号和术语,下面的详细描述的部分可以在在计算机或计算机网络上执行的程序过程方面来呈现。本领域技术人员使用这些程序描述和表示来最有效地将其工作的实质传送给本领域技术人员。程序在这里并且通常被认为是导致期望结果的自相合的操作序列。这些操作是需要物理量的物理操作的操作。通常,虽然不一定,但是这些量采取能够被存储、传输、组合、比较和以其他方式操纵的电、磁或光信号的形式。有时,主要是出于普遍使用的原因,将这些信号称为比特、值、元素、符号、字符、术语、数字等是方便的。然而,应当注意,所有这些和类似的术语都与适当的物理量相关联,并且仅是适用于这些量的便利标签。

此外,这些操作通常以通常与人类操作者执行的心理操作相关联的诸如添加或比较等术语来表示。然而,在构成一个或多个实施例的一部分的本文中描述的任何操作中,人类操作者的这种能力不是必需的,或者在大多数情况下不是理想的。相反,这些操作是机器操作。用于执行各种实施例的操作的有用的机器包括通过根据本文中的教导而被编写的存储的计算机程序选择性地激活或配置的通用数字计算机,和/或包括为了所需目的专门构造的装置。各种实施例还涉及用于执行这些操作的装置或系统。这些装置可以为所需目的而特别构造,或者可以包括通用计算机。从给出的描述中容易理解各种这些机器的所需结构。

现在参考附图,其中相同的附图标记始终用于表示相同的元件。在下面的描述中,为了说明的目的,阐述了很多具体细节以便提供其透彻理解。然而,显然,可以在没有这些具体细节的情况下实践新颖的实施例。在其他情况下,以框图形式示出了众所周知的结构和装置,以便于其描述。本发明旨在涵盖在权利要求的范围内的所有修改、等同物和替代方案。

图1示出了包括一个或多个客户端设备100和一个或多个集群(诸如所示的集群1300a和1300z)的存储集群系统1000的示例实施例的框图。如图所示,集群1300a可以包括节点300a-d中的一个或多个和存储设备集合800ab和800cd,并且集群1300z可以包括节点300y-z中的一个或多个和存储设备集合800yz。如进一步所示,集群1300a可以包括ha组1600ab,ha组1600ab包括作为合作者的节点300a-b、和存储设备集合800ab。集群1300a还可以包括ha组1600cd,ha组1600cd包括作为合作者的节点300c-d、和存储设备集合800cd。相应地,集群1300z可以包括ha组1600yz,ha组1600yz包括作为合作者的节点300y-z、和存储设备集合800yz。

在一些实施例中,集群1300a和集群1300z可以位于地理上远离的位置,以便能够在存储和检索由一个或多个客户端设备100提供的用于存储的客户端设备数据130时实现一定程度的冗余度。可以认为这样的定位是期望的,以使得客户端设备100中的一个或多个能够继续访问客户端设备数据130,尽管出现故障或可能使得集群1300a或集群1300z中的一者或另一者不能访问一个或多个客户端设备100的其他事件。如图所示,集群1300a和集群1300z中的一者或两者可以另外存储可能与客户端设备数据130完全无关的其他客户端设备数据131。

形成具有合作以共享对存储设备集合800ab的访问的至少两个节点300a和300b的ha组1600ab可以使得能够通过以下方式来在访问被存储在存储设备集合800ab内的客户端设备数据130时实现一定程度的容错能力:使得处于非活动状态的节点300a-b中的一个能够响应于节点300a-b中的活动节点300a-b内的错误状况来接管处于活动状态的其合作者(例如,节点300a-b中的另一节点)。相应地,形成具有合作以共享对存储设备集合800yz的访问的至少两个节点300y和300z的ha组1600yz可以类似地使得能够类似地通过以下方式来在访问被存储在存储设备集合800yz内的客户端设备数据130时实现一定程度的容错能力:使得处于非活动状态的节点300y-z中的一个能够类似地接管处于活动状态的其合作者(例如,节点300y-z中的另一节点)。

如图所示,节点300a-d和节点300y-z中的任何活动节点可以经由客户端互连199可访问客户端设备100。另外,如图所示,节点300a-d和节点300y-z可以另外经由集群间互连399耦合。在一些实施例中,互连199和互连399可以都延伸通过相同的网络999。互连199和互连399中的每个互连可以通过网络999被实现为使用各种网络安全协议中的任一种定义的虚拟专用网络(vpn)。网络999可以是限于在单个建筑物内或其他相对有限的区域内延伸的单个网络,可以包括延伸相当长距离的连接网络的组合,和/或可以包括因特网。作为在同一网络999内共存的备选方案,互连199和互连399可以被实现为完全物理上分离的网络。作为示例,客户端互连199可以延伸通过因特网以使得客户端设备100能够位于地理上不同的位置,而集群间互连399可以延伸通过集群1300a和集群1300z中的每个定位在此的两个地理上远离的位置之间的租用线路。

如图所示,ha组1600ab、1600cd和1600yz中的每个内的合作节点可以分别经由ha互连699ab、699cd和699yz另外耦合。另外,如图所示,ha组1600ab、1600cd和1600yz中的每个中的节点可以以能够经由存储互连899ab、899cd和899yz共享访问的方式分别耦合到存储设备集合800ab、800cd和800yz。构成ha组1600ab、1600cd和1600yz中的每个的合作节点和存储设备集合可以位于彼此相对紧密的物理接近范围内,使得互连699ab、899ab、699cd、899cd、699yz和899yz可以遍历相对短的距离(例如,在房间内和/或在柜内延伸)。

更广泛地,网络999和/或互连199、399、699ab、699cd和699yz中的一个或多个互连可以基于可以交换信号的各种通信技术(或组合)中的任何一种,包括但不限于,采用电和/或光传导性布线的有线技术、以及采用红外、射频或其他形式的无线传输的无线技术。互连899ab、899cd和899yz中的每个可以基于各种广泛已知和使用的存储接口标准中的任何一种,包括但不限于scsi、串行附接的scsi(sas)、光纤通道等。

应当注意,尽管描绘了存储集群系统1000内的特定数目的集群和节点,但是包括不同数目的集群和节点的其它实施例也是可能的。类似地,尽管描绘了集群1300a和集群1300z中的每个内的特定数目的ha组和节点,但是包括不同数目的ha组和节点的其它实施例也是可能的。此外,尽管ha组1600ab、1600cd和1600yz中的每个分别被描绘为包括一对节点300a-b、300c-d和300y-z,但是其中ha组1600ab、1600cd和1600yz中的一个或多个可以包括多于两个节点的其他实施例也是可能的。

图2a和图2b每个更详细地示出了存储集群系统1000的示例部分的框图。更具体地,图2a更详细地描绘了节点300a-d的各方面以及在集群1300a内的其之间的互连。图2b更详细地描绘了节点300a-b和节点300y-z之间的互连的各方面,包括在集群1300a和集群1300z之间延伸的互连。

参考图2a和图2b,节点300a-d和节点300y-z中的每个节点可以包括m模块400、n模块500和d模块600中的一个或多个模块。如图所示,m模块400和n模块500中的每个模块可以耦合到客户端互连199,m模块400和n模块500中的每个模块可以通过互连199可访问客户端设备100中的一个或多个客户端设备。节点300a-d和节点300y-z中的一个或多个活动节点的m模块400可以经由客户端互连199与一个或多个客户端设备100协作,以允许客户端设备100之一的运营商配置存储集群系统1000存储由一个或多个客户端设备100提供的客户端设备数据130,并提供对其的访问的方式的各方面。节点300a-d和节点300y-z中的一个或多个活动节点的n模块500可以接收并响应于经由客户端互连199从一个或多个客户端设备100接收的存储服务的请求,并且可以执行协议转换以将每个存储服务请求转换成一个或多个数据访问命令。

如图所示,所有节点300a-d和节点300y-z的d模块600可以经由集群间互连399彼此耦合。此外,在ha组1600ab、1600cd和1600yz中的每个内,合作节点的d模块600可以共享分别到存储设备集合800ab、800cd和800yz的耦合。更具体地,合作节点300a和300b的d模块600都可以经由存储互连899ab耦合到存储设备集合800ab,合作节点300c和300d的d模块600都可以经由存储互连899cd耦合到存储设备集合800cd,并且合作节点300y和300z的d模块600都可以经由存储互连899yz耦合到存储设备集合800yz。节点300a-d和节点300y-z中的活动节点的d模块600可以执行由这些节点的n模块500中的一个或多个模块通过转换从一个或多个客户端设备100接收的存储设备请求而导出的数据访问命令。

因此,节点300a-d和节点300y-z中的活动节点的d模块600可以经由存储互连899ab、899cd和899yz中的相应的存储互连访问存储设备集合800ab、800cd和800yz中的相应存储设备以作为执行数据访问命令的一部分来存储和/或检索客户端设备数据130。数据访问命令可以伴随着客户端设备数据130的一部分以存储和/或更新客户端设备数据130的各部分,通过其来更新存储的客户端设备数据130。备选地或附加地,数据访问命令可以规定要从存储装置检索以提供回到一个或多个客户端设备100的客户端设备数据130的各部分。

此外,参考图2b,集群1300a或集群1300z中的一个集群的节点300a-b和节点300y-z中的活动节点的d模块600可以复制数据访问命令,并且经由集群间互连399向另一集群1300a或1300z中的另一集群的节点300a-b和节点300y-z中的另一活动节点传输所得到的副本数据访问命令,以使得两个d模块600能够进行数据访问命令的至少部分并行执行。这样,存储在存储设备集合800ab或800yz之一中的客户端设备数据130的状态可以在存储设备集合800ab或800yz中的另一者中被镜像,如图所示。

客户端设备数据130的状态在与可能在地理上彼此远离的不同集群相关联的多个存储设备集合之间的这种镜像可以被认为是期望的,以便解决一个集群的节点由于客户端互连199的区域故障(例如,由于客户端互连的一部分在特定地理区域中延伸通过其的网络999的一部分的故障)而变得不可访问的可能性。如本领域技术人员所熟悉的,在ha组中的合作节点(例如,ha互连699b、699cd和699yz)之间使用附加互连趋向于促进在彼此附近物理地定位ha组中的合作节点,使得网络的本地化故障可能导致ha组中的所有节点不可访问客户端设备100。例如,包括客户端互连199的网络的一部分在两个节点300a和300b附近的故障可以使得节点300a和节点300b都能够访问客户端设备100,使得存储在存储设备集合800ab内的客户端设备数据130变为通过节点300a或节点300b中的任一个节点不可访问。利用镜像客户端设备数据130的状态的两个存储设备集合800ab和800yz,客户端设备100仍然能够访问存储设备集合800yz内的客户端设备数据130,而不管对存储设备集合800ab的访问的丢失。

再次参考图2a和图2b,如较早所讨论的,在节点300a-d和节点300y-z之一内发生故障的情况下,共享分别经由存储互连899ab、899cd和899yz在节点300a-d和节点300y-d之间对存储设备800ab、800cd和800yz集合中的每个的访问可以使得能够继续访问存储设备800ab、800cd和800yz的集合之一。如图所示,为了支持这样的连续访问而不管这样的故障,节点300a-d和节点300y-z中的合作节点的d模块600可以分别经由ha互连699ab,699cd和699yz在ha组1600ab、1600cd和1600yz中的每个内耦合。通过ha互连699ab、699cd或699yz,这些节点中的每个的d模块600可以每个监测其合作者的d模块600的状态。更具体地,合作节点300a和300b的d模块600可以通过ha互连699ab彼此监测,合作节点300c和300d的d模块600可以通过ha互连699cd彼此监测,并且合作节点300y和300z的d模块600可以通过ha互连699yz彼此监测。

这种监测可能需要经由ha互连699ab、699cd或699yz中的一个或多个来重复地交换“心跳”和/或其他状态信号(例如,传送数据访问命令的当前状态的消息),其中,在规定的周期性间隔内没有接收到这样的信号的情况可以被认为是期望有信号来自其的d模块600中的一个的故障的指示。备选地或附加地,这种监测可能需要等待来自d模块600中的所监测的模块的指示,该指示表明已经发生了节点300a-d或300y-z之一的另一部件的故障,例如,节点300a-d或节点300y-z中的一个节点的m模块400和/或n模块500的故障。响应于属于ha组1600ab、1600cd或1600yz之一的节点300a-d或300y-z中的活动节点的故障的这种指示,在ha组1600ab、1600cd或1600yz中的同一ha组中的节点300a-d或节点300y-z中的非活动合作者可能会接管。节点300a-d或节点300y-z中的合作者之间的这种“接管”可以是完全接管,这是因为正在接管的合作者可以接管由这些节点中的故障节点执行的所有功能的执行。

然而,在一些实施例中,节点300a-d和/或节点300y-z中的多个节点的至少n模块500和d模块600可以以使得能够响应于节点300a-d或节点300y-z中的一个节点的一部分的故障来实现部分接管的方式被互连。更具体地参考图2a,节点300a-d中的每个的n模块500可以经由集群内互连599a耦合到节点300a-d中的每个的d模块600。换言之,在集群1300a内,所有n模块500和所有d模块600可以耦合以使得数据访问命令能够在不同节点300a-d的n模块500和d模块600之间交换。因此,作为示例,如果节点300a的n模块500已经失败但节点300a的d模块600仍然可操作,其合作节点300b的n模块500(或节点300c在ha组中不与其合作的节点300c或节点300d之一的合作节点)可以接管节点300a的n模块500。

尽管集群1300a和集群1300z可以在地理上彼此远离,但是在集群1300a和集群1300z中的每个集群内,节点和/或节点的部件可以位于彼此相对紧密的物理接近范围内,使得集群内互连599a和599z可以遍历相对短的距离(例如,在房间内和/或在单个柜内延伸)。更广泛地,集群内互连599a和599z中的一个或多个可以基于可以交换信号的各种通信技术(或组合)中的任何一种,包括但不限于,采用电和/或光传导性布线的有线技术、以及采用红外、射频或其他形式的无线传输的无线技术。作为示例,集群内互连599a可以由将每个节点300a-d的每个n模块500耦合到每个节点300a-d的每个d模块600的点到点互连的网格组成。或者,作为另一示例,集群内互连599a可以包括网络交换机(未示出),节点300a-d的每个n模块500和每个d模块600可以耦合到该交换机。

然而,应当注意,可以认为相对于其中一个节点接管发生故障的另一节点的所有功能的完整接管,期望不允许(或至少限制其实例)这种部分接管。这可能是由于在一个或多个节点300a-d和/或300y-z内的n模块500和d模块600之间延伸的集群内互连599a和/或599z的部分具有明显地比在不同节点的n模块500和d模块600之间延伸的集群内互连599a和/或599z的部分更快地传输命令和/或数据的能力。因此,在一些实施例中,可以不使用分别在节点300a-d或300y-z中的不同节点之间延伸的集群内互连599a和/或599z的部分,使得保持非活动。

还应当注意,尽管在每个节点300a-d和300y-z内只描绘了m模块400、n模块500和d模块600中的每个中的单个模块,但是在些节点的一个或多个中包括m模块400、n模块500和d模块600中的一个或多个的不同量的其他实施例是可能的。作为示例,如下实施例是可能的:其中节点300a-d和/或节点300y-z中的一个或多个节点包括多于一个n模块500以在节点内提供一定程度的容错用于与一个或多个的客户端设备100通信,以及/或者包括多于一个d模块600以在节点内提供一定程度的容错度用于访问存储设备集合800ab、800cd或800yz中的对应的存储设备集合。

图3更详细地示出了存储集群系统1000的集群1300a的ha组1600ab的示例性实施例的框图。如图所示,在ha组1600ab的节点300a和300b中的节点300a可以活动以参与与客户端设备100的通信并且执行改变存储设备集合800ab内的客户端设备数据130的操作,而节点300b可能不活动并且等待需要接管节点300a。更具体地,m模块400和n模块500可以不与客户端设备100通信(如用点划线所示的m模块400和n模块500所示)。如图所示,节点300a-b中的每个节点可以包括m模块400、n模块500和d模块600中的一个或多个模块。

在各种实施例中,每个节点300a-b的m模块400包括处理器部件450、存储器460、以及将m模块400耦合到至少客户端互连199的接口490中的一个或多个。存储器460可以存储控制例程440。控制例程440可以包括在处理器部件450上作为m模块400的主处理器部件操作以实现用于执行各种功能的逻辑的指令序列。作为节点300a活动以与一个或多个客户端设备100通信并执行数据访问命令的结果,节点300a的m模块400的处理器部件450可以是活动的,以执行控制例程440。然而,由于节点300b非活动,处理器部件450可能不活动以执行节点300b的m模块400内的控制例程440。然而,如果节点300b接管节点300a,则节点300b内的控制例程440可以开始执行,而节点300a内的控制例程440可能停止执行。

在执行控制例程440时,活动节点300a的m模块400的处理器部件450可以操作接口490,以接受远程提供的配置信息。具体地,处理器部件450可以提供网络服务器、远程登录访问、即时消息和/或其他通信服务,通过这些,节点300a、ha组1600ab、集群1300a和/或存储集群系统1000的其他部件的操作的各个方面可以远程配置。在一些实施例中,这样的远程配置可以从一个或多个客户端设备100发出。作为示例,可以认证每个客户端设备100以允许访问存储在存储设备集合800ab内的客户端设备数据130的安全协议可以被远程配置,以及可以在具有客户端互连199的通信中采用什么协议,可以在将客户端设备数据130存储在存储设备集合800ab内时采用什么文件系统,还有哪些节点300b-d或300y-z可以与节点300a合作以形成ha组1600ab,还有哪些节点和/或ha组可以与节点300a和/或ha组1600ab协作以提供进一步的故障容差,可以在各种互连上向节点300a-d和/或节点300y-z中的其他节点分配什么网络地址等。当处理器部件450接收到这样的配置信息时和/或在接收到这样的信息之后,处理器部件450可以操作接口490,以将其作为元数据的一部分进行中继和/或更新到n模块500和/或d模块600。

在各种实施例中,节点300a-b中的每个的n模块500包括处理器部件550、存储器560、以及将n模块500耦合到客户端互连199和集群内互连599a中的一个或两者的接口590中的一个或多个。存储器560可以存储控制例程540。控制例程540可以包括在处理器部件550上作为n模块500的主处理器部件操作以实现应用执行各种功能的逻辑的指令序列。作为节点300a活动以与一个或多个客户端设备100通信并执行数据访问命令的结果,节点300a的n模块500的处理器部件550可以是活动的以执行控制例程540。然而,由于节点300b非活动,处理器部件550可能不活动以执行节点300b的n模块内的控制例程540。然而,如果节点300b接管节点300a,则节点300b内的控制例程540可以开始执行,而节点300a内的控制例程540可能停止执行。

在执行控制例程540时,活动节点300a的n模块500的处理器部件550可以操作接口590以执行各种测试以检测要与其通信的其他设备和/或分配其他设备可以通过其被联络用于通信的网络地址。至少作为在复位或上电之后的重新启动的一部分,处理器部件550可以对集群间互连399和/或集群内互连599a执行各种测试,以确定用于与一个或多个节点300a-d和/或节点300y-z的一个或多个部件(例如,m模块400、n模块500和/或d模块600)通信的地址和/或通信协议。备选地或附加地,在其中集群内互连599a的至少一部分支持因特网协议(ip)寻址的实施例中,处理器部件550可以起到动态主机控制协议(dchp)服务器的作用,以分配这样的地址。另外,备选地或附加地,处理器部件550可以从m模块400接收配置信息。

在一些实施例中,处理器部件550可以在对集群间互连399和/或集群内互连599a执行这样的测试时采用从m模块400接收的配置信息(例如,如此接收的配置信息可以包括要测试的ip地址范围)。当处理器部件550执行这样的测试时和/或在执行这样的测试之后,处理器部件550可以操作接口590以将这些测试的结果和/或其更新的指示作为元数据的一部分中继到d模块600。此外,当处理器部件550与客户端设备100和/或其他设备中的一个或多个交互时,处理器部件550可以检测根据各种测试的执行确定的信息的变化,并且可以操作接口590,以向d模块600提供这些变化的指示作为更新后的元数据的部分。

在进一步执行控制例程540时,处理器部件550可以操作接口590以经由客户端互连199与一个或多个客户端设备100交换存储服务请求、对其的响应和/或客户端设备数据130。节点300a-d和节点300y-z中的一个或多个活动节点的客户端设备100和n模块500可以根据用于处理客户端设备数据130的客户端/服务器模型经由客户端互连199彼此交互。换言之,每个客户端设备100可以向活动以与客户端设备100通信的节点300a-d和节点300y-z中的一个或多个节点发出对于与客户端设备数据130的存储相关的存储服务的请求。在这样做时,客户端设备100和n模块500可以通过其中存储服务请求可以被传输到n模块500的客户端互连199来交换分组,响应(例如,请求的处理状态的指示)可以被传输到客户端设备100,并且客户端设备数据130可以在它们之间交换。交换的分组可以利用各种基于文件的接入协议中的任何一种,包括但不限于通过tcp/ip的通用因特网文件系统(cifs)协议或网络文件系统(nfs)协议。备选地或附加地,交换的分组可以利用各种基于块的接入协议中的任何一种,包括但不限于通过tcp(iscsi)封装的小型计算机系统接口(scsi)协议和/或通过光纤信道(fcp)封装的scsi。

此外,在执行控制例程540时,处理器部件550可以操作接口590以经由集群内互连599a与d模块600交换命令和/或数据,包括客户端设备数据130。命令和/或数据的这种交换可以使用也可以不使用其中使用分组的协议。在一些实施例中,用于实现客户端设备数据130的交换的数据访问命令可以通过集群内互连599a以可以被选择用于在存储设备集合800ab内存储客户端设备数据130时使用的任何特定文件系统不可知的方式来交换。更具体地,客户端设备数据130的部分可以在用于存储和/或检索客户端设备数据130的数据访问命令中被引用的方式可以包括按照以独立于文件系统的选择的方式来标识文件名、标识块标识符等。

鉴于通信的协议和/或其他方面可能的差异,可以使处理器部件550在经由客户端互连199与一个或多个客户端设备100的通信中采用的协议以及在经由集群内互连599a与d模块600的通信中采样的协议之间进行转换。备选地或附加地,在经由客户端互连199的通信中采用的协议中的一个或多个协议可以以实现在这种通信,以及经由集群内互连599a的通信之间的最小程度的协议转换的方式来采用文件和/或块标识。

在执行这样的协议转换时,可以使处理器部件550将来自客户端设备100之一的存储服务请求转发到d模块600作为一个或多个数据访问命令以存储和/或检索客户端设备数据130。更具体地,经由客户端互连199接收的对于检索客户端设备数据130的存储服务的请求可以被转换为经由集群内互连599a传送到d模块600的从存储设备集合800ab中检索客户端设备数据130并将客户端设备数据130提供给n模块500以由n模块500将其应答客户端设备100中的请求客户端设备的一个或多个数据访问命令。另外,经由客户端互连199接收的对于存储客户端设备数据130的存储服务的请求可以被转换为经由集群内互连599a传送到d模块600的在存储设备集合800ab内存储客户端设备数据130的一个或多个数据访问命令。

在各种实施例中,节点300a-b中的每个的d模块600包括以下中的一个或多个:处理器部件650、存储器660、经由存储互连899ab将d模块600耦合到存储设备集合800ab的存储控制器665、以及将d模块600耦合到集群内互连599a、集群间互连399和ha互连699ab中的一个或多个的接口690。存储器660存储控制例程640和元数据630ab中的一个或多个。而且,如将要详细说明的,在节点300a的d模块600中,存储器660的一部分可以被分配用作同步高速缓存(sync高速缓存)639a,而存储器660的一部分可以被类似地分配用作节点300b的d模块中的同步高速缓存639b。控制例程640包括作为d模块600的主处理器部件操作以实现用于执行各种功能的逻辑的指令序列。然而,作为节点300a活动以与一个或多个客户端设备100通信并执行数据访问命令的结果,控制例程640的不同部分可以由来自可用由节点300b的d模块的处理器部件650执行的控制例程640的一部分的节点300a的d模块600的处理器部件650来执行。因此,可以通过执行这些d模块600中的每个内的控制例程640的不同部分来实现不同的逻辑。

在执行控制例程640时,活动节点300a的d模块600的处理器部件650可以操作接口690以经由集群内互连599a从m模块400和/或n模块500接收元数据的部分和/或其更新。不管至少节点300a的操作的各方面是否经由m模块400进行远程配置和/或基于由n模块500执行的测试结果来配置,处理器部件650可以根据这些接收的元数据部分来生成指示这些方面的结果配置的元数据630ab,并且可以将元数据630ab存储在存储器660中以供处理器部件650随后使用。处理器部件650可以响应于从m模块400、n模块500和/或其他可能的更新元数据部分的源接收到元数据的更新部分来重复生成元数据630ab,从而创建处理器部件650可以在存储器660内存储的元数据630ab的更新版本以代替较早版本。

在生成元数据630ab和/或其每个更新版本之后,处理器部件650可以将元数据630ab存储在存储设备集合800ab内用于稍后检索。在随后重新启动节点300a的d模块600期间,处理器部件650可以通过其控制例程640的执行被引起访问存储设备集合800ab以检索元数据630ab。以这种方式,处理器部件650检索至少节点300a的操作的各个方面将被配置的方式的指示,包括d模块600要操作存储器设备集合800ab的方式和/或d模块600将与其他设备交互的方式的各方面(例如,节点300a的m模块400或n模块500、和/或一个或多个其他节点300b-d或300y-z的n模块500或d模块600)。可以认为理想的是,使得节点300a的d模块600能够通过独立于m模块400和/或n模块500这样做来尽可能快地获得关于至少节点300a的操作的各方面的信息。

可能存在如下情况:其中导致节点300a的多个部件(包括m模块400、n模块500和d模块600中的多于一个)的重新启动,包括但不限于实现更新、升级、存储空间的扩展、维修等。通过将元数据630ab存储在存储设备集合800ab中以便在重新启动d模块600之后进行后续检索,避免了需要d模块600在被提供再次导出元数据630ab的元数据部分之前等待完成重新启动m模块400和/或n模块500。

备选地或附加地,可能出现如下情况:其中m模块400和/或n模块500可能不起作用。举例来说,如果m模块400、n模块500和d模块600中的多于一个重新启动,则m模块400和/或n模块500可能无法成功地重新启动,使得m模块400或n模块500中的任一个对来自d模块600的在延长的时间段内提供组成元数据630ab的元数据部分的任何请求保持不响应。因此,d模块600独立地检索元数据630ab的能力可以允许d模块600仍然与其他节点300b-d和/或300y-z中的一个或多个的n模块500和/或d模块600协作,以提供客户端设备数据130的容错存储和检索,而不管节点300a的至少一些功能的丢失。

此外,在生成元数据630ab和/或其每个更新版本之后,节点300a的d模块600的处理器部件650可以操作接口690以经由ha互连699ab将元数据630ab的复录传输到非活动节点300b的d模块600的d模块600,以使得节点300b能够响应于节点300a内的故障来更快地接管活动节点300a。以这种方式,节点300b直接被提供有元数据630ab和/或其更新版本,以提供节点300b进行以下操作所需的信息:更容易地接管与一个或多个客户端设备的通信,接管与一个或多个其他节点300c-d和/或300y-z的通信,以及/或者接管对存储设备集合800ab的控制和/或访问。

在进一步执行控制例程640时,节点300a的d模块600的处理器部件650可以通过存储控制器665来操作存储设备集合800ab,以响应于经由集群内互连599a接收的数据访问命令来存储和检索客户端设备数据130,如上所述。处理器部件650可以操作接口690以经由集群内互连599a从n模块500接收数据访问命令和/或与n模块500交换数据(包括客户端设备数据130)。

除了操作存储控制器665以执行数据访问命令以将客户端设备数据130存储在存储设备集合800ab内和/或从其中检索客户端设备数据130之外,节点300a的d模块600的处理器部件650还可以复制数据访问命令并且操作接口690以经由集群间互连399将所得到的副本数据访问命令传输到其他集群1300z的ha组1600yz的节点300y-z中的活动节点的d模块600。如已经讨论过的,将这种副本数据访问命令到另一ha组中的活动节点的传输可以在客户端设备数据130的存储和/或检索方面提供额外的容错度,其中副本数据访问命令可以由另一集群的活动节点执行,至少部分与此并行地,由节点300a执行原始数据访问命令。另外,处理器部件650可以被引起重新尝试这种副本数据访问命令到ha组1600yz内的节点300y-z中的相同的活动节点和/或响应于接收或执行副本数据访问命令的错误的指示而到ha组1600yz内的节点300y-z中的不同的非活动节点的传输。

为了支持副本数据访问命令和响应在节点300a的d模块600与节点300y-z中的活动节点300y-z的d模块600之间的这种交换,节点300a的d模块600的处理器部件650可以使用被包括在元数据630ab内的信息以通过集群间互连399与该另一活动节点的d模块600形成活动通信会话。处理器部件650可以另外通过集群间互连399与节点300y-z中的非活动节点的d模块形成非活动通信会话以准备将副本数据访问命令重新传输到该非活动节点的d模块600。此外,如果处理器650重新尝试向该非活动节点的d模块600传输副本数据访问命令,则处理器部件650可以用于将与该非活动节点的d模块600形成的非活动通信会话的状态从非活动状态变为活动状态。

在执行控制例程640时,非活动节点300b的d模块600的处理器部件650可以操作接口690,以经由ha互连699ab从节点300a的d模块600接收元数据630ab和/或其更新。然后,处理器部件650可以将所接收的元数据630ab和/或接收到的其更新存储在存储器660内供随后使用。另外,由节点300a向节点300b提供元数据630ab以及其更新可以被认为是期望的,以使得节点300b能够响应于在节点300a内发生的故障更快速地接管节点300a(从而从ha组1600ab的非活动节点转换到ha组1600ab的活动节点)。更具体地,利用已经提供给节点300b的d模块600的元数据630ab,缓解了节点300b的d模块600的处理器部件650需要额外的时间从其他来源获取元数据630ab。更准确地说,缓解了处理器部件需要从存储设备集合800ab检索元数据630ab,或者在接管节点300a时从节点300a或300b中的任一个的m模块400和/或n模块500请求元数据的部分。

如图所示,元数据630ab可以包括不可变元数据631ab和可变元数据632ab。不可变元数据631ab和可变元数据632ab中的每个中包括哪些元数据可以基于预期每个元数据将改变的相对频率。作为示例,客户端设备数据130在存储设备集合800ab内的存储的各方面(诸如文件系统的选择、raid级别等)可以被认为是不可变的,因为其被认为与其他元数据相比不太可能改变或者可能不太频繁地改变。相比之下,节点300a可以经由互连399、互连599a或互连699a中的一个或多个互连与其通信的其他节点300a-d或节点300y-z之一的m模块、n模块或d模块的网络地址可能被认为是可变的,因为其被认为与其他元数据相比更可能改变或可能更频繁地改变。

由于可变元数据632ab包括被认为可能以比被包括在不可变元数据631ab中的类似指示更大的频率改变的至少节点300a的操作的各方面的指示,所以被包括在至少可变元数据632ab中的信息可以更频繁地变为过时。在重新启动节点300a的d模块600之后,如果处理器部件650尝试使用从存储设备800ab获得的可变元数据632ab中的信息与节点300a的其他部件和/或与节点300b-d和/或节点300y-z中的其他节点的部件的通信不成功,则处理器部件650可以操作接口690以经由集群内互连599a向m模块400和/或n模块500传输对于包括被包括在可变元数据632ab中的信息的更新版本的元数据部分的请求。取决于m模块400和/或n模块500是否也重新启动,可以引起处理器部件650等待其重新启动的完成,并且然后重新传输其对这些更新的元数据部分的请求。响应于接收到请求,处理器部件450和/或550可以由控制例程440和/或540的执行来引起以分别操作接口490和/或590从而经由集群内互连599a将这样的更新的元数据部分传输到d模块600。在接收到更新的信息之后,处理器部件650然后将更新的信息合并到可变元数据632ab中,再次生成包括更新的可变元数据632ab的元数据630ab,将新的更新的元数据630ab存储在存储器660和存储设备集合800ab内,并且使用存储器660内的新的更新的元数据630ab来操作接口690以再次尝试与节点300a的其他部件和/或与节点300b-d和/或节点300y-z中的其他节点的部件通信。

在一些实施例中,如果处理器部件650尝试使用包括新的更新的可变元数据632ab的元数据630ab进行通信也不成功,则处理器部件650可以操作接口690以向m模块400和/或n模块500传输对于构成不可变元数据631ab的信息的更新版本的请求。可能的是,不可变元数据631ab的更新版本包括结合使用包含在可变元数据632ab中的更新版本中的信息所需的操作的各方面的指示。在接收到更新的信息之后,处理器部件650然后可以将更新的信息合并到不可变元数据631ab中,再次生成包括更新的不可变元数据631ab的元数据630ab,将新的更新的元数据630ab存储在存储器660和存储设备集合800ab,并且使用新的更新的元数据630ab进一步尝试与节点300a的其他部件和/或与节点300b-d和/或300y-z中的其他节点的部件通信。

作为确定节点300a或节点300b中的一个是否需要接管另一节点的一部分,节点300a和节点300b中的每个节点的d模块的处理器部件650可以协作以循环地经由在其间延伸的ha互连699ab来交换其节点的状态的指示。如上所述,状态指示的这种交换可以采取循环的“心跳”信号和/或执行操作的当前状态的指示(例如,执行数据访问命令)的形式。另外,指示节点300a-b中的一个的部件已经遭遇故障可能是在规定时间段内(例如,在重复的时间间隔内)没有节点300a-b中的另一节点收到预期心跳信号或其他状态指示。如果活动节点300a的d模块600接收到非活动节点300b内的故障指示,则节点300a的d模块600的处理器部件650(或节点300a的另一部件)可以避免采取行动来接管节点300b,因为节点300b是非活动的使得节点300b可能不执行需要接管节点300b的任务。

然而,在非活动节点300b的d模块600接收到活动节点300a内的故障的指示的情况下,非活动节点300b的d模块600的处理器部件650(或非活动节点300b的另一部件)可以采取行动来接管节点300a,因为节点300a活动以与客户端设备100通信,以执行数据访问命令,并且与另一活动节点协作以引起数据访问命令在其之间的至少部分并行执行。作为示例,节点300b的d模块600的处理器部件650可以通知节点300b的n模块500接管与一个或多个客户端设备100的通信,和/或可以开始执行由节点300a的d模块600的处理器部件650执行的数据访问命令。在接管这些数据访问命令的执行时,节点300b的d模块600的处理器部件650可以经由耦合来接管存储设备集合800ab的访问和控制,使得节点300a和节点300b两者的d模块600通过存储互连899ab共享到存储设备集合800ab。

如果非活动节点300b响应于在节点300a内发生的故障而接管活动节点300a,则节点300a和节点300b的活动和非活动角色至少在节点300a内的故障已经被完成纠正之后可以完全反转。更具体地,节点300b的m模块400和n模块500可以变为活动以经由客户端互连199与客户端设备100通信,以接收配置信息和存储服务请求,并且从而接管节点300a的m模块400和n模块500,而节点300a的m模块400和n模块500变为非活动。类似地,节点300b的d模块600可以变为活动以执行和复制数据访问命令,并且经由集群间互连399将副本数据访问命令传输到另一活动节点,以实现至少部分并行执行数据访问命令,并且从而接管节点300a的d模块600,而节点300a的d模块600变为非活动。然而,在变为活动时,现在的非活动节点300a的d模块600的处理器部件650可以与节点300b的d模块600的处理器部件650协作,以接收在节点300b内生成的元数据630ab的新版本并且经由ha互连699ab与节点300b的d模块600交换状态的指示以确定节点300a随后是否应当接管现在的活动节点300b。

节点300a和300b中的每个的d模块600的处理器部件650可以分别指定或以其他方式使用存储器660中的相应存储器的一部分作为与节点300a-d和/或300y-z中的其他节点的d模块600通信的同步高速缓存639a和639b。更具体地,节点300a和300b的d模块600的处理器部件650可以分别使用同步高速缓存639a和639b来缓冲在它们之间交换的元数据630ab的版本和/或状态指示。备选地或附加地,节点300a的d模块600的处理器部件650可以维持和使用同步高速缓存639a来缓冲传输到另一集群的另一ha对中的另一活动节点的副本数据访问命令和/或从其他活动节点接收的那些副本数据访问命令的执行状态的指示。

广泛地,客户端设备100、节点300a-d和节点300y-z、m模块400、n模块500、d模块600和/或存储设备800ab、800cd和800yz中的每个可以是各种类型的计算设备中的任一种,包括但不限于台式计算机系统、数据输入终端、膝上型计算机、上网本计算机、平板电脑、手持式个人数据助理、智能电话、智能眼镜、智能手表、数码相机、合并到服装中的身体磨损计算设备、集成到车辆(例如,汽车、自行车、轮椅等)中的计算设备、服务器、服务器集群、服务器场等。

在一些实施例中,节点300a-d和节点300y-z中的一个或多个节点可以物理地实现为一个或多个m模块400、一个或多个n模块500和一个或多个d模块600的组合,每个模块被实现为通过集群内互连599a或599z中的相应互连的物理实现耦合的单独的计算设备。然而,在其他实施例中,一个或多个节点300a-d和300y-z的m模块400、n模块500和d模块600中的多于一个可以被实现为由共享处理器部件(例如,处理器部件450、550或650中的一个处理器部件)作为进程执行的指令集。在这样的其他实施例中,不在节点之间延伸的集群内互连599a或599z的至少一部分可以被实现为在共享存储器(例如,存储器460、560或660中的一个存储器)中定义的缓冲器或其他数据结构并且用于在控制例程440、540和/或640之间交换数据访问命令、客户端设备数据130和元数据630ab。

在本文中呈现的示例中,一个或多个客户端设备100可以是由一个或多个人直接操作以生成客户端设备数据130和/或与客户端设备数据130一起操作的计算设备,节点300a-d和节点300y中的一个或多个可以是用作远程存储这种客户端设备数据130并且以容错方式向客户端设备100提供对其的访问的服务器的计算设备。备选地或附加地,在本文中呈现的示例中,一个或多个客户端设备100可以是用作存储和提供对客户端设备数据130的至少一部分的访问的服务器的计算设备,并且节点300a-d和节点300y-z中的一个或多个可以是用作扩充由一个或多个客户端设备100提供的存储的附加服务器的计算设备。

图4更详细地示出了存储集群系统1000的集群1300a的ha组1600ab的另一示例实施例的框图。另外,如图所示,ha组1600ab的节点300a和节点300b中的节点300a可以是活动的以与客户端设备100通信并且执行改变存储设备集合800ab内的客户端设备数据130的操作,而节点300b可以是非活动并且等待需要接管节点300a。图4还更详细地描绘了在客户端设备数据130旁边的存储设备集合800ab内的元数据630ab的生成、复录和存储的各个方面。

存储设备的集合800ab、800cd和800yz中的每个可以由存储设备基于各种存储技术中的任何一种来构成,包括但不限于铁磁“硬盘”或“软盘”驱动器、磁光介质驱动器、光学介质驱动器、非易失性固态驱动器等。如图所示,存储设备集合800ab可以包括可以一起操作以形成一个这样的阵列的lu862t-v。在一些实施例中,节点300a的d模块600的处理器部件650可以操作存储控制器665以将存储设备集合800ab中的每个存储设备视为单独的lu和/或可以被引起将一组这些存储设备视为单个lu。多个lu可以经由存储控制器665一起操作,以实现raid级别或在其中存储数据方面提供容错的其他形式的阵列。可以在元数据630ab内规定在存储设备集合800ab中的一个或多个存储设备中定义lu的方式和/或多个lu可以一起操作的方式。

可以引起处理器部件650在单个lu内以和/或在一起操作以形成阵列的多个lu内各种方式中的任何一种分配存储空间。在这样做时,可以引起处理器部件650在单个lu内和/或在一起操作的多个lu内以各种方式中的任何一种细分存储空间。作为示例,可以实现这样的细分,作为基于主题将客户端设备数据130组织为单独的类别的一部分,作为将客户端设备数据130分解为随时间生成的不同版本的一部分,作为实现到不同的客户端设备数据130的不同访问策略的一部分等。在一些实施例中并且如图所示,在lu862t内或在lu862t-v的组合内提供的存储空间可以被指定为聚合872。此外,聚合872可以细分为卷873p-r。可以选择限定聚合和/或卷的方式以符合一个或多个广泛已知和使用的文件系统的规定,包括但不限于写入随机文件布局(wafl)。可以在元数据630ab内规定在一起运行的单个lu或多个lu之间分配聚合和/或聚合内的卷的方式。

客户端设备数据130可以完全存储在卷873p-r之一内,或者可以分布在多个卷873p-r之间(如图所示)。如图所示,元数据630ab还可以与客户端设备数据130一起存储在存储设备集合800ab内,至少在同一聚合872内。在一些实施例中,元数据630ab可以存储在与客户端设备数据130相同的一个或多个内卷873p-r内(如图所示)。在其他实施例中,元数据630ab可以存储在与可以存储客户端设备数据130的卷873p-r中的一个或多个其他卷独立的卷873p-r之一中。可以在元数据630ab内规定在聚合和/或值内组织元数据630ab和/或客户端设备数据130的方式。

如上所述,活动节点300a的m模块400可以响应于从客户端设备100之一接收到配置信息来向n模块500和/或d模块600提供元数据的部分,包括其更新。此外,活动节点300a的n模块500可以向d模块600提供元数据的部分,包括其更新,这些部分指示由n模块500执行的各种测试的结果。元数据630ab和/或其更新版本可以根据从活动节点300a的d模块600接收的元数据的这些部分来生成,然后可以将存储在存储器660中以供处理器部件650使用和/或存储在存储设备集合800ab中以在重新启动d模块600之后进行后续检索。备选地或附加地,元数据630ab的复录可以被生成并且存储在同步高速缓存639a内,作为复录数据636ab的一部分,由此元数据630ab的复录可以经由接口690和ha互连699ab被传输到非活动节点300b的d模块600。当经由节点300b的d模块600的接口690接收到时,复录数据636ab可以存储在可以从其中检索元数据630ab的复录的同步高速缓存639b内,并且存储在存储器660内的其他地方以由节点300b的d模块600的处理器部件650后续使用。

图5a和图5b更详细地示出了存储集群系统1000的活动节点300a和300y之间的互连的示例实施例的框图。更具体地,图5a更详细地描绘了节点300a和节点300y之间的数据访问命令的复制和至少部分并行执行的各方面。图5b更详细地描绘了组合和应答通过节点300a和300y的这样的至少部分并行执行生成的响应的各方面。如图5a和图5b所示,节点300a可以活动以参与与客户端设备100的通信并且执行改变存储设备集合800ab内的客户端设备数据130的数据访问命令,而节点300y可以活动以参与与节点300a的通信并且执行改变存储设备集合800yz内的客户端设备130的副本数据访问命令,至少部分与此同时与节点300a通信。

转向图5a,如上所述,活动节点300a的n模块500可以从客户端设备100之一接收客户端设备数据130和/或存储服务请求170,其然后可以临时存储在存储器560内。存储和/或检索客户端设备数据130的存储服务请求170然后可以分别被转换成存储和/或检索客户端设备数据130的数据访问命令570。在发生这样的转换之后和/或时,客户端设备数据130和/或存储服务请求170可以被中继到活动节点300a的d模块600,其中客户端设备数据130和/或存储服务请求170然后可以临时存储在存储器660中,以准备由节点300a的d模块600执行。然而,除了这种执行之外,数据访问命令570可以被复制以生成可以作为复制数据633a的一部分存储在同步高速缓存639a内的相应的副本数据访问命令670。复制数据633a可以用作缓冲器,其内容经由接口690和集群间互连399循环地传输到活动节点300y的d模块600。如果副本数据访问命令670包括存储客户端设备数据130的命令,则这样的客户端设备数据可以作为要与副本数据访问命令670一起传输到节点300y的复制数据633a的另一部分而存储在同步高速缓存639a内。

在经由节点300y的d模块600的接口690接收到之后,复制数据633a的循环传输的内容可以作为复制数据633y的一部分临时存储在同步高速缓存639y内。然后,所接收的副本数据访问命令670和/或相关联的客户端设备数据130可以从复制数据633y检索并且临时存储在存储器660内的其他地方以准备由节点300y的d模块600执行副本数据访问命令670。节点300y的d模块600然后执行副本数据访问命令670,以将客户端设备数据130存储在存储设备集合800yz中并且/或从存储设备集合800yz检索客户端设备数据130,至少部分与此并行地,节点300a的d模块600执行数据访问命令570以类似地将客户端设备数据130存储在存储设备集合800ab内和/或从存储设备集合800ab检索客户端设备数据130。

转向图5b,当副本数据访问命令670由节点300y的d模块600执行时,关于这些副本数据访问命令670的执行的命令响应679可以被生成,并且可以临时存储在同步高速缓存639y中作为复制数据633y的一部分。命令响应679可以包括以下中的一个或多个:副本数据访问命令670的执行的成功启动和/或完成的指示,和/或尝试执行副本数据访问命令670时出现故障的指示。复制数据633y可以用作缓冲器,其内容经由接口690和集群间互连399循环地传输到活动节点300a的d模块600。如果副本数据访问命令670包括检索客户端设备数据130的命令,则这样的客户端设备数据可以存储在同步高速缓存639y中作为复制数据633y的另一部分,以与命令响应679一起传输回节点300a。

在经由节点300a的d模块600的接口690接收到之后,复制数据633y的循环传输的内容可以作为复制数据633a的一部分临时存储在同步高速缓存639a内。然后,所接收的命令响应679和/或相关联的客户端设备数据130可以从复制数据633a检索并且临时存储在存储器660内的其他地方以准备分析由节点300a的d模块600的数据访问命令570的执行结果。节点300a的d模块600然后从这样的分析生成命令响应579,并且将命令响应579和/或相关联的数据130中继到节点300a的n模块500,其中的一者或两者可以临时存储在存储器560内。命令响应579然后可被转换为存储服务请求响应179,然后请求响应179和/或相关联的客户端设备数据130可以被传输回客户端设备100之一。

图6更详细地描绘了ha组内的元数据的复录以及与不同ha组中的节点之间的客户端设备数据130相关的数据访问命令的复制的示例实施例。如图所示,节点300a可以在ha组1600ab内活动以经由客户端互连199与客户端设备100进信并且与节点300y通信,节点300y可以在ha组1600yz内活动以经由集群间互连399与节点300a通信。节点300b和300z可以不活动,因为每个节点等待需要分别接管节点300a或300y。用于与客户端设备100通信使得节点300a的n模块500正在使用以这样做的节点300a的活动状态由用实线绘制的将节点300a耦合到客户端设备100的客户端互连199的部分来指示,而将节点300b和300y-z耦合到客户端互连199的部分用虚线绘制。用于彼此通信的两个节点300a和300y的活动状态由用实线绘制的耦合节点300a和300y的集群间互连399的部分指示,而用于将节点300b和300z耦合到集群间互连399的部分用虚线绘制。

如图所示,同步高速缓存639a-b和639y-z可以分别形成在每个节点300a-b和300y-z的d模块600的存储器660内,以便能够复录上述元数据和/或复制数据访问命令。如上所述,同步高速缓存639a和639b可以包括复录数据636ab作为实现合作节点300a和300b的d模块600之间的协作以便交换元数据630ab的一部分。然而,同步高速缓存639a-b和/或复录数据636ab也可以用于交换在节点300a和300b的d模块600之间发生的状态,作为每个节点监测另一节点的可能需要由另一节点300a-b接管一个节点的故障的指示的一部分。同步高速缓存639a和639b可以以它们在功能上链接的方式操作,以在可以在ha互连699ab的两端缓冲的节点300a和节点300b的d模块600之间提供入口。可以通过将这种指示和/或元数据写入同步高速缓存639a或639b之一的复录数据636ab中并且检索这些指示和/或来自同步高速缓存639a或639b中的另一个的复录数据636ab的元数据来交换这些d模块600的当前状态和/或元数据630ab的版本的复录的指示。换言之,复录数据636ab的内容可以在同步高速缓存639a和639b之间循环地“同步”。

如上所述,同步高速缓存639y可以包括作为与同步高速缓存639a内的复制数据633a的对应的复制数据633y,作为节点300a和300y的d模块600之间的协作的一部分,以至少部分并行地执行数据访问命令及其副本。复制数据633a和复制数据633y可以经由集群间互连399来缓冲在节点300a和节点300y的d模块600之间传送的信息。更具体地,由节点300a的d模块600复制数据访问命令的当前状态的指示、由至少节点300y的d模块600至少部分并行执行副本数据访问命令的当前状态、和/或与副本数据访问命令有关的在其之间的通信的当前状态可以被维持作为复制数据633a的部分。备选地或附加地,传输到节点300y的d模块600的副本数据访问命令、与这些副本数据访问命令一起和/或响应于这些副本数据访问命令传送的客户端设备数据130的部分也可以被维持作为复制数据633a的部分。相应地,由节点300y的d模块600经由集群间互连399从节点300a的d模块600接收的副本数据访问命令可以与伴随着这些副本数据访问命令和/或对其的响应的任何客户端设备数据130一起缓存在复制数据633y中。在节点300y的d模块600执行这些副本数据访问命令的当前状态的指示被传输到节点300a的d模块600之前也缓存在复制数据633y中。

如进一步所示,同步高速缓存639y和同步高速缓存639z可以包括复录数据636yz作为实现合作节点300y和300z的d模块600之间的协作的一部分,以便以与上述大致相同的方式在节点300a和节点300b的d模块600之间交换状态指示和元数据的复录。换言之,节点300y和节点300z的d模块600可以协作以经由ha互连699yz循环地交换状态指示(例如,“心跳”信号和/或各种操作的执行状态),作为每个节点以与合作节点300a和300b经由ha互连699ab交换信号以便彼此监测的方式不同的方式监测另一节点故障指示的一部分。此外,活动节点300y的d模块600可以以不同于合作节点300a和300b交换元数据版本的方式经由ha互连699yz将元数据的版本传输到非活动节点300z的d模块,除了在存储设备集合800yz内存储这些版本之外。应当注意,由节点300y和300z使用和在其之间交换的元数据可以至少部分地不同于由节点300a和节点300b使用和在其之间交换的元数据630ab。这可能至少部分地是由于节点300a-b和节点300y-z属于不同的ha组和/或属于不同的集群。

图7更详细地描绘了通过集群间互连399在节点300a-b和300y-z之间形成的通信会话的网格的示例实施例。更具体地,通过集群间互连399,ha组1600ab的每个节点300a和300b与ha组1600yz的每个节点300y和300z形成通信会话,从而形成在节点300a-b和300y-z之间的所描述的通信会话网格。如图所示,这些通信会话中的在节点300a和节点300y之间延伸的通信会话可以是活动通信会话(如实线所示),而这些通信会话中的其他会话可以是非活动通信会话(如虚线所示)。这反映了如下事实:节点300a和300y至少最初分别是ha组1600ab和1600yz的活动节点,这些活动节点参与通信以交换副本数据访问命令和相关联的数据以使得能够在ha组1600ab和1600yz之间至少部分地并行执行数据访问命令。

因此,在其中节点300a和节点300y是活动节点并且在节点300a或300y内的任何一个中没有出现错误的存储集群系统1000的正常操作期间,节点300a经由客户端互连199从客户端设备100之一接收对存储服务的请求。在存储服务请求被节点300a的n模块500转换成数据访问命令之后,节点300a的d模块600可以开始执行数据访问命令,并且经由在节点300a和300y之间通过集群间互连399形成的活动通信会话,将该数据访问命令的副本传输到节点300y。节点300y的d模块600然后可以执行副本数据访问命令,至少部分与此并行地,节点300a的d模块600执行数据访问命令。

为了准备这样的传输,节点300a的d模块600可以与节点300y的d模块600协作,以通过交换请求和接受活动通信会话的形成的消息来在节点300a到节点300y之间形成活动通信会话。在其形成之后,节点300a和300y的d模块600可以协作以通过循环交换测试信号(例如,测试消息)以监测活动通信会话的状态来维持活动通信会话。

除了节点300a和节点300y的d模块600协作以通过集群间互连399形成和维持所描绘的活动通信会话以支持这种副本数据访问命令的交换,所有节点300a-b和节点300y-z的d模块600可以协作以通过集群间互连399形成和维持所描绘的非活动通信会话,以准备处理影响节点300a或节点300y之一的错误状况。更具体地,可以通过一个或多个非活动通信会话来交换测试信号(例如,测试消息)以监测其状态。

在节点300a的至少一部分发生故障的情况下,节点300b可以接管节点300a,并且这样做可以将在节点300b和节点300y的d模块600之间延伸的非活动通信会话的状态改为活动通信会话。通过这样做,节点300b能够将副本数据访问命令传输到节点300y而非节点300a。相应地,在节点300y的至少一部分发生故障的情况下,节点300z可以接管节点300y,并且这样做可以将在节点300a和节点300z的d模块600之间延伸的非活动通信会话的状态改为活动通信会话。通过这样做,节点300z变得能够从节点300a而非节点300y接收并执行副本数据访问命令。

在各种实施例中,处理器部件450、550和650中的每个处理器部件可以包括各种商业可用处理器中的任何一种。此外,这些处理器部件中的一个或多个可以包括多个处理器、多线程处理器、多核处理器(而不管多个核共存在同一还是单独的管芯上)、以及/或者多个物理上分开的处理器以某种方式链接的某个其他种类的多处理器架构。

在各种实施例中,控制例程440、540和640中的每个控制例程可以包括操作系统、设备驱动器和/或应用级例程中的一个或多个(例如,在盘介质上提供的所谓的“软件套件、从远程服务器获取的“小程序”等)。如本领域技术人员所认识到的,控制例程440、540和640中的每个控制例程(包括可以组成其的部件)被选择用于确定可以选择哪个或哪些类型的处理器来实现可应用的处理器部件450、550或650,或者用于确定可以选择哪个或哪些类型的处理器来实现共享处理器部件。特别地,在包括操作系统的情况下,操作系统可以是适合于处理器部件450、550或650中的相应处理器部件或适合于共享处理器部件的多种可用操作系统中的任何一种。而且,在包括一个或多个设备驱动器的情况下,这些设备驱动器可以为各种其他部件提供支持,而不管模块400、模块500或模块600中的相应模块是硬件还是软件部件。

在各种实施例中,存储器460、存储器560和存储器660中的每个存储器可以基于各种各样的信息存储技术中的任何一种,可能包括需要不间断地提供电力的易失性技术,并且可能包括使用可能是或可能不是可移除的机器可读存储媒体的技术。因此,这些存储器中的每个可以包括各种类型(或类型的组合)的存储设备中的任何一种,包括但不限于只读存储器(rom)、随机访问存储器(ram)、动态ram(dram)、双数据速率dram(ddr-dram)、同步dram(sdram)、静态ram(sram)、可编程rom(prom)、可擦除可编程rom(eprom)、电可擦除可编程rom(eeprom)、闪存、聚合物存储器(例如,铁电聚合物存储器)、超声波存储器、相变或铁电存储器、氧化硅氧化物氧化物硅(sonos)存储器、磁或光卡、一个或多个单独的铁磁盘驱动器、或者被组织成一个或多个阵列的多个存储设备(例如,被组织成独立磁盘冗余阵列或raid阵列的多个铁磁盘驱动器)。应当注意,尽管这些存储器中的每个被描绘为单个块,但是这些存储器中的一个或多个可以包括可以基于不同存储技术的多个存储设备。因此,例如,这些描绘的存储器中的每个中的一个或多个可以表示通过其可以在某种形式的机器可读存储介质上存储和传送程序和/或数据的光驱动器或闪存卡读卡器的组合、用于在相当长的时间段内本地存储程序和/或数据的铁磁盘驱动器、以及使得能够相对快速地访问程序和/或数据(例如,sram或dram)的一个或多个易失性固态存储器件。还应当注意,这些存储器中的每个可以由基于相同存储技术的多个存储部件组成,但是这些存储部件由于使用的专门化而被单独地维持(例如,一些dram设备用作主存储器,而其他dram器件用作图形控制器的不同帧缓冲器)。

在各种实施例中,接口490、接口590和接口690可以采用各种各样的信令技术中的任一种,使得这些计算设备能够如已经描述的那样耦合到其他设备。这些接口中的每个包括提供实现这种耦合的电路必要的至少一些功能。然而,这些接口中的每个也可以至少部分地由处理器部件中的相应处理器部件执行的指令序列来实现(例如,以实现协议栈或其他特征)。在采用电和/或光传导布线的情况下,这些接口可以采用符合各种行业标准中任何一种的信令和/或协议,包括但不限于rs-232c、rs-422、usb、以太网(ieee-802.3)或ieee-1394。在需要使用无线信号传输的情况下,这些接口可以采用符合各种行业标准中的任何一种的信令和/或协议,包括但不限于ieee802.11a、802.11b、802.11g、802.16、802.20(通常称为作为“移动宽带无线接入”);蓝牙;zigbee;或具有通用分组无线电业务(gsm/gprs)的蜂窝无线电话服务(诸如gsm)、cdma/1xrtt、用于全球演进的增强数据速率(edge)、仅演进数据/数据优化(ev-do)、数据和语音演进(ev-dv)、高速下行链路分组接入(hsdpa)、高速上行链路分组接入(hsupa)、4glte等。

如已经详细讨论的,存储和访问客户端设备数据130时的冗余可以通过在属于不同集群的不同ha组的至少两个节点之间至少部分并行执行数据访问操作来提供,这些节点可能在地理上分散。如本领域技术人员所熟悉的,在协调在地理上远离的位置发生的这种执行时,呈现出各种挑战,包括在长距离传送命令中施加的延迟。通过在这样的长距离传输中使用网络可以施加进一步的挑战,包括接收命令的复录和/或以不同于它们被传输的顺序和/或从它们将被执行的顺序的顺序接收命令。

图8更详细地示出了存储集群系统1000的活动节点300a和300y之间的互连的另一示例实施例的框图。更具体地,图8描绘了使用可以被分配给单独的数据访问命令和/或数据访问命令的集合以使得能够更好地协调节点300a和节点300y的d模块600之间的数据访问命令的至少部分并行执行和/或取消的标识符的各方面。如图所示,节点300a可以有效地参与与客户端设备100的通信并且执行数据访问命令,而节点300y可以有效地参与与节点300a的通信并且执行副本数据访问命令,至少部分与此并行地与节点300a通信。

如图所示,节点300a和节点300y中的每个的d模块600内的控制例程640可以包括生成部件641、分组部件642、排序部件645、访问部件648和通信部件649中的一个或多个。在执行控制例程640时,这些d模块600中的每个的处理器部件650可以执行控制例程640的部件641、642、645、648或649中的一个或多个部件。然而,由于由处理器部件650在活动节点与非活动节点中执行的控制例程640的部分之间存在差异,由活动以执行数据访问命令的节点与活动以执行副本数据访问命令的节点中的处理器部件执行的控制例程640的部分中也可能存在差异。更具体地,节点300a的d模块600的处理器部件650可以执行部件641、642、648和649中的一个或多个部件(用实线绘制),但是可以避免执行部件645(用虚线绘制)。相反,节点300y的d模块600的处理器部件650可以执行部件645、648和649中的一个或多个(用实线绘制),但是可以避免执行部件641和642(用虚线绘制)。

在每个节点300a和300y的d模块600内,通信部件649可以操作接口690以与其他节点的部件(例如,其他节点的d模块600)和/或同一节点的其他部件(例如,同一节点的n模块500)交换命令和/或数据。更具体地,在节点300a内,通信部件649可以从n模块500接收数据访问命令,并且可以经由集群间互连399将被组织成副本数据访问命令的集合的副本数据访问命令传输到活动节点300y的d模块600。通过将这些副本命令集传输到节点300y,每个副本命令集可以被分解成并且以分开的网络分组中传送的部分进行传输。在节点300y内,按照与这些部分被传输的顺序不同的顺序和/或以集群间互连399可以扩展通过其的网络(诸如因特网)所引起的一定程度的复录,通信部件649可以从节点300a的d模块600接收部分副本命令集。如上所述,在经由互连399交换副本数据访问命令时,分别被保持在同步高速缓存639a和639y内的复制数据633a和633y可用于缓冲这种交换。

在每个节点300a和300y的d模块600内,访问部件648可以操作存储控制器665,以分别对存储在存储设备集合800ab和800yz中的客户端设备数据130执行各种数据访问操作。更具体地,在节点300a内,访问部件648可以执行从存储服务请求转换并由节点300a的n模块500提供的数据访问命令。在节点300y内,访问部件648可以通过复制节点300a的n模块500提供并经由集群间互连399被提供给节点300y的数据访问命令来执行节点300a的d模块600生成的副本数据访问命令。如上所述,数据访问命令和从其导出的副本数据访问命令的执行可以至少部分地并行发生。

在节点300a的d模块600内,如上所述,生成部件641可以根据从m模块400和/或n模块500接收的元数据的部分生成元数据630ab的版本。如也已经讨论的,生成部件641可以根据需要从m模块400和/或n模块500中的一者或两者请求更新的元数据部分,以在重新启动节点300a的至少d模块600之后,响应于使用从存储设备集合800ab检索到的元数据630ab的不成功尝试,更新构成元数据630ab的可变和/或不可变元数据。

在节点300a的d模块600内,分组部件642可以将从n模块500接收的数据访问命令中的多个数据访问命令分组成命令集,并且可以相应地将从副本数据访问命令复制的匹配的副本数据访问命令分组为匹配的副本命令集。分组部件642可以向匹配的数据访问命令和副本数据访问命令分配匹配的序列id,和/或可以向匹配的命令集和副本命令集分配匹配的集合id。响应于重复的时间间隔,响应于数据访问命令的特性,和/或响应于可能会影响数据访问命令的执行的元数据630ab的改变,分组部件642可以形成新的命令集和匹配副本命令集。在新的命令集的推导可以基于时间间隔的推移的情况下,分组部件642可以采用d模块600的时钟655来监测时间的流逝。

在节点300y的d模块600内,排序部件645可以使用集合id和/或序列id来重新组合一个或多个副本命令集,因为其部分由节点300y经由集群间互连399从节点300a接收。在这样做的情况下,排序部件645可以至少使用集合id来确定哪些网络分组正在传送已经被接收的副本命令集的部分,使得这些部分是冗余的,并且使得传送这些冗余部分的网络分组可以作为冗余被丢弃。排序部件645还可以至少使用设置的id来调节稍后的副本命令集中的副本数据访问命令的执行的开始,以便确定是否完成了较早副本命令集中的副本数据访问命令的执行。排序部件645还可以进一步至少使用集合id来协调至少部分地与节点300a并行的数据访问命令的执行的取消,包括采用集ids来确定什么网络分组正在传送副本命令集的部分,包括不执行的副本数据访问命令,使得这些部分是冗余的,并且使得传送这些冗余部分的网络分组可以作为冗余被丢弃。

图9a和9b一起以更详细地描绘了生成和使用具有匹配集id的匹配命令集和副本命令集以协调数据访问命令和副本数据访问命令的至少部分并行执行和/或部分并行执行取消的各方面。更具体地,图9a描绘了将数据访问命令570分组成命令集572以及将匹配副本数据访问命令670分组成匹配副本命令集672的各方面。图9a还描绘了分别向匹配命令集572和副本命令集672分配匹配集合id573和673的各方面。图9b描绘了至少采用副本命令集672的集合id673来重新组合可以按照与它们被传输到副本命令集672中的顺序不同的顺序来接收的副本命令集672的部分的各方面。图9a和9b描绘了至少采用集合id573和673以协调规定的数据访问命令和匹配的副本数据访问命令的取消的各方面。

转向图9a,分组部件642可以包括id部件6421、复制部件6422和取消部件6425中的一个或多个。如上所述,通信部件649可以操作接口690以从节点300a的n模块500接收数据访问命令570,并且可以将这些数据访问命令570中继到分组部件642。分组部件642可以将多个数据访问命令570分组成多个命令集572。在形成命令集572时,分组部件642可以保持在每个命令集572内分组在一起的数据访问命令570之间执行数据访问命令570的顺序,并且可以以基于命令集572之间的数据访问命令570的执行顺序的顺序来形成命令集572。数据访问命令570的执行顺序可以由n模块500导出,作为将存储服务请求转换为数据访问命令570的一部分。如上所述,可能存在由n模块500接收的单个存储服务请求被转换成多个数据访问命令570的情况。此外,作为向d模块600提供数据访问命令570的一部分,数据访问命令570的执行顺序可以由n模块500指示给d模块600。例如,n模块500可以按照这样的顺序向d模块600提供数据访问命令570。

作为保留数据访问命令570的执行顺序的一部分,id部件6421可以生成序列id571并将其分配给每个数据访问命令570。在一些实施例中,序列id571可以是可以通过递增或递减每个数据访问命令570的值而生成的有序值(例如,整数),并且可以按照有序值的升序或降序被分配给数据访问命令570以指示数据访问命令570将被执行的顺序。因此,为每个数据访问命令570生成新的序列id571可能需要递增或递减由id部件6421操作的计数器。备选地或附加地,序列id571可以至少部分地基于当前时间。更具体地,id部件6421可以从时钟655循环地检索当前时间,并且可以基于节点300a的d模块600接收到每个数据访问命令570的时间,基于分配序列id571的时间,和/或基于发生涉及每个数据访问命令570的不同事件的时间,来生成并且向每个数据访问命令570分配序列id571。在序列id571基于时间的情况下,序列id571可以是包含时间和日期的有序值,并且可以按照有序值的升序来分配,以指示数据访问命令570的执行顺序。

应当注意,虽然d模块600在本文中被描绘和讨论为生成序列id571,但是其他实施例也是可能的,其中序列id571由n模块500生成,使得由具有已经分配的序列id571的d模块600接收数据访问命令570。鉴于由n模块500生成数据访问命令570作为转换从一个或多个客户端设备100接收到的存储服务请求的一部分,这可以被认为是期望的。实质上,可以认为更有效的是当数据访问命令570如此生成时,向每个数据访问命令570分配序列id571。

不管生成每个数据访问命令570的序列id571的确切方式,在一些实施例中,每个命令集572的集合id573可以基于每个命令集572中包括的一个或多个数据访问命令570的序列id571。如上所述,数据访问命令570可以被分组以按照每个命令集572内的数据访问命令570的执行顺序被保留的方式来形成命令集572,和/或命令集572可以按照遵循数据访问命令570的执行顺序的顺序来形成。例如,在一些实施例中,每个命令集572的集合id573可以基于要首先执行或者要最后执行的每个命令集572中的数据访问命令570的序列id571。这可能是这样的情况,其中序列id571以某种方式基于从时钟655重复检索的时间。在其他实施例中,集合id573可以是可以通过递增或递减每个命令集572的值而生成的有序值(例如,整数),其按照有序值的升序或降序,以指示要相对于其他命令集572内的数据访问命令570来执行每个命令集572内的数据访问命令570的顺序。因此,为每个命令集572生成新的集合id573也可能需要递增或递减由id部件6421操作的计数器。

由于命令集572可以按照遵循数据访问命令570的执行顺序的顺序形成,和/或以保持每个命令集572内的顺序的方式对数据访问命令570进行分组来形成,由分组部件642确定什么数据访问命令570处于每个命令集572中的开始和结束(在执行顺序方面)可以基于与分组到每个命令集572中的数据访问命令570相关联的最大时间间隔。更具体地,元数据630ab可以包括与分组到任何命令集572中的数据访问命令570相关联的最大时间间隔的指示。在一些实施例中,这可以规定可以从n模块500接收要被分组在一起的多个数据访问命令570的时间间隔,使得没有命令集572可以包括花费比从n模块500接收的最大时间间隔更长的时间的对数据访问命令570的分组。在其他实施例中,这可以规定要执行任何命令集572内的多个数据访问命令570所需的最大时间间隔。或者,在其他实施例中,元数据630ab可以规定要包括在任何命令集572中的数据访问命令570的最大量。

通信部件649可以操作接口690以从节点300a的m模块400和/或n模块500接收元数据的部分,并且通信部件649可以将元数据的这些部分中继到生成部件641。从元数据的至少这些部分,生成部件641可以生成元数据630ab的一个或多个版本。被中继到生成部件641的元数据的这些部分中的一个或多个可以包括可以与一起分组到任何一个命令集572中的数据访问命令570相关联的最大时间间隔的指示、和/或可以一起分组到可以在元数据630ab中提供的任何一个命令集572中的数据访问命令570的最大量的指示。

备选地或附加地,分组部件642可以基于数据访问命令570本身的一个或多个特性来对每个分组部件642内的一个或多个数据访问命令570进行分组。在一些实施例中,分组部件642可以将数据访问命令570分组在一起,其中没有两个数据访问命令570与客户端设备数据130的相同部分相关联,和/或其中没有两个数据访问命令570访问存储设备的相同部分。可以认为理想的是,从可以按照与由它们的序列id指示的顺序不同的顺序执行的数据访问命令570形成命令集572的至少子集而不产生不良影响(例如,在不产生竞争条件的情况下,存储在存储装置800ab或800yz中的一个内的客户端设备数据130的状态根据其中一个这样的命令集中的数据访问命令570的执行顺序而不同)。例如,可以基于以下事实将读取客户端设备数据130的不同部分的连续的一系列数据访问命令570在命令集572内分组在一起:执行这些数据访问命令570的顺序不影响存储在存储设备集合800ab或800yz之一内的客户端设备数据130的状态。

另外,备选地或附加地,基于哪些数据访问命令570将用元数据630ab的较早版本执行以及哪些数据访问命令570将用元数据630ab的稍后版本来执行,分组部件642可以将数据访问命令570分组成两个单独的命令集572。如已经讨论的,元数据630ab可以规定在存储设备集合800ab内存储客户端数据130和/或从其中检索客户端设备数据130的部分的各个方面。结果,元数据630ab的新版本可以由改变这些方面中的一个或多个的生成部件641生成,并且一些数据访问命令570可以与元数据630ab的较早版本相关联,使得它们旨在在这样的更改生效之前执行,而其他数据访问命令570可以与元数据630ab的新版本相关联,使得它们旨在在这样的改变生效之后执行。作为响应,分组部件642可以将与元数据630ab的较早版本相关联的数据访问命令570分组到较早命令集572中,同时将与元数据630ab的新版本的相关联的其他数据访问命令570分组到稍后命令集572中。实际上,这两个命令集中的后者可以紧跟这两个命令集中的前者,使得它们之间的转换与在元数据630ab的新版本中规定的更改的生效相一致。

分组部件642可以将每个命令集572提供给访问部件648,以在形成每个命令集572时执行。由于命令集572可以按照遵循数据访问命令570的执行顺序的顺序来形成,所以在执行它们时向访问部件648提供每个命令集572将导致访问部件648按照它们要执行的顺序来接收数据访问命令570。仍然,在一些实施例中,访问部件648可以采用被分配给每个数据访问命令570的序列id,以确保访问部件648操作存储控制器665以按照它们意图被执行的顺序执行数据访问命令570。

当命令集572被形成和/或被提供给访问部件648时,复制部件6422可以以副本命令集672的形式生成命令集572的副本。每个副本命令集672可以被生成以匹配一个命令集572,包括具有与匹配的命令集572的集合id573匹配的集合id673。因此,每个副本命令集合672可以包括与分组为命令集572之一的多个数据访问命令570匹配的多个副本数据访问命令670,并且可以为该多个副本数据访问命令670分配与被分配给该多个数据访问命令570的序列id571相匹配的序列id671。复制部件6422可以将每个副本命令集672作为复制数据633a的一部分存储在同步高速缓存639a内,以使得节点300a的d模块600的通信部件649能够操作节点300a的接口690以将每个副本命令集672经由集群间互连传输到节点300y的d模块600。

转向图9b,节点300y的d模块600的通信部件649可以操作节点300y的接口690,以从节点300a的d模块600接收副本命令集672,并且可以临时将副本命令集672作为复制数据633y的一部分存储在同步高速缓存639y内。排序部件645可以从复制数据633y中检索副本命令集672,并且按照遵循副本命令集672中的副本数据访问命令670执行顺序的顺序将检索的副本命令集672提供给访问部件648。然后,访问部件648可以操作节点300y的d模块600的存储控制器665,以执行由排序部件645提供的每个副本命令集672中的副本数据访问命令670。

如上所述,在一些实施例中,集群间互连399可以通过网络(例如,网络999)进行路由。根据该网络的各种特性,例如该网络是否采用基于分组的协议,每个副本命令集672可以分解成多个部分,每个部分可以通过该网络在单独的网络分组中传送。因此,当从集群间互连399接收到传送这些部分的网络分组时,节点300y的d模块600的通信部件649可以重新组合复制数据633y中的每个副本命令集672的多个部分。

如本领域技术人员所熟悉的,一些网络可以以不同分组通过构成网络的不同连接采取不同路径的方式进行架构,使得分组可以以不同于它们被传输装置传输的顺序的顺序在接收设备处接收。以不同于传输的顺序接收分组的这种可能性可能导致构成单个副本命令集672的分组按照不同于由节点300a的接口690传输的顺序到达节点300y的接口690。因此,可能需要延迟已经接收到的该单个副本命令集672中的至少一些副本数据访问命令670的执行被延迟,直到传送该相同副本命令集672中的其他副本数据访问命令670的分组也被接收,并且这些其他副本数据访问命令670已经被执行。同样,这可以不管以按照对应于要执行副本数据访问命令670的顺序的顺序传输分组。

备选地或附加地,以与传输不同的顺序接收分组的这种可能性可能导致构成多个副本命令集672的分组无序地到达节点300y的接口690,使得在较早传输的副本命令集672中的所有副本数据访问命令670之前接收到稍后传输的副本命令集672中的所有副本数据访问命令670。假设较早传输的副本命令集672中的副本数据访问命令670必须在稍后传输的副本命令集672中的副本数据访问命令670之前完全执行,稍后传输的(但较早接收的)副本命令集672中的副本数据访问命令670的执行可能需要被延迟,直到较早传输的副本命令集672中的所有副本数据访问命令670被接收并执行。

排序部件645可以与通信部件649协作,以按照遵循副本数据访问命令670的预期执行顺序的顺序根据从集群间互连399接收的分组重新组合同步高速缓存639y中的多个副本命令集672的部分,而不管这些分组被接收的顺序。节点300a的d模块600的通信部件649可以在传输该部分的网络分组内包括在网络分组内传送的副本命令集672的每个部分所属于的副本命令集672的集合id673的指示。节点300y的d模块600的通信部件649然后可以使用如此包括在每个接收到的网络分组中的集合id673将该网络分组内的副本命令集672的传送部分与可能在重新组合之中的副本命令集672之一相匹配。在每个这样的网络分组中这样使用集合id673可以提供一种机制,以比分析包含在这样的网络分组中传送的每个部分内的副本数据访问命令670的序列id671并且然后将这些序列id671与特定副本命令集672相匹配更快地重新组合副本命令集672。

对于本领域技术人员来说也是熟悉的,一些网络还可以以导致冗余网络分组的创建的方式构建,因为网络分组从连接传送到连接以组成这样的网络。冗余网络分组的这种创建可以被认为是网络架构中的期望特征,以提供一定程度的冗余以确保每个传输的分组在其预期的目的地被接收,和/或可以被认为是期望的特征以通过使冗余网络分组在网络沿不同路径并行地传送来加速网络分组的递送,作为寻找到达目的地的最快路径的机制。然而,这可能导致在节点300y的接口690处多次接收到副本命令集672的相同部分。

排序部件645可以与节点300y的d模块600的通信部件649协作,以使用包括在每个网络分组中的集合id673作为比通过分析副本数据访问命令670的序列id更快地标识至少一些冗余分组的机制,从而允许这些冗余网络分组被更快地丢弃。排序部件645可以跟踪已经完全重新组合的副本命令集672的集合id673,使得接收到的包括这种完全重新组合的副本命令集672的集合id673的任何更多的网络分组必须是冗余的,因为该完全重新组合的副本命令集672没有更多部分仍然等待该副本命令集672被完全重新组合。备选地或附加地,排序部件645可以跟踪副本命令集672的集合id673,其中副本数据访问命令670已经被访问部件648完全执行,使得包括这样的完全执行的副本命令集672的集合id673的接收到的任何更多的网络分组必须是冗余的。排序部件645可以向通知部件649循环地传送这种完全重新组合和/或完全执行的副本命令集672的集合id673的指示,以使得通信部件649能够更快地标识和丢弃这样的冗余网络分组。

在集合id573和673是由id部件6421(和/或由节点300a的n模块500的部件)通过递增或递减计数器生成的有序值的实施例中,排序部件645可以分别递增或递减由排序部件645操作的相应计数器,以指示由节点300y的d模块600的访问部件648最近完全执行的副本命令集672的集合id673。排序部件645可以向节点300y的d模块600的通信部件649循环地提供该计数器的当前值,以与传送副本命令集672的部分的每个接收到的网络分组中包括的集合id673进行比较,以标识要丢弃的冗余网络分组。作为示例,在其中集合id673是通过递增计数器生成的有序值使得以副本数据访问命令670的正确的执行顺序组织副本命令集672需要排序副本命令集672以按有序值升序具有其集合id673的实施例中,节点300y的d模块600的通信部件649可以丢弃包含具有等于或小于当前计数器值的值的集合id673的每个接收到的分组。另外,与分析在每个分组内传送的副本命令集672的部分内传送的副本数据访问命令670的序列id671以确定这些特定副本数据访问命令670是否已经被较早接收和/或执行相比,这可以提供一种更快的机制来确定哪些网络分组要作为冗余而被丢弃。

如上所述,将数据访问命令570分组成命令集572可以至少部分地基于标识可以无序地执行而不产生不良影响(例如,不产生竞争条件)的要分组在一起的连续数据访问命令570的集合。因此,从这样的命令集572导出的副本命令集672可以包括可以由节点300y的d模块600的访问部件648无序地执行而没有这样的不良影响的副本数据访问命令670的集合。因此,即使排序部件645以维持其中的副本数据访问命令670的期望执行顺序的方式重新组合每个副本命令集672,并且即使排序部件645按照遵循预期的执行顺序的顺序将副本命令集672提供给访问部件648,访问部件648可以在各个命令集672中无序地执行副本数据访问命令670。这可以被认为是期望的,以使得访问部件648能够更好地优化对存储设备集合800yz执行副本数据访问命令670的速度。

图10a和图10b一起描绘了传输和接收包括集合id673的网络分组674以通过网络999经由在至少节点300a和300y之间延伸的集群间互连399传送副本命令集672的实施例的各方面。更具体地,图10a描绘了经由集群间互连399从节点300a到节点300y的副本命令集672的示例(包括集合id673的示例)的传输。图10b描绘了节点300y经由集群间互连399从节点300a接收副本命令集672的示例(包括集合id673的示例)。

转向图10a,作为复制数据633a的一部分,在同步高速缓存639a内形成示例副本命令集672j和672k(每个都是副本命令集672的实例)。在一些实施例中,在同步高速缓冲存储器639a内部发送和从同步高速缓存639a传输副本命令集672的方式可以类似于双缓冲器。更具体地,可以分配由复制数据633a占据的同步高速缓存639a内的一对位置,使得在两个部分中的一个部分中形成新的副本命令集672,同时要被完全形成的最后的副本命令集672被传输到两个部分中的另一部分外部的节点300y。因此,如图所示,完全形成的副本命令集672j的部分可以经由互连399被传输到网络分组674中的节点300y,而分组部件642形成下一副本命令集672k。在完成副本命令集672k的形成之后,命令集672k的部分也将在网络分组674内部分地传输,而另一副本命令集将形成在副本命令集672j占用的复制数据633a的部分中。

如上所述,并且如图10a所示,传送每个副本命令集672的部分的网络分组674可以由节点300a以维持每个副本命令集672内的副本数据访问命令670的预期执行顺序的顺序传输。因此,副本命令集672j可以被划分为多个部分,并且这些部分可以被节点300a传输到在网络分组674内的节点300y,网络分组674按照保持这些网络分组674的部分内的副本数据访问命令670之间的执行顺序的顺序被传输,并且没有传送任何其他副本命令集672的部分的网络分组674介于传送副本命令集672j的部分的网络分组674之间。如图所示,分配给副本命令集672j的集合id673j被包括在传送副本命令集672j的一部分的每个网络分组674中。

然而,如也已经讨论的并且转向图10b,集群间互连399可以延伸通过其的网络999的各种特征可以导致在节点300y处以与节点300a对其的传输不同的方式和/或包括冗余网络分组674的方式接收网络分组674。更具体地并且如图10b所示,尽管节点300a可能早先传输了传送副本命令集672h、672h和672i的部分的所有网络分组674,并且现在可以传输传送副本命令集672j的部分的网络分组674,但是节点300y仍然可以接收传送副本命令集672g、672h和672i中的一个或多个的部分的网络分组674。因此,与复制数据633a不同,可以分配由复制数据633y占据的同步高速缓存639y内的多于两个位置,以为多于两个副本命令集672(例如示例副本命令集672g、672h、672i和672j)提供足够的缓冲。

同样,由于副本命令集672能够在同步高速缓存639y内完全重新组合,所以可以通过排序部件645按照遵循复本数据访问命令670的预期执行顺序的顺序向节点600y的d模块600的访问部件648提供完全重新组合的副本命令集672。结果是,稍后传输但较早接收到的命令集672之一可能不被提供给访问部件648,直到较早传输的命令集672的所有部分已经被接收到,并且直到较早传输的命令集672已经被完全重新组合并提供给访问部件648。作为示例,副本命令集672g可以包括在副本命令集672h中的副本数据访问命令670之前要执行的副本数据访问命令670,然而,副本命令集672h可以被完全接收并且在副本命令集672g之前在同步高速缓存639y内重新组合。在这种情况下,必须延迟副本命令集672h中的所有副本数据访问命令670的执行,直到副本命令集672g被完全接收并重新组合,并且直到副本命令集672g中的所有副本数据访问命令已经被执行。

如也已经讨论的,排序部件645可以向节点300y的d模块600的通信部件649提供已经完全执行了哪些副本命令集672的指示,以使得通信部件649能够更快地标识至少一些进入的冗余的网络分组674,使得它们可以被丢弃。作为示例,如果副本命令集672g和672h中的副本数据访问命令670已经被完全执行,则排序部件645可以向通信部件649提供这样的指示。响应于接收到该指示,通信部件649可以标识包括集合id673g和673h的网络分组674,其将这些网络分组674标识为传送副本命令集672g和672h的一部分。由于副本命令集672g和672h中的副本数据访问命令已经被完全执行,所以在这样的全部执行之后接收到的副本命令集672g和672h的任何部分是冗余部分,因此,传送这样的冗余部分的任何网络分组674是可以丢弃而不进一步分析其内容的冗余分组。在一些实施例中,丢弃冗余网络分组674可能不会将该网络分组674的任何部分作为复制数据633y的一部分存储在同步高速缓存639y内。

返回图9a,通信部件649从节点300a的n模块500接收的数据访问命令570之一可以是取消在取消命令中指示的一系列较早数据访问命令570的执行的取消命令。通信部件649可以将这样的取消命令与从n模块500接收的其他数据访问命令570一起中继到分组部件642。分组部件642的取消部件6425可以分析取消命令中的指示较早接收的数据访问命令570被包括在要取消其执行的一系列数据访问命令570中,以标识哪些序列id571和/或集合id573与该系列内的数据访问命令570相关联。至少在要取消其执行的一系列数据访问命令570包括一个或多个整体命令集572的情况下,取消部件6425可以用所有数据访问命令570的执行被取消的一个或多个命令集572的集合id573的指示来通知访问部件648。

响应于从分组部件642的取消部件6425接收到这样的指示,访问部件648可以停止在指示中规定的任何命令集572中的数据访问命令570已经进行的任何执行,可以防止执行在指示中规定的尚未执行的任何命令集572中的任何数据访问命令570,并且可以丢弃在该指示中规定的命令集572的整体。因此,如果在来自取消部件6425的这种指示中规定的命令集572中的没有一个数据访问命令570尚未执行,则访问部件648可以简单地丢弃该整个命令集572。在一些实施例中,这种丢弃命令集572可能需要允许该命令集572在它被存储以被检索用于访问部件648执行时被覆盖。

然而,如本领域技术人员所认识到的,存在这样的可能性:在这些数据访问命令570的至少子集已经被执行之后,取消一个或多个特定命令集572中的数据访问命令570的执行的指示可能被访问部件648接收到。因此,作为数据访问命令570的该子集的执行的结果,存储在存储设备集合800ab内的客户端设备数据130的状态可能已经被改变。

在一些实施例中,在元数据630ab中指示的最大时间间隔或最大命令数量可以表示由于各种情况下出现的数据破坏的结果而可能被认为是可接受的最大程度的数据丢失的指示。这些情况可以包括由于接收到在太晚而不能防止这些数据访问命令的至少子集的执行的时间取消一个或多个命令集572中的数据访问命令570的执行的命令而导致的破坏。因此,可以实现由客户端设备100之一向节点300a传输这样的取消命令,理解为,在将客户端设备数据130还原到其在这样的数据访问命令子集的执行之前在存储在存储设备800ab和/或800yz时所处于的状态时,这种取消可能不是完全成功的。

在其他实施例中,访问部件648可以包括撤销由访问部件648从取消部件6425接收的指示中包括的一个或多个命令集572内的数据访问命令570的至少子集的执行的恢复部件6485。换言之,恢复部件6485可以将存储在存储设备集合800ab内的客户端设备数据130的状态恢复到在该指示中包括的一个或多个命令集572中的数据访问命令570被执行之前的客户端设备数据130的状态。在一些这样的实施例中,恢复部件6485可以保持缓冲器,其中一个或多个命令集572中的数据访问命令570以与高速缓存类似的方式被排队,以延迟其执行,从而允许有机会通过从n模块500接收到的取消命令来防止执行一个或多个命令集572中的数据访问命令的执行。在其他这样的实施例中,恢复部件6485可以维持缓冲器,其中由一个或多个命令集572中的数据访问命令的执行实现的对存储在存储设备集合800ab内的客户端设备数据130进行任何改变的指示可以临时存储,以使得能够响应于从n模块500接收到的取消命令来反转这些改变。

无论访问部件648(或节点300a的d模块600的另一部件)是否提供了反转已经执行的数据访问命令570的执行的能力,取消部件6425可以另外与节点300a的d模块600的通信部件649协作以将消息命令675传输到节点300y。更具体地,取消部件6425可以将取消命令675存储在同步高速缓存639a中作为要传输到节点300y的复制数据633a的一部分。取消命令675可以包括一个或多个副本命令集672的指示,其包括要取消其执行的副本数据访问命令670。在一些实施例中,取消命令675可以通过分配给它们的集合id673来规定这样的副本命令集672。实质上,取消命令675旨在向节点300y的d模块600的访问部件648传送类似于取消部件6425向节点300a的d模块600的访问部件648提供的指示的取消指示。以这种方式,这两个访问部件648都可以被提供有分别取消属于相应命令集572和672中的数据访问命令570和副本数据访问命令670中的相应命令的执行的取消指示。因此,以这种方式,节点300a和节点300y的d模块600的访问部件648可以至少部分地并行地执行匹配的数据访问命令的取消。

在一些实施例中,节点300a的d模块600的通信部件649可以在不包括任何副本命令集672的一部分的网络分组中传输取消命令675。此外,在其中集群间互连399可以延伸通过其的网络采用支持传输网络分组的这样的速度差异的协议的实施例中,这种单独的网络分组可以以比包括副本命令集572的一部分的网络分组更快地传送到节点300y的方式传输到节点300y。

返回图9b,在接收到传送取消命令675的网络分组时,节点300y的d模块600的通信部件649可以将取消命令675存储在同步高速缓存639y内,作为复制数据633y的一部分。排序部件645可以包括取消部件6455以从同步高速缓存639y检索取消命令675,并且向节点300y的d模块600的访问部件648中继包括要取消执行的副本数据访问命令670的在取消命令675中规定的一个或多个副本命令集672的指示(例如,通过集合id673)。响应于从取消部件6455接收到这样的指示,访问部件648可以停止在指示中规定的任何副本命令集672中的副本数据访问命令670已经进行的任何执行,可以阻止执行在指示中规定的尚未被执行的任何命令集572中的任何数据访问命令570,并且可以丢弃在指示中规定的命令集572的整体。因此,如果在来自取消部件6455的这种指示中规定的命令集672中没有一个副本数据访问命令670尚未执行,则访问部件648可以简单地丢弃该整个副本命令集672。

然而,存在这样的可能性:在这些副本数据访问命令670的至少子集已经被执行之后,取消一个或多个特定副本命令集672中的副本数据访问命令670的执行的指示可能被访问部件648接收到。因此,存储在存储设备集合800yz内的客户端设备数据130的状态可以由于执行这些副本数据访问命令670的执行而被改变。与节点300a的d模块600的访问部件648不同,节点300y的d模块600的访问部件648可以包括撤销由访问部件648从取消部件6455接收的指示中包含的在一个或多个副本命令集672内的副本数据访问命令670的至少子集的执行的恢复部件6485。

除了向副本命令集672的访问部件648提供包括不执行的副本数据访问命令670的指示之外,排序部件645的取消部件6455可以向通信部件649提供类似的指示。提供给节点300y的d模块600的通信部件649的这种指示可以使得通信部件649能够丢弃可能还被接收到的任何网络分组,该网络分组包括在该指示中规定的副本命令集672的一部分作为冗余网络分组。因此,实现副本数据访问命令670的执行的取消可以包括将在接收到取消命令675之后接收到的这些副本命令集672的部分视为冗余网络分组,因为它们传送的副本命令集672的部分已经由于取消命令675而变为冗余,取消命令规定将不执行这些部分所属于的副本命令集672内的副本数据访问命令670。另外,节点300y的通信部件649然后可以通过不将这样的冗余网络分组作为复制数据633y的一部分存储在同步高速缓存639y中来实现这种丢弃。

如上所述,在一些实施例中,集合id573和673可以是由id部件6421(和/或由节点300a的n模块500的部件)通过递增或递减由计数器维持的值而生成的有序值,使得排序部件645可以分别递增或递减由相应计数器维持的相应值,以指示由节点300y的d模块600的访问部件648最近完全执行的副本命令集672的集合id673。在这样的实施例中,哪些命令集572以及哪些副本命令集672分别包括其执行要被取消的数据访问命令570和副本数据访问命令670的指示可以被传送作为提供给两个节点300a和300y的d模块600的访问部件648的更新的计数器值。这些访问部件648然后可以将该更新的计数器值与当前正在执行和/或随后由这些访问部件648中的任一个接收的命令集572和副本命令集672的集合id573和673进行比较,以标识冗余的命令集572和副本命令集672以丢弃。

作为示例,在集合id573和673是通过递增计数器由id部件6421生成的有序值的实施例中,提供给两个访问部件648的所得到的更新的计数器值可以指示分别用于命令集572和副本命令集672的集合id573和673,其具有比与包括不执行的数据访问命令570或副本数据访问命令670的命令集572或副本命令集672相关联的集合id573或673的任一集合id573或673更高的有序值。节点300a的d模块600的访问部件648可以丢弃当前正在执行或者随后被提供给被分配小于更新的计数器值的集合id573的访问部件648的任何命令集572。对应地,节点300y的d模块600的访问部件648可以丢弃当前正在执行或者随后提供给被分配小于被更新的计数器值的集合id673的访问部件648的任何命令集672。类似地,节点300y的d模块600的通信部件649还可以被提供更新的计数器值,并且可以将更新的计数器值与传送通信部件649随后经由集群间互连399从节点300a接收的副本命令集672的一部分的任何网络分组的集合id673进行比较。通信部件649可以丢弃包括具有小于更新的计数器值的值的集合id673的这样的网络分组。

图11示出了逻辑流程2100的一个实施例。逻辑流程2100可以代表由本文中描述的一个或多个实施例执行的一些或全部操作。更具体地,逻辑流程2100可以示出由处理器部件650在执行至少执行控制例程640是执行的和/或由数据存储模块(d模块)600的其他部件执行的操作。

在2110处,存储集群系统的一个集群的第一ha组中的活动节点的d模块的处理器部件可以从客户端设备接收数据访问命令,活动节点经由客户端互连耦合到该客户端设备。这种活动节点的示例可以是存储集群系统1000的集群1300a的ha组1600ab或1600cd之一的节点300a-d中的一个,其中这样的节点可以经由客户端互连199耦合到一个或多个客户端设备100。

在2120,处理器部件可以向每个数据访问命令分配序列id。如已经讨论过的,序列id可以是按照增加或减小有序值的顺序分配给数据访问命令的有序值,该顺序指示意图执行数据访问命令的顺序。

在2130,处理器部件可以将意图连续执行的多个数据访问命令分组成命令集,并且可以按照遵循数据访问命令的执行顺序的跨越命令集的顺序来进行。如上所述,多少数据访问命令被分组在一起以形成每个命令集可以由各种因素确定,包括但不限于接收和/或执行可以被分组为单个命令集的数据访问命令所需的时间量,可以包括在单个命令集中的数据访问命令的最大数量,可以使得能够形成其中的数据访问命令可以无序地执行的至少一个命令集的数据访问命令的特征。

在2140,处理器部件可以向命令集分配集合id,其也可以提供遵循数据访问命令的执行顺序的命令集的顺序的指示。与顺序id不同,集合id也可以是按照遵循执行命令集中的数据访问命令的顺序增加或减小有序值的顺序分配给命令集的有序值。在2150,处理器部件可以复制命令集以生成分配有与匹配命令集的id相匹配的集合id的匹配的副本命令集,并且其中每个副本命令集包括与匹配命令集中的数据访问命令相匹配并且被分配匹配的序列id的一个或多个副本数据访问命令。

在2160,处理器部件可以将每个副本命令集分成分为每个要在单独的网络分组中传输到属于存储集群系统的另一集群的第二ha组中的另一活动节点的部分。这种另一活动节点的示例可以是存储集群系统1000的集群1300a的ha组1600ab或1600cd之一中的节点300a-d中的另一节点。

在2170,网络分组可以被形变为包括副本命令集的所包含的部分所属于的副本命令集的集合id。在2180,网络分组可以经由至少在两个活动节点之间延伸的集群间互连传输到另一活动节点。如上所述,这样的集群间互连可以延伸通过客户端互连延伸通过的相同的网络。

在2190,处理器部件可以执行每个命令集中的数据访问命令。在这样做时,处理器部件可以按照遵循其预期的执行顺序的顺序执行数据访问命令,使得在开始执行下一命令集中的数据访问命令之前,完全执行了每个命令集中的所有数据访问命令组。然而,在一些实施例中,在一个或多个命令集中,处理器部件可能不遵循数据访问命令的执行顺序。

图12示出了逻辑流程2200的一个实施例。逻辑流程2200可以代表由本文所述的一个或多个实施例执行的一些或全部操作。更具体地,逻辑流程2200可以示出由处理器部件650在至少执行控制例程640时执行的和/或由数据存储模块(d模块)600的其他部件执行的操作。

在2210,存储集群系统的一个集群的第一ha组中的活动节点的d模块的处理器部件可以接收数据访问命令,以取消执行从客户端设备较早接收的规定的一系列数据访问命令,该活动节点经由客户端互连耦合到该客户端设备。这种活动节点的示例可以是存储集群系统1000的集群1300a的ha组1600ab或1600cd之一的节点300a-d中的一个,其中这样的节点可以经由客户端互连199耦合到一个或多个客户端设备100。

在2220,处理器部件可以确定其中所有数据访问命令在从客户端设备接收到的取消命令中规定的数据访问命令之间的至少命令集的集合id,从而标识这些命令集及其匹配的副本命令集。如已经说明的,对于每个命令集可以存在匹配的副本命令集,并且这些副本命令集中的每个可以被分配匹配的集合id。

在2230,处理器部件停止来自客户端设备的取消命令中规定的数据访问命令的任何当前正在进行的执行,并且处理器部件可以丢弃刚才在2240被标识为与来自客户端设备的取消命令中规定的数据访问命令相关联的命令集。如上所述,丢弃命令集可能需要不执行其数据访问命令(至少是尚未执行的命令)和/或允许存储命令集的位置被包括要执行的数据访问命令的另一命令集覆盖。

在2250,处理器部件可以经由集群间互连向属于存储集群系统的另一集群的第二ha组的另一活动节点传输取消命令。该取消命令可以包括其中所有副本数据访问命令与在从客户端设备接收的取消命令中规定的数据访问命令之中的数据访问命令相匹配的副本命令集的集合id的指示。这种另一活动节点的示例可以是存储集群系统1000的集群1300a的ha组1600ab或1600cd之一的节点300a-d中的另一节点,其中两个活动节点可以经由集群间互连399耦合。

图13示出了逻辑流程2300的一个实施例。逻辑流程2300可以代表由本文中描述的一个或多个实施例执行的一些或全部操作。更具体地,逻辑流程2300可以示出由处理器部件650在执行至少控制例程640时执行的和/或由数据存储模块(d模块)600的其他部件执行的操作。

在2310,存储集群系统的一个集群的第二ha组中的活动节点的d模块的处理器部件可以通过延伸通过网络的集群间互连从属于存储集群系统的另一集群的第一ha组的另一活动节点接收传送副本命令集的部分的网络分组。这样的活动节点的示例每个可以是存储集群系统1000的集群1300a的ha组1600ab或1600cd之一的节点300a-d之一或存储集群系统1000的集群1300z的ha组1600yz的节点之一,其中这些节点可以经由集群间互连399耦合。

在2320,针对与其中副本数据访问命令已经被完全执行的副本命令集相关联的一个或多个集合id的指示,处理器部件可以分析包括在每个这样的网络分组中的集合id,其指示副本命令集的所包含的部分属于哪个副本命令集。如上所述,这样的比较使得能够标识包括冗余的副本命令集的一部分的至少一些网络分组,因为该副本命令集已经被完全重新组合,并且其全部的副本数据访问命令已经被完全执行,从而使得传送这种副本命令集的一部分的网络分组是冗余的。如已经说明的,耦合两个活动节点的集群间互连路由通过的网络的各种特征可能导致从在两个节点之间交换的网络分组生成冗余网络分组。

在2330,处理器部件丢弃由于传送副本命令集的冗余部分而被标识为冗余的网络分组,并且在2340重新组合一个或多个副本命令集时采用未丢弃的网络分组。如上所述,耦合两个活动节点的集群间互连路由通过其的网络的各种特性可以是要按照不同于其他活动节点传输它们的顺序的顺序在活动节点处接收的网络分组。因此,多个副本命令集可以从可以无序地接收的副本命令集的部分来重新组合。

在2350,处理器部件可以执行每个副本命令集中的副本数据访问命令。在这样做时,处理器部件可以按照遵循其预期的执行顺序的顺序来执行副本数据访问命令,使得在开始执行下一副本命令集中的副本数据访问命令之前,完全执行每个副本命令集中的所有副本数据访问命令。然而,在一些实施例中,在一个或多个副本命令集中,处理器部件可能不遵循副本数据访问命令的执行顺序。

在2360,当每个副本命令集中的副本数据访问命令被完全执行时,处理器部件可以将这些副本命令集中的每个的集合id添加到与其中副本数据访问命令已经完全执行的副本命令集相关联的集合id的指示。以这种方式,可以更新在2320采用的标识要丢弃的冗余网络分组的集合id的这种指示。

图14示出了逻辑流程2400的一个实施例。逻辑流程2400可以代表由本文中描述的一个或多个实施例执行的一些或全部操作。更具体地,逻辑流程2400可以示出由处理器部件650在执行至少控制例程640时执行和/或由数据存储模块(d模块)600的其他部件执行的操作。

在2410,存储集群系统的一个集群的第二ha组中的活动节点的d模块的处理器部件可以通过延伸通过网络的集群间互连接收取消来自属于存储集群系统的另一集群的第一ha组的另一活动节点的规定的副本命令集内的所有副本数据访问命令的执行的取消命令。这样的活动节点的示例每个可以是存储集群系统1000的集群1300a的ha组1600ab或1600cd之一的节点300a-d之一或存储集群系统1000的集群1300z的ha组1600yz的节点之一,其中这些节点可以经由集群间互连399耦合。规定的副本命令集可以通过分配给这些副本命令集的集合id的取消命令中包含的指示在取消命令中如此规定。

在2420,处理器部件停止在规定的副本命令集之中的当前正在执行的副本数据访问命令,并且处理器部件可以在2430丢弃规定的命令集。如上所述,丢弃命令集可能需要避免执行其数据访问命令(至少是尚未执行的命令)和/或允许存储命令集的位置被包含要执行的数据访问命令的另一命令集覆盖。

在2440,针对所规定的副本命令集的集合id,处理器部件可以分析从包括副本命令的部分的其他活动节点接收的每个网络分组中包括的集合id。如上所述,这样的比较使得能够标识包括冗余的副本命令集的一部分的至少一些网络分组。假定由于接收到取消命令而导致不再执行规定的副本命令集中的副本数据访问命令,则传送规定副本命令集之一的一部分的任何网络分组都是冗余的,因为没有目的将通过从在这样的网络分组中传送的这些部分重新组合任何规定的副本命令集来服务。在2450,传送一个或多个规定的副本命令集的这样的冗余部分的这样的冗余网络分组被丢弃。

图15示出了适于实现如上所述的各种实施例的示例性处理架构3000的实施例。更具体地,处理架构3000(或其变型)可以被实现为以下中的一个或多个的部分:客户端设备100、m模块400、n模块500、d模块600、或者存储设备集合800ab、800cd或800yz。应当注意,处理架构3000的部件被给予附图标记,其中最后两位数字对应于早先描绘和描述为模块400、模块500和模块600的一部分的至少一些部件的附图标记的最后两位数字。这是为了帮助关联每个部件。

处理架构3000包括通常在数字处理中使用的各种元件,包括但不限于一个或多个处理器、多核处理器、协处理器、存储器单元、芯片组、控制器、外围设备、接口、振荡器、定时装置、视频卡、音频卡、多媒体输入/输出(i/o)部件、电源等。如本申请中使用的,术语“系统”和“部件”旨在表示其中执行数字处理的计算设备的实体,该实体是硬件、硬件和软件的组合、软件或执行软件,其示例由所描绘的示例性处理架构提供。例如,部件可以是但不限于在处理器部件上运行的进程、处理器部件本身、存储设备(例如,硬盘驱动器、阵列中的多个存储驱动器等),其可以使用光学和/或磁性存储介质、软件对象、可执行指令序列、执行线程、程序和/或整个计算设备(例如,整个计算机)。作为说明,在服务器上运行的应用和服务器都可以是部件。一个或多个部件可以驻留在进程和/或执行线程内,并且部件可以被本地化在一个计算设备上和/或分布在两个或更多个计算设备之间。此外,部件可以通过各种类型的通信介质彼此通信地耦合以协调操作。协调可能涉及信息的单向或双向交换。例如,部件可以以通过通信介质传送的信号的形式传送信息。该信息可以被实现为被分配给一个或多个信号线的信号。消息(包括命令、状态、地址或数据消息)可以是这样的信号之一,或者可以是多个这样的信号,并且可以通过各种连接和/或接口中的任何一个来串行地或基本并行地传输。

如图所示,在实施处理架构3000时,计算设备至少包括处理器部件950、内部存储装置960、到其他设备的接口990、和耦合装置959。如将要解释的,根据实现处理架构3000的计算设备的各个方面,包括其预期用途和/或使用条件,这样的计算设备还可以包括附加部件,例如但不限于显示接口985。

耦合装置959包括一个或多个总线、点到点互连、收发器、缓冲器、交叉点开关、和/或至少将处理器部件950通信地耦合到内部存储装置960的其它导体和/或逻辑。耦合装置959可以还将处理器部件950进一步耦合到接口990、音频子系统970和显示接口985中的一个或多个(取决于这些和/或其他部件中的哪些部件也存在)。在处理器部件950通过耦合装置959耦合的情况下,处理器部件950能够执行上面针对上述实现处理架构3000的计算设备中所描述的各种任务。耦合装置959可以通过光学和/或电来传送信号的各种技术或技术的组合中的任何一种来实现。此外,耦合装置959的至少部分可以采用符合各种行业标准中的任何一种的定时和/或协议,包括但不限于加速图形端口(agp)、卡总线(cardbus)、扩展工业标准架构(e-isa)、微型通道架构(mca)、网络用户总线(nubus)、外围部件互连(扩展)(pci-x)、pciexpress(pci-e)、个人计算机存储卡国际协会(pcmcia)总线、hypertransporttm、快捷路径(quickpath)等。

如上所述,处理器部件950(对应于处理器部件450、550和650)可以包括各种商业可用处理器中的任何一种,其采用各种技术中的任何一种并且用以各种方式之一物理组合的一个或多个核来实现。

如上所述,内部存储装置960(对应于存储器460、560和660)可以基于各种技术或技术组合中的任何一种由一个或多个不同的存储设备构成。更具体地,如图所示,内部存储装置960可以包括以下中的一个或多个:易失性存储装置961(例如,基于一种或多种形式的ram技术的固态存储装置)、非易失性存储装置962(例如,固态、铁磁或不需要恒定提供电力以保存其内容的其他存储装置)、和可移除介质存储装置963(例如,通过其可以在计算设备之间传送信息的可移除盘或固态存储卡存储装置)。内部存储装置960的描述(可能包括多种不同类型的存储装置)是为了标识计算设备中多于一种类型的存储设备的常见使用,其中一种类型提供相对快速的读取和写入能力,从而能够使处理器部件950更快速地操纵数据(但是可能使用不断需要电力的“易失性”技术),而另一种类型提供相对高密度的非易失性存储(但可能提供相对较慢的读取和写入能力)。

鉴于采用不同技术的不同存储设备的特征通常不同,常见的是,这种不同的存储设备通过不同的存储控制器耦合到计算设备的其他部分,不同的存储控制器通过不同的接口耦合到其不同的存储设备。作为示例,在存在易失性存储装置961并且其基于ram技术的情况下,易失性存储装置961可以通过存储控制器965a通信地耦合到耦合装置959,存储控制器965a提供到易失性存储装置961的适当接口,其可能使用行和列寻址,存储控制器965a可以执行行刷新和/或其他维持任务以帮助保存存储在易失性存储装置961内的信息的位置。作为另一示例,在存在非易失性存储装置962并且其包括一个或多个铁磁和/或固态磁盘驱动器的情况下,非易失性存储装置962可以通过存储控制器965b通信地耦合到耦合装置959,存储控制器965b提供到非易失性存储装置962的适当接口,其可能使用信息块和/或磁柱和扇区的寻址。作为另一示例,当可移除介质存储装置963存在并且包括采用一个或多个机器可读存储介质969的一个或多个光学和/或固态磁盘驱动器时,可移除介质存储装置963可以通过存储控制器965c通信地耦合到耦合装置959,存储控制器965c提供到可移除介质存储装置963的适当接口,其可能使用信息块的寻址,并且存储控制器965c可以以特定于延长机器可读存储介质969的寿命的方式来协调读取、擦除和写入操作。

易失性存储装置961或非易失性存储装置962中的一个或另一可以包括机器可读存储介质形式的制品,其上可以存储包括由处理器部件950可执行的指令序列的例程,这取决于每个技术的基础。作为示例,在非易失性存储装置962包括基于铁磁的磁盘驱动器(例如所谓的“硬盘驱动器”)的情况下,每个这样的磁盘驱动器通常采用一个或多个旋转的盘片,磁性响应粒子的涂层以各种图案沉积和磁取向以便以类似于诸如软盘等存储介质的方式存储诸如指令序列等信息。作为另一示例,非易失性存储装置962可以由多个固态存储设备组成,以便以类似于紧凑型闪存卡的方式来存储诸如指令序列等信息。同样,在不同时间在计算设备中采用不同类型的存储设备来存储可执行例程和/或数据是常见的。因此,包括要由处理器部件950执行的指令序列的例程可以最初被存储在机器可读存储介质969上,并且可移除介质存储装置963可以随后用于将该例程拷贝到非易失性存储装置962用于长期存储,而不需要机器可读存储介质969和/或易失性存储装置961的持续存在,以便处理器部件950在该例程被执行时能够更快速地访问。

如上所述,接口990(可能对应于接口490或590)可以采用对应于可以用于将计算设备通信地耦合到一个或多个其他设备的各种通信技术中的任何一种的各种信令技术中的任何一种。另外,可以采用各种形式的有线或无线信令中的一种或两种来使得处理器部件950能够与输入/输出设备(例如,所描绘的示例键盘920或打印机925)和/或其他计算设备交互,可能通过网络(例如,网络999)或互连的网络集合。为了识别通常由任何一个计算设备必须支持的多种类型的信令和/或协议的特征,界面990被描绘为包括多个不同的接口控制器995a、995b和995c。接口控制器995a可以使用各种类型的有线数字串行接口或射频无线接口中的任何一种来从诸如所描绘的键盘920等用户输入设备接收串行传输的消息。接口控制器995b可以采用各种基于布线或无线信令、定时和/或协议以通过所描述的网络999(可能是由一个或多个链路、较小的网络或可能的因特网组成的网络)来接入其他计算设备。接口995c可以使用各种导电布线中的任一种,其使得能够使用串行或并行信号传输来将数据传送到所描绘的打印机925。可以通过接口990的一个或多个接口控制器通信地耦合的设备的其他示例包括但不限于用于监测人的声音以接受由他们经由语音或他们可能做出的其他声音发出的命令和/或数据的麦克风、遥控器、手写笔、读卡器、指纹读取器、虚拟现实交互手套、图形输入平板电脑、操纵杆、其他键盘、视网膜扫描器、触摸屏的触摸输入部件、轨迹球、各种传感器、用于监测人们的移动以接受由他们经由手势和/或面部表情发出的命令和/或数据的相机或相机阵列、激光打印机、喷墨打印机、机械机器人、铣床等。

在计算设备通信地耦合(或可能实际包括)显示器(例如,所示示例显示器980)的情况下,实现处理架构3000的这种计算设备还可以包括显示接口985。尽管更广泛的接口类型可以用于通信地耦合到显示器,在显示器上视觉显示各种形式的内容通常需要的稍微专门的附加处理以及所使用的基于布线的接口的某种特殊性质通常使得提供不同的显示界面是理想的。在显示器980的通信耦合中可以由显示接口985使用的有线和/或无线信令技术可以利用符合各种行业标准中的任一种的信令和/或协议,包括但不限于任何各种模拟视频接口、数字视频接口(dvi)、显示端口(displayport)等。

更一般来说,本文中描述和描绘的计算设备的各种元件可以包括各种硬件元件、软件元件或两者的组合。硬件元件的示例可以包括设备、逻辑器件、部件、处理器、微处理器、电路、处理器部件、电路元件(例如,晶体管、电阻器、电容器、电感器等)、集成电路、专用集成电路(asic)、可编程逻辑器件(pld)、数字信号处理器(dsp)、现场可编程门阵列(fpga)、存储器单元、逻辑门、寄存器、半导体器件、芯片、微芯片、芯片组等。软件元件的示例可以包括软件部件、程序、应用、计算机程序、应用程序、系统程序、软件开发程序、机器程序、操作系统软件、中间件、固件、软件模块、例程、子例程、函数、方法、程序、软件接口、应用程序接口(api)、指令集、计算代码、计算机代码、代码段、计算机代码段、字、值、符号或其任何组合。然而,确定是否使用硬件元件和/或软件元件来实现实施例可以根据任何数量的因素而变化,诸如期望的计算速率、功率电平、热容差、处理周期预算、输入数据速率、输出数据速率、内存资源、数据总线速度以及其他设计或执行限制,如针对给定实现所期望的。

可以使用表达“一个实施例”或“实施例”以及它们的派生词来描述一些实施例。这些术语意味着结合实施例描述的特定特征、结构或特性被包括在至少一个实施例中。在说明书中的各个地方的短语“在一个实施例中”的出现不一定都指代相同的实施例。此外,可以使用表达式“耦合”和“连接”以及它们的派生词来描述一些实施例。这些术语不一定是作为彼此的同义词。例如,可以使用术语“连接”和/或“耦合”来描述一些实施例,以指示两个或更多个元件彼此直接物理或电接触。然而,术语“耦合”也可能意味着两个或更多个元件彼此不直接接触,但仍然彼此协作或相互作用。此外,可以组合来自不同实施例的各方面或元件。

要强调的是,提供了本公开的摘要,以便读者快速地确定技术公开的性质。提交它的理解是,它不会用于解释或限制权利要求的范围或含义。此外,在前面的详细描述中,可以看出,为了简化本公开的目的,在单个实施例中将各种特征分组在一起。这种公开的方法不应当被解释为反映所要求保护的实施例要求比每个权利要求中明确叙述的更多特征的意图。相反,如以下权利要求所反映的,本发明的主题在于少于所公开的实施例的所有特征。因此,以下权利要求被并入详细描述中,其中每个权利要求独立地作为单独的实施例。在所附权利要求中,术语“包括(including)”和“其中(inwhich)”分别用作相应术语“包括(comprising)”和“其中(wherein)”的简体英文等同物。此外,术语“第一”、“第二”、“第三”等仅用作标签,并不意图对其对象施加数字要求。

以上描述的内容包括所公开的架构的示例。当然,不可能描述部件和/或方法的每种可想到的组合,但是本领域普通技术人员可以认识到很多进一步的组合和排列是可能的。因此,新颖的架构旨在包含落在所附权利要求的精神和范围内的所有这样的改变、修改和变化。详细的公开内容现在转向提供与其他实施例有关的示例。以下提供的实施例不是限制性的。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1