具体实施方式
现在将参照附图详细描述本发明的特定实施例。在以下对于本发明的实施例的详细描述中,阐述了许多特定细节,以便提供本发明的更透彻的理解。然而,本领域的普通技术人员将清楚,本发明可以在没有这些特定细节的情况下实施。在其他情况下,没有详细地描述公知的特征,以避免不必要地使描述复杂化。
在以下对于图1-10J的描述中,关于一个图描述的任何组件在本发明的各种实施例中可以等同于关于任何其他的图描述的一个或多个类似命名的组件。为简洁起见,将不对于每个图重复这些组件的描述。因此,每个图的组件的每一个实施例通过引用并入,并且被假定为可选地存在于每一个具有一个或多个类似命名的组件的其他的图内。另外,根据本发明的各种实施例,一个图的组件的任何描述要被解释为可选的实施例,该可选的实施例可以是除了关于任何其他图中的相应的类似命名的组件描述的实施例之外另外实现、与这些实施例结合实现、或者代替这些实施例实现。
概括地讲,本发明的实施例涉及一种用于将数据存储在存储池中的方法和系统。更具体地讲,本发明的实施例为存储池提供全局命名空间,该全局命名空间与用于存储池的全局命名空间布局(GL)和每一对象的对象布局(OL)相组合地使用一致性散列来确定存储池中的对象的位置(一个或多个)。
在本发明的一个实施例中,所述系统不包括专用的元数据服务器;相反,用于对象的OL遍布存储池分布。换句话说,每个存储服务器包括OL和包括客户端数据的对象的组合,其中,OL可以或者可以不与存储在存储服务器上的特定对象相关联。因为本发明的实施例不包括专用的元数据服务器,所以本发明的实施例使得能够在没有延迟不利后果和与元数据服务器相关联的缩放限制的情况下不受限制地缩放存储池的容量。
为了本发明的目的,I/O请求是如下的请求,该请求指定存储在客户端上的对象(即,数据)的逻辑地址、或者存储在操作地连接到客户端的存储器或永久性储存器中的对象的逻辑地址。I/O请求还可以包括其他信息,诸如对象的 大小。在本发明的一个实施例中,逻辑地址可以是n元组:<对象ID,偏移>。在不脱离本发明的情况下,可以使用任何类型的逻辑地址。I/O请求的例子包括但不限于,读请求(即,从存储在存储池中的对象获得数据的请求)和写请求(即,将数据写到存储池中的对象的请求)。
图1示出根据本发明的一个或多个实施例的系统。该系统包括一个或多个客户端(100A、100B)、通信结构(104)和存储池(112),存储池(112)包括一个或多个存储服务器(106A、106B)。下面描述这些组件中的每个。
在本发明的一个实施例中,客户端(100A、100B)是包括向存储服务器(106A、106B)发出I/O请求的任何物理系统。在本发明的一个实施例中,客户端可以包括处理器(未示出)、存储器(未示出)和永久性储存器(未示出)。客户端还包括执行一个或多个应用程序(未示出)的功能。应用程序可以是用户级应用程序和/或内核级应用程序。应用程序被配置为发出I/O请求,其中,应用程序发出的I/O请求被存储控制器装置驱动器(SCDD)(102A、102B)接收和处理。
存储控制器装置驱动器(SCDD)(102A、102B)被配置为根据图5-9中所示的实施例接收和处理I/O请求。在本发明的一个实施例中,SCDD在客户端的用户级(与内核级完全不同)上执行。
在本发明的一个实施例中,存储池(112)包括一个或多个存储服务器(106A、106B),其中,每个存储服务器包括存储控制器(108A、108B)和储存器(110A、110B)。
存储控制器(108A、108B)被配置为实现本发明的根据图3-9的各种实施例。在本发明的一个实施例中,存储控制器包括被配置为执行实现本发明的一个或多个实施例的指令的处理器(未示出),其中,这些指令被存储在位于存储控制器内的或者操作地连接到存储控制器的非暂时性计算机可读介质(未示出)上。可替代地,存储控制器可以使用被配置为提供前述功能的集成电路来实现。可替代地,存储控制器可以使用FPGA、ASIC、其他专门的硬件或者它们的任何组合来实现。在不脱离本发明的情况下,存储控制器可以使用软件和/或硬件的任何组合来实现。
在本发明的一个实施例中,储存器(110A、110B)包括一个或多个永久性存储装置,包括,但不限于,磁性存储装置、光学存储装置、固态存储装置、 相变存储装置、任何其他合适类型的永久性存储装置、或者它们的任何组合。
在本发明的一个实施例中,通信结构(104)使得客户端(100A、100B)与存储池(112)之间能够通信。通信结构可以使用任何有线、无线或混合(有线和无线)连接来使得客户端(100A、100B)与存储池(112)之间能够通信。
通信结构可以包括单个交换机或多个互连的交换机(未示出)。如果通信结构包括多个交换机,则每个交换机可以连接到每一个其他的交换机,可以连接到交换机结构中的交换机的子集,或者可以仅连接到一个其他的交换机。在本发明的一个实施例中,每个交换机是被配置为使得客户端(100A、100B)与存储池(112)之间可以通信的硬件和逻辑的组合(例如使用集成电路实现)(根据通信结构实现的协议定义)。
通信结构可以促进使用任何通信协议的通信。这样的通信协议的例子可以包括,但不限于,外围组件互连(PCI)、PCI-Express(PCIe)、PCI-eXtended(PCI-X)、非易失性存储器高速(NVMe)、通过PCI-Express结构的非易失性存储器高速(NVMe)、通过以太网结构的非易失性存储器高速(NVMe)、以及通过无限带宽结构的非易失性存储器高速(NVMe)。本发明不限于前述协议。
在不脱离本发明的情况下,可以使用除了图1中所示的系统配置之外的系统配置。
图2A-2C示出根据本发明的一个或多个实施例的数据结构和数据结构之间的关系。
全局命名空间布局(GL)指定存储池(或者其一部分)在该存储池(或者其该部分)的寿命期间的状态。在给定时间,存储池的状态指定(i)在存储池中哪些存储服务器是可写的,以及(ii)存储池中可写的存储服务器之间的写分布。更具体地讲,当数据可以被写到存储服务器上的对象时,该存储服务器被视为“可写的”。就这点而论,可能存在如下的情况,即,在存储池中存在N个存储服务器,但是仅M个存储服务器是“可写的”,其中,M<N。不管存储服务器是否是“可写的”,该存储服务器都可以根据例如图8为读请求服务。关于可写的存储服务器之间的写分布,可写的存储服务器之间的写分布确定用于给定对象的数据可以被存储到这些可写的存储器服务器中的哪些。换句话说,当写请求被接 收到时,可写的存储服务器之间的写分布确定数据最终将被存储到存储服务器中的哪些。
翻到图2A,GL(200)包括GL序号(202)、节点计数(204)以及一个或多个服务器条目(206A、206B)。下面描述这些组件中的每个。
GL序号(202)唯一地标识在存储池的整个寿命期间的GL的版本。节点计数(204)指定在存储池中的存储服务器的数量;然而,如上所述,并非所有的存储服务器都是“可写的”。
每个服务器条目(206A、206B)指定特定服务器在给定时间的写分布。更具体地讲,服务器条目可以包括,但不限于,(i)唯一地标识存储池中的(或者存储池的与GL相关联的部分内的)存储服务器的节点标识符(ID)(208A、208B)、(ii)一个或多个节点标点(210A、210B)(下面描述)、以及(iii)指定该服务器条目适用的GL序号的节点序号(212A、212B)。
关于节点标点,散列函数应用于每个节点ID以产生一个或多个值,其中,这些值映射到数值范围[0,…,N]。这些值随后除以N,从而得到映射到数值范围[0,…,1]的节点标点,这些节点标点从概念上讲可以被看作单位圆(即,半径为1的圆)。用于所有存储服务器的在数值范围[0,…,1]内的节点标点的数量和分布描述存储服务器在特定GL序号的写分布。如果特定存储服务器在给定GL序号不具有节点标点,则该特定存储服务器在该GL序号不是“可写的”。在不脱离本发明的情况下,写分布可以使用其他的有限数值范围(即,除了[0,…,1]之外的数值范围)来指定。
在本发明的一个实施例中,当(i)用于存储池(或者其一部分)中的任何一个存储服务器的节点标点(一个或多个)改变、或者(ii)新的存储服务器被添加到存储池(参见例如图4)时,GL序号被更新。用于一个或多个存储服务器的节点标点(一个或多个)可以基于每个存储服务器的空闲的存储容量而被修改,以便使写偏向于一个或多个存储服务器和/或远离一个或多个存储服务器。可替代地,用于一个或多个存储服务器的节点标点(一个或多个)可以被修改,以便确保当新的存储服务器添加到存储池时存储池中的存储服务器之间的数据分布是均匀的。可替代地,用于一个或多个存储服务器的节点标点(一个或多个)可以被修改,以便将单个的服务器的带宽和/或I/O请求处理能力考虑在内。
图2B示出根据本发明的一个实施例的对象布局(OL)。OL(214)包括OL序号(216)、虚拟ID(VID)(218)以及条带宽度(224)。下面描述这些组件中的每个。
OL序号(216)对应于与OL(214)相应的对象第一次被创建时GL(200)的GL序号(202)。虚拟ID(218)包括节点ID(220)和对象ID(222)。节点ID(220)标识产生VID(218)并且包括VID(218)的副本(通常存储在适当的OL中,参见例如图6)的存储服务器。对象ID(222)在全局命名空间中唯一地标识对象(即,对象ID对于全局命名空间横跨的存储服务器中的所有其他的对象ID都是唯一的)。条带宽度(224)对应于在前进到GL中的下一个存储服务器标点之前顺序地传送到存储服务器(GL标识)的数据单位。例如,如果条带宽度(SW)是64Kb,并且将被写到存储池的对象用对象ID和偏移(O)=256K标识,并且将被写到对象的数据的大小是128Kb,则将发出两个写请求,其中,每个请求包括64Kb的数据,并且其中,每个写请求可以由不同的存储服务器服务。具体地讲,用于对象的OL使用散列<VID,-1>标识。用于第一个64kb的第一个写请求被发到使用散列<对象ID,256>和GL标识的存储服务器,和用于第二个64kb的第二个写请求被发到使用散列<对象ID,256+64>和GL标识的存储服务器。下面描述使用前述散列值的特定存储服务器的选择。在本发明的一个实施例中,条带宽度被设置为等于存储服务器和/或通信结构所支持的最大传输单位(MTU)。
在存储池中对于每个对象存在单个OL。在本发明的一个实施例中,一旦被创建,用于对象的OL就不会改变。OL用于标识与OL相应的对象被创建时GL的状态。通过该信息,对象(或者其一部分)可以被安置在存储池中。(参见例如图7和8)。
图2C示出根据本发明的一个或多个实施例的散列值与物理存储位置之间的关系。每个OL具有唯一的VID,并且被存储在节点ID所标识的存储服务器中的至少一个物理位置中,节点ID在VID中指定。(参见例如图2B,218)。在本发明的一个实施例中,物理存储位置(228)(即,存储OL的物理位置)映射到节点ID所标识的存储服务器中的散列表条目。散列表条目与通过对<VID,-1>(226)进行散列变换而产生的散列值相关联。散列表条目还可以包括OL的副本 在存储服务器的非易失性存储器中的位置。在不脱离本发明的情况下,可以使用任何散列函数和任何特殊偏移(不只是-1)。
图3-9示出根据本发明的一个或多个实施例的流程图。虽然每个流程图中的各个步骤是按顺序呈现和描述的,但是普通技术人员将意识到,这些步骤中的一些或全部可以按不同次序执行,可以组合或省略,并且这些步骤中的一些或全部可以并行执行。在本发明的一个实施例中,图3-9中所示的一个或多个步骤可以与图3-9中所示的一个或多个其他并行执行。
图3示出根据本发明的一个或多个实施例的用于初始化存储池的流程图。图3中所示的处理可以由存储池中的一个存储服务器执行,或者由系统中的客户端之一执行。在步骤300中,标识将被包括在存储池中的存储服务器。在步骤302中,选择在步骤300中标识的存储服务器之一。在步骤304中,获得用于在步骤302中选择的存储服务器的节点ID。可以使用任何已知的用于获得和/或产生ID的机制来获得和/或产生节点ID。
在步骤306中,将散列函数应用于节点ID以获得一个或多个节点标点。可以基于客户端指定的策略、基于一个或多个存储服务器指定的策略、或者基于与存储池相关联的默认策略来确定分配给给定的存储服务器的节点标点的数量。在步骤308中,创建与在步骤302中标识的存储服务器相应的服务器条目,并且使用节点ID、节点标点(一个或多个)和节点序号来填充该服务器条目。节点序号对应于当前GL序号。例如,如果服务器条目是在GL序号为0时创建的,则节点序号被设置为0。图3示出初始GL的产生。因此,即使GL中的GL序号在这个阶段可能未在GL中正式设置,GL序号也将是初始GL序号值,例如,1,就这点而论,节点序号可以在正式设置初始GL之前被设置。
在步骤310中,确定是否存在附加的要处理的存储服务器。如果存在附加的要处理的存储服务器,则所述处理进入步骤302;否则,所述处理进入步骤312。在步骤312中,在GL中设置GL序号。图3示出初始GL的产生。因此,GL序号被设置为初始GL序号值,例如,1。在步骤314中,设置节点计数,其中,节点计数对应于存储池中的存储服务器的数量。在步骤316中,将GL存储在存储池中的每个服务器中。
图4示出根据本发明的一个或多个实施例的用于将存储服务器添加到存储 池的流程图。在步骤400中,标识要添加到存储池的附加的存储服务器。通常,该步骤在图3中所示的处理已经被执行之后的时刻(例如,当添加附加的存储服务器来增加存储池的存储容量时)发生。
在步骤402中,获得用于所述附加的存储服务器的节点ID。可以使用任何已知的用于获得和/或产生ID的机制来获得和/或产生节点ID。在步骤404中,将散列函数应用于节点ID以获得一个或多个节点标点。节点标点(一个或多个)可以以使得新的写请求偏向于所述附加的存储服务器的方式产生。在步骤406中,创建与在步骤400中标识的附加的存储服务器相应的服务器条目,并且使用节点ID、节点标点(一个或多个)和节点序号来填充该服务器条目。节点序号对应于当前GL序号加1。将服务器条目添加到GL来获得更新的GL。
在步骤408中,在更新的GL中更新GL序号。例如,将GL序号加1。用于在步骤406中创建的服务器条目的节点序号等于更新的GL序号。在步骤410中,更新节点计数来反映存储池中的附加的存储服务器。在步骤412中,将更新的GL存储在存储池中的每个服务器中。在本发明的一个实施例中,在每个存储服务器上仅存储一个GL,就这点而论,当更新的GL被存储服务器接收时,以前的GL被从该存储服务器删除或者以其他方式从该存储服务器移除。在本发明的一个实施例中,更新的GL可以由存储服务器根据图5中所描述的处理而获得。
图5示出根据本发明的一个或多个实施例的用于将客户端连接到存储池的流程图。在本发明的一个实施例中,图5中所示的处理由SCDD(图1中的102A、102B)执行。
在步骤500中,存储池中的存储服务器之一从客户端接收连接请求。在步骤502中,响应于连接请求,存储服务器将其当前的GL提供给客户端。在步骤504中,客户端确定它是否已经具有GL。在本发明的一个实施例中,如果客户端先前已经连接到了存储池中的另一个存储服务器,则该客户端已经包括GL(该GL可以或者可以不与在步骤502中获得的当前GL相同)。如果客户端已经具有另一个GL,则所述处理进入步骤506;否则,所述处理结束。
在步骤506中,确定在步骤502中获得的GL是否是用于存储池的最当前的GL。更具体地讲,确定在步骤502中获得的GL的序号是否大于客户端 先前获得的GL的序号。如果在步骤502中获得的GL的序号大于客户端先前获得的GL的序号,则所述处理进入步骤508;否则,所述处理结束。在步骤508中,客户端将先前存储的GL(即,具有比它提供给客户端的GL的GL序号大的GL序号的GL)发送到存储服务器。
图6示出根据本发明的一个或多个实施例的用于创建对象并且将数据存储在该对象中的流程图。在本发明的一个实施例中,图6中所示的处理由SCDD(图1中的102A、102B)执行。
在步骤600中,接收创建新对象的请求。在本发明的一个实施例中,该请求由在客户端上执行的应用程序发出,并且被SCDD接收。
在步骤602中,选择存储服务器。在本发明的一个实施例中,从存储池随机地选择或者使用圆罗宾(round robin)算法选择存储服务器。在不脱离本发明的情况下,可以使用任何的从存储池选择存储服务器的方法。
在步骤604中,将产生新的虚拟ID(VID)的请求发送到在步骤602中标识的存储服务器。VID包括节点ID,节点ID标识存储服务器,和对象ID,对象ID标识存储池中的新对象。
在步骤606中,创建用于对象的对象布局(OL)。OL可以由存储服务器或者由SCDD创建。具体地讲,存储服务器和SCDD都包括填充用于对象的OL所必需的信息。
在步骤608中,对<VID,-1>进行散列变换以获得第一散列值。如以上所讨论的,在不脱离本发明的情况下,可以使用任何的特殊偏移(除了-1之外)。在步骤610中,使用第一散列值将用于对象的OL存储在存储服务器中。如上所述,第一散列值与存储服务器上的散列表条目相关联,其中,散列表条目与存储服务器的储存器中的存储OL的至少一个物理位置相关联。在这个阶段,对象和相应的OL已经被创建;然而,数据尚未被存储在对象中。下列步骤描述数据最初是如何存储在对象中的。
在步骤612中,对<对象ID,偏移ID>进行散列变换以获得第二散列值。更具体地讲,客户端上的应用程序请求与VID和偏移相关联的数据被存储在对象中。作为响应,SCDD从VID获得对象ID,和偏移ID则通过将基于条带宽度的位掩码应用于偏移而获得。
在步骤614中,使用用于对象的第二散列值、GL和OL来标识存储池中的目标存储服务器。更具体地讲,从OL提取OL序号,并且使用该OL序号来确定当OL被创建时哪些存储服务器是“可写的”。在本发明的一个实施例中,确定哪些存储服务器是“可写的”包括:(i)标识所有的具有小于或等于OL序号的节点序号的服务器条目;(ii)分析任何的具有相同的节点ID的服务器条目以确定当OL被创建时可写的一个或多个节点标点;(iii)从(i)和(ii)产生最终的一组节点标点;以及(iv)使用一致性散列、连同第二散列值和节点标点来标识目标服务器。关于图10A-10J进一步描述一致性散列。
以下是确定当OL被创建时哪些存储服务器是“可写的”的例子。这个例子并非意图限制本发明的范围。
考虑GL具有下列服务器条目的情况:
E1:[Node A,[A1,A2],S1]
E2:[Node A,[A3],S2]
E3:[Node B,[B1],S1]
E4:[Node C,[C1,C2],S2]
E5:[Node D,[D1],S3]
进一步,用于对象的OL如下:
OL:[S2,VID,SW]
因此,具有小于或等于OL序号的节点序号的服务器条目是E1、E2、E3和E4。此外,E1和E2具有相同的节点ID,即,节点A,但是具有在不同节点序号的不同节点标点,因此,对E1和E2进行分析以确定哪些节点应与在S2被标识为节点A的存储服务器相关联。在这个例子中,在S2,仅存在一个节点标点A3。因此,最终的一组节点标点是A3、B1、C1和C2。
继续参照图6,在步骤616,将数据存储在对象中的写请求发送到目标服务器,其中,该请求标识对象ID和偏移。在不脱离本发明的情况下,前述请求可以使用任何逻辑地址。
图7示出根据本发明的一个或多个实施例的用于将数据写到存储池中的先前创建的对象的流程图。在本发明的一个实施例中,图7中所示的处理由SCDD(图1中的102A、102B)执行。
在步骤700中,接收<VID,offset>。在步骤702中,从VID提取节点ID。在步骤704中,对<VID,-1>进行散列变换以获得第一散列值。如上所述,在不脱离本发明的情况下,可以使用任何的特殊偏移(除了-1之外)。在步骤706中,使用第一散列值从节点ID所标识的存储服务器获得OL。如果SCDD以前获得了OL(例如,当执行图6中的各个步骤时),则步骤702-706可能不需要执行,相反,客户端可以使用先前高速缓存的OL。
在步骤708中,对<object ID,offset ID>进行散列变换以获得第二散列值。在本发明的一个实施例中,对象ID从VID获得,偏移ID则通过将基于条带宽度的位掩码应用于偏移而获得。在步骤710中,使用用于对象的第二散列值、GL和OL标识存储池中的目标存储服务器。使用与图6中的步骤614中所描述的处理相同的处理标识目标服务器。在步骤712中,将数据存储在对象中的请求发送到目标服务器,其中,该请求指定对象ID和偏移。在不脱离本发明的情况下,前述请求可以使用任何逻辑地址。在步骤714中,确定目标存储服务器是否包括OL。如果目标存储服务器包括OL,则所述处理结束;否则,所述处理进入步骤716。在步骤716中,使用第一散列值将OL存储在目标存储服务器中。以这种方式,将给定OL的附加副本存储在存储池中的各个存储服务器中。这使得客户端可以使用散列<VID,-1>来获得用于除了节点ID所标识的服务器之外的服务器的OL。
图8示出根据本发明的一个或多个实施例的用于从存储池中的对象读数据的流程图。在本发明的一个实施例中,图8中所示的处理由SCDD(图1中的102A、102B)执行。
在步骤800中,接收<VID,偏移>。在步骤802中,从VID提取节点ID。在步骤804中,对<VID,-1>进行散列变换以获得第一散列值。如以上所讨论的,在不脱离本发明的情况下,可以使用任何的特殊偏移(除了-1之外)。在步骤806中,使用第一散列值从节点ID所标识的存储服务器获得OL。如果SCDD先前已经获得了OL,则步骤802-806可能不需要执行。相反,SCDD可以搜索客户端来获得OL。
在步骤808中,对<对象ID,偏移ID>进行散列变换以获得第二散列值。在本发明的一个实施例中,对象ID从VID获得,偏移ID则通过将基于条带宽 度的位掩码应用于偏移而获得。在步骤810中,使用用于对象的第二散列值、GL和OL来标识存储池中的目标存储服务器。使用与在图6中的步骤614中所描述的处理相同的处理来标识目标服务器。在步骤812中,将对象中的读请求发送到目标服务器,其中,该请求指定对象ID和偏移。在不脱离本发明的情况下,前述请求可以使用任何逻辑地址。
图9示出根据本发明的一个或多个实施例的用于删除存储池中的对象的流程图。在本发明的一个实施例中,图9中所示的处理由SCDD(图1中的102A、102B)执行和/或发起。
在步骤900中,获得VID,其中,该VID对应于将从存储池删除的对象。在步骤902中,从VID提取节点ID。在步骤904中,对<VID,-1>进行散列变换以获得第一散列值。如上所述,在不脱离本发明的情况下,可以使用任何的特殊偏移(除了-1之外)。在步骤906中,将删除标志写到通过节点ID标识的存储服务器中、与第一散列值相应的散列表条目。在步骤908中,使存储池中的所有的其他的存储服务器中的所有的与第一散列值相应的散列表条目失效。在步骤910中,使通过节点ID标识的存储服务器中的与第一散列值相应的散列表条目失效。在这个阶段,可以使用任何已知的存储回收算法来回收先前分配给存储现在失效的对象和/或OL的物理储存器。
图10A-10J示出根据本发明的一个或多个实施例的例子。例子并非意图限制本发明的范围。此外,在图10A-10J中,为清晰起见,省略了客户端和存储服务器中的各种组件。
考虑系统包括连接到最初包括两个存储服务器的存储池的客户端。图10A示出用于存储池的初始GL。参照图10A,GL包括用于每个存储服务器的服务器条目(服务器条目A、服务器条目B)。具体地讲,服务器条目A对应于存储服务器A(参见图10B),并且指定下列信息:(i)节点ID A,其在存储池中唯一地标识存储服务器A;(ii)节点标点:A1、A2(参见图10D);以及(iii)节点序号A:1,其指当GL序号等于1时服务器条目A被添加到GL。类似地,服务器条目B对应于存储服务器B(参见图10B),并且指定下列信息:(i)节点ID B,其在存储池中唯一地标识存储服务器B;(ii)节点:B1(参见图10D);以及(iii)节点序号B:1,其指当GL序号等于1时服务器条目B被添加到GL。GL还包括被 设置为1的GL序号,因为这是初始GL,并且节点计数被设置为2,因为在存储池中存在两个存储服务器。
参照图10B,在某一稍后的时刻,客户端A将对于新对象的请求发送到服务器A。如以上所讨论的,客户端A可以将对于新对象的请求发送到存储池中的可写的存储服务器中的任何一个。响应于该请求,存储服务器A产生VID,其中,VID包括节点ID A和用于存储池中的新对象的对象ID。存储服务器A随后产生用于该新对象的对象布局(OL)。图10C示出存储服务器A产生的OL。参照图10C,OL包括下列信息:(i)OL序号:1,其指示当GL序号等于1时OL条目被创建;(ii)VID,其事先由存储服务器A产生;以及(iii)条带宽度:64Kb。
返回到图10B,在产生OL之后,存储服务器A使用散列<VID,-1>存储OL,并且还将OL的副本发送到客户端A。在某一稍后的时间,在客户端A上执行的应用程序(未示出)请求将数据写到<对象ID,偏移1>。响应于该请求,客户端A使用OL(参见图10C)、GL(参见图10A)和散列<对象ID,偏移1>来标识目标服务器,其中,偏移ID通过用从OL(参见图10C)获得的条带宽度掩蔽偏移1而产生。
如前面所讨论的,OL用于确定在OL被创建时在全局命名空间中哪些存储服务器是“可写的”。在这个例子中,OL序号为1。因此,在OL被创建时在全局命名空间中可写的存储服务器将在GL中具有其节点序号小于或等于1的服务器条目。参照图10A中的GL,服务器条目A和服务器条目B都具有等于1的节点序号,就这点而论,当OL被创建时在全局命名空间中是可写的。用于每个存储服务器的节点标点(即,A1、A2和B1)从相应的服务器条目获得。
随后使用节点标点(即,A1、A2和B1)和散列<对象ID,偏移ID 1>来标识目标服务器。更具体地讲,参照图10D,每一个节点标点(即,A1、A2和B1)从概念上讲均可以被看作是单位圆上的标点,其中,节点标点(即,A1、A2和B1)的值规定每个节点标点在单位圆上的位置。此外,散列<对象ID,偏移ID 1>从概念上讲也可以被看作是单位圆上的标点。应用一致性散列的原理,从散列<对象ID,偏移ID 1>限定的标点开始,并且在顺时针方向上移动,所遇到的第一个节点标点将用于标识目标服务器。在这个例子中,散列<对象ID,偏移ID 1>位于A1与B1之间。在顺时针方向上移动,所遇到的第一个节点标点是 B1。B1是与存储服务器B相关联的节点标点。因此,存储服务器B被标识为目标服务器。
参照图10B,客户端A随后将指定(散列<对象ID,偏移1>,数据)的写请求发送到存储服务器B。存储服务器B随后存储数据。因为存储服务器B不包括OL的副本,所以客户端A还将OL的副本发送到存储服务器B。当接收到时,存储服务器B使用散列<VID,-1>存储OL。
参照图10E,在某一稍后的时间,将存储服务器C添加到存储池。结果,GL被更新来反映新存储服务器的添加。更新的GL包括服务器条目C。服务器条目C对应于存储服务器C(参见图10F),并且指定下列信息:(i)节点ID C,其在存储池中唯一地标识存储服务器C;(ii)节点:C1(参见图10G);以及(iii)节点序号C:2,其指示当GL序号等于2时服务器条目C被添加到GL。GL还包括被设置为2的指示GL已经被更新的GL序号、以及被设置为3的节点计数,因为在存储池中存在三个存储服务器。
参照图10F,在GL被更新(参见图10E)在之后,客户端A接收从<VID,offset 2>读数据的请求。因为OL对应于先前提供给客户端的VID(参见图10B)所标识的对象,所以不需要向存储池请求OL。
客户端A使用OL(参见图10C)、GL(参见图10E)和散列<对象ID,偏移ID2>来标识目标服务器,其中,偏移ID 2通过用从OL(参见图10C)获得的条带宽度掩蔽偏移2而产生。
如前面所讨论的,OL用于确定在OL被创建时在全局命名空间中哪些存储服务器是“可写的”。在这个例子中,OL序号是1。因此,在OL被创建时在全局命名空间中可写的存储服务器将在GL中具有节点序号小于或等于1的服务器条目。参照图10E中的GL,服务器条目A和服务器条目B都具有等于1的节点序号,就这点而论,当OL被创建时在全局命名空间中是可写的。虽然GL包括服务器条目C,但是因为节点序号C为2,所以存储服务器C在OL被创建时是不可写的,就这点而论,不用于标识目标服务器。用于存储服务器A和B的节点标点(即,A1、A2和B1)从相应的服务器条目获得。
随后使用节点标点(即,A1、A2和B1)和散列<对象ID,偏移ID 2>来标识目标服务器。更具体地讲,参照图10G,节点标点(即,A1、A2和B1)从概念 上讲均可以被看作是单位圆上的标点,其中,节点标点(即,A1、A2和B1)的值规定每个节点标点在单位圆上的位置。此外,散列<对象ID,偏移ID 2>从概念上讲也可以被看作是单位圆上的标点。应用一致性散列的原理,从散列<对象ID,偏移ID 2>限定的点开始,并且在顺时针方向移动,所遇到的第一个节点标点将用于标识目标服务器。在这个例子中,散列<对象ID,偏移ID 2>位于B1与A2之间。在顺时针方向上移动,所遇到的第一个节点标点是A2。A2是与存储服务器A相关联的节点。因此,存储服务器A被标识为目标服务器。
参照图10F,客户端A随后将指定<对象ID,偏移2>的读请求发送到存储服务器A。存储服务器A随后获得所请求的数据,并且将它送回到客户端A。
参照图10H,在GL被更新(参见图10E)之后,客户端A接收读用于<VID 2,偏移3>的数据的请求。客户端A从VID 2(参见图10I)提取节点ID B(其标识存储服务器B),随后使用散列<VID 2,-1>将对于OL2的请求发送到存储服务器B。响应于该请求,存储服务器B获得OL2,并且将它送回到客户端A。
客户端A然后使用OL 2(参见图10J)、GL(参见图10E)和散列<对象ID 2,偏移ID 3>来标识目标服务器,其中,偏移ID 3通过用从OL 2(参见图10J)获得的条带宽度掩蔽偏移3而产生。
如前面所讨论的,OL用于确定在OL被创建时在全局命名空间中哪些存储服务器是“可写的”。在这个例子中,OL序号是2(参见图10J)。因此,在OL 2被创建时在全局命名空间中可写的存储服务器将在GL中具有其节点序号小于或等于2的服务器条目。参照图10E中的GL,服务器条目A、服务器条目B和服务器条目C全都具有小于或等于2的节点序号,就这点而论,当OL 2被创建时在全局命名空间中是可写的。用于每个存储服务器的节点标点(即,A1、A2和B1)从相应的服务器条目获得。
随后使用节点标点(即,A1、A2、B1、C1)和散列<对象ID 2,偏移ID 3>来标识目标服务器。更具体地讲,参照图10J,每个节点(即,A1、A2和B1)从概念上讲均可以被看作是单位圆上的标点,其中,节点标点(即,A1、A2、B1、C1)的值规定每个节点标点在单位圆上的位置。此外,散列<对象ID 2,偏移ID 3>从概念上讲也可以被看作是单位圆上的标点。应用一致性散列的原理,从散列<对象ID 2,偏移ID 3>限定的点开始,并且在顺时针方向上移动,所 遇到的第一个节点标点将用于标识目标服务器。在这个例子中,散列<对象ID 2,偏移ID 3>位于B1与C1之间。在顺时针方向上移动,所遇到的第一个节点标点是C1。C1是与存储服务器C相关联的节点。因此,存储服务器C被标识为目标服务器。
参照图10H,客户端A随后将指定(<对象ID 2,偏移3>)的读请求发送到存储服务器C。存储服务器C随后获得所请求的数据,并且将它送回到客户端A。
虽然已经关于有限数量的实施例描述了本发明,但是受益于本公开的本领域的技术人员将意识到,可以设想不脱离如本文中所公开的本发明的范围的其他实施例。因此,本发明的范围仅应由所附权利要求书限制。