帮助协调独立更新的分布式数据的方法和系统的制作方法

文档序号:7971542阅读:240来源:国知局
专利名称:帮助协调独立更新的分布式数据的方法和系统的制作方法
技术领域
本发明一般地涉及分布式通信环境,并且特别地涉及对分布式通信环境的独立更新的分布式数据进行协调。
背景技术
分布式通信环境包括高度可用、可升级的系统,这些系统可用于各种情形,包括那些需要工作的高吞吐量或者系统的连续或近似连续的可用性的情形。
分布式环境的一个例子是具有一个或多个集群的集群式环境。集群包括例如多个共享资源并彼此协作以执行系统任务的操作系统实例。在集群式环境中,经常对信息进行复制,以使相同信息在集群的所有成员上可用。由于当并非所有成员都在线时成员可能会个别地或分组地进行更新,因此保持这些数据的一致性是很困难的。此外,将这些成员拆分(划分)为不进行通信的子组要求当修复这种拆分时对在不同子组上所进行的更新进行协调。
目前,为了实现更新,提供了集中式更新日志或集中式数据服务器,或者通过仅当定数(quorum)的成员在线时才允许更新来保持一致性。然而,形成集群的成员通常希望在不依赖于集中式存储或主成员(primary member)的情况下保持分布式的一致的信息。此外,定数要求是有缺陷的,原因是当定数达不到或丢失时,就不能进行处理。
基于前述内容,需要一种在没有集中式存储或定数要求的情况下用于实现更新和用于协调独立更新的分布式数据的改进的能力。

发明内容
通过提供一种帮助协调分布式通信环境的数据的方法,克服了现有技术的缺点并提供了附加的优点。该方法包括例如确定分布式通信环境的一组分布式数据与该分布式通信环境的另一组分布式数据是否一致,其中该确定包括在确定中使用一个或多个局部单调递增的值;以及响应于所述确定,对该一组分布式数据和该另一组分布式数据中的至少一组分布式数据进行更新,以协调该一组分布式数据与该另一组分布式数据之间的一处或多处不一致。
根据本发明的另一个方面,提供了一种帮助协调集群式通信环境的数据的方法。该方法包括例如由加入成员发起加入该集群式通信环境的集群的操作,该集群包括至少一个当前成员;由该至少一个当前成员中的当前成员向该加入成员提供当前成员构成数据结构;由该加入成员确定一组增量,该一组增量包括该加入成员与该当前成员之间的零处或多处数据不一致,该确定使用至少一个局部单调递增的值;由该加入成员向该当前成员提供该一组增量以及加入成员的成员构成数据结构;由该当前成员确定一组增量,该一组增量包括该当前成员与该加入成员之间的零处或多处数据不一致,该确定使用至少一个局部单调递增的值;由该当前成员解决该加入成员的一组增量与该当前成员的一组增量之间的零处或多处冲突,以提供一组已解决的增量;以及向该集群的一个或多个成员,包括该加入成员提供该一组已解决的增量。
在此还描述和要求保护对应于上述方法的系统和计算机程序产品。
通过本发明的技术可以实现更多的特征和优点。在此详细地描述了本发明的其他实施例和方面,并且这些实施例和方面可以看作是所要求保护的发明的一部分。


在本说明书所附的权利要求书中作为例子特别地指出和明确地要求保护本发明的一个或多个方面。根据以下结合附图而进行的详细描述,本发明的前述和其他目标、特征和优点将显而易见,在附图中图1示出了包含和使用本发明的一个或多个方面的通信环境的一个图2A示出了根据本发明的一个方面的图1的通信环境的集群的一个例子;图2B示出了根据本发明的一个方面的存储于一个成员上并被协调的所复制的信息的一个例子;图3示出了根据本发明的一个方面的成员构成表的一个例子;图4示出了根据本发明的一个方面的数据表的一个例子;图5示出了根据本发明的一个方面的与成员加入集群相关联的逻辑的一个实施例;图6A示出了根据本发明的一个方面的与加入成员确定增量相关联的逻辑的一个实施例;图6B示出了根据本发明的一个方面的与当前成员确定增量相关联的逻辑的一个实施例;图7示出了根据本发明的一个方面的与确定冲突相关联的逻辑的一个实施例;图8示出了根据本发明的一个方面的与对增量进行复制相关联的逻辑的一个实施例;图9示出了根据本发明的一个方面的与对增量进行应用相关联的逻辑的一个实施例;以及图10示出了根据本发明的一个方面的与为了从一种或多种优化中受益而处理元数据相关联的逻辑的一个实施例。
具体实施例方式
根据本发明的一个方面,提供了一种用于帮助协调通信环境的独立更新的分布式数据的能力。为了协调数据,使用了局部单调递增的值。这些值的例子包括本地计数器、单调递增的本地时戳等。假设将来的值或时戳不会早于先前的值或时戳(即时间不会向后流转)。
图1中示出了包含和使用本发明的一个或多个方面的通信环境的一个例子。分布式通信环境100包括例如通过多个连接104互连的多个节点102。作为一个例子,节点102是RS/6000并且连接104是耦合这些节点的局域网(LAN)连接。作为另一个例子,节点102是通过局域网(LAN)连接、交换机、因特网连接和/或其他类型的连接而互连的个人计算机。此外,多种其他类型的节点和/或连接可以包括在包含和使用了本发明的一个或多个方面的环境中。此外,尽管在图1的环境中包括了5个节点,但这只是一个例子并且仅用于说明的目的。通信环境可以包括任意数目的节点,这些节点中的一些或全部节点相互耦合。
通信环境100例如是集群式环境。在一个集群式环境中,有由集群成员形成的一个或多个集群。集群的集群成员共享资源并彼此协作以执行任务。例如,Novaes等人在2000年5月31日提交的序列号为09/583,677的题目为“A Method,System And Program Products For Managing AClustered Computing Environment(用于管理集群式计算环境的方法、系统和程序产品)”(存档号为POU920000004US1)的专利申请中描述了集群式环境的一个例子的各个方面,在此通过引用的方式包含其全部内容。
作为一个例子,通信环境100包括具有多个成员202的集群200(图2)。在这个特定的例子中,成员202是环境的节点;然而,在其他的例子中,成员是除节点之外的实体,诸如虚拟机或其他实体。尽管将集群200示出为具有5个成员,但是这只是用于说明的目的。集群200可以包括一个或多个成员,包括通信环境的所有节点(或其他实体)或节点(或其他实体)的子集。
在集群200中,在该集群的所有成员上复制信息。这样,每个成员202包括例如一个成员构成表204(图2b)和一个或多个数据表206。包括成员构成表和数据表的所复制的信息保持同步,以便集群的每个成员可以访问相同的一致的信息。为了保持这种一致性,使用协调组件208,以下对其进行更详细的描述。
参考图3描述成员构成表204的一个例子。成员构成表204包括例如包含于集群中的成员302的列表;以及每个成员302的最后改变的时戳(LCTS)304。最后改变的时戳表示出现与该最后改变的时戳相关联的成员是数据表中的一行数据的改变首项(change leader)的情况的最近时间。最后改变的时戳是本地(节点特定的)时间并且不是集群同步时间(cluster-synchronized time)。该值是单调递增的,并且因此其不是时刻(time-of-day)值,而是计时器本身的基本值。成员构成表204还可以包括其他信息。
参考图4描述数据表206的一个例子。数据表206包括多个数据行400(图4),每一行包括例如唯一地标识数据行的关键字402;数据404;指示出负责发起对数据行的改变的成员的改变首项406;以及指定改变时间的改变时戳(CTS)408。在一个实施例中,每个集群一次只有一个改变首项。然而,在其他的实施例中,一次可以有多个改变首项是活动的。
协调组件208(图2b)使用成员构成表和数据表来对已经独立地更新并且未反映在一个或多个集群成员处的信息进行协调。例如,当集群的一个成员断开了与集群的其他成员的通信并且在集群中或在该分离的成员处进行了更新时,会发生这种情况。当该成员重新与其他成员进行通信时,对该成员的信息和其他成员的信息进行协调。
作为另一个例子,在集群的成员于断开的时间点上活动时使用协调。例如,假设5节点(节点1-5)集群的节点1和节点2是活动的,并且随后停止。然后,集群的节点3-5是活动的。当所有的成员均为活动的时,使用协调来协调集群的彼此不进行通信的两个子组所进行的更新,因为这些更新是由单独的子组进行的。
为了成为集群的一个活动的成员,成员加入该集群。在此所用的术语“加入”是指在任意时间上一个成员在集群中变为活动的。作为例子,其包括从系统复位开始成员第一次在集群中变为活动的;以及/或者在集群划分(即拆分)之后成员变为活动的。还可以存在其他例子,并且可以认为其他例子也包含在“加入”的定义以及本发明的一个或多个方面之内。
在一个实施例中,具有不同改变的多个成员可以同时加入。在这种情况下,集群的当前成员确定其相对于所有加入成员的改变。
协调组件包括用于协调不一致的信息的逻辑。例如,其包括用以将成员加入集群的加入逻辑,确定待协调的任意改变的增量确定逻辑,用以确定是否存在待解决的任意冲突的逻辑,用以将改变复制到集群的所有成员(或者在另一个实施例中,成员子集)的复制逻辑,以及用以对已确定的增量进行应用的应用逻辑。如有必要,则可以既协调数据表又协调成员构成表。以下参考加入处理来描述与协调有关的更多细节。
一个成员加入一个集群以成为该集群的活动成员。例如,成员1可能是集群A的成员,但是其可能不与该集群的其他成员进行通信,并且因此,其是该集群的非活动成员。为了成为活动成员,成员1加入该集群。该成员可以在该成员能够与该集群的其他成员进行通信的任意时间上请求加入该集群。因此,即使该成员加入并且随后发生故障,该成员也可以再次加入。
在加入处理期间,请求加入集群的成员确定其所具有的与集群信息不一致的信息。这称作增量处理。同样,集群确定该集群是否具有任何与该加入者不一致的信息。同样,这称作增量处理。
参考图5来描述与加入处理相关联的逻辑的一个实施例。首先,在步骤500中,提出请求以加入集群。在这个例子中,该请求由已经恢复与集群的通信的成员提出。在此将请求加入的成员称作加入成员或加入者。
在步骤502中,响应于该加入请求,集群的当前成员(例如,集群首项)向该加入成员发送当前成员构成表。在步骤504中,该加入成员使用该成员构成表来确定其相对于当前在其要加入的集群中使用的表的一组增量。例如,加入成员使用其接收到的该成员构成表而针对该加入成员所维护的每个数据表中的每一行确定该行是否是需要由现有成员处理的增量(例如改变)。
可以以多种方式来确定增量。在一个例子中,按照参考图6A所描述的那样来执行处理。首先,在步骤600中,由加入成员选择该加入成员的数据表的一行用于处理。在询问602中,对当该行最后一次修改时该当前成员是否存在于该集群中进行判断。如果该行的改变首项(CL)存在于该当前成员的成员构成表(CMT)中,并且如果该当前成员的成员构成表(CMT)中的改变首项的最后改变的时戳(LCTS)大于或等于该数据行的已改变的时戳(CTS)(即CMT[row.CL].LCTS>=row.CTS,其中表中的行用与C++相似的箭头符号来表示,阵列索引是表关键字,并且行中的字段用点(.)来表示),则该当前成员是在线的。
如果当该行最后一次改变时该当前成员在线,则在步骤604中该行不是一个增量。然而,如果当该行最后一次改变时该当前成员不在线,则在步骤608中该行是发送给该当前成员的一个增量。当前成员在加入成员的增量组中维护该增量以便用于进一步的处理,下文将对此进行描述。
接下来,在询问610中,对是否还有更多的行需要处理进行判断。如果还有更多的行需要处理,则处理返回步骤600。否则,在步骤612中,对加入成员的增量处理完成。
返回图5,如果有任何增量,则在步骤506中将增量(例如,数据表的已改变的行)和加入成员的成员构成表发送给当前成员。
除了上述内容之外,当前成员在步骤508中确定其是否具有相对于加入成员的任何增量。参考图6B描述了这种逻辑的一个实施例。首先,在步骤650中,由当前成员选择该当前成员的数据表的一行用于处理。在询问652中,对当该行最后一次修改时该加入成员是否在该集群中进行判断。如果该数据行的改变首项(CL)存在于该加入成员的成员构成表(JMT)中,并且如果该加入成员的成员构成表中的改变首项的最后改变的时戳(LCTS)大于或等于该行的CTS(即JMT[row.CL].LCTS>=row.CTS),则该加入成员是在线的。如果JMT[row.CL].LCTS>=row.CTS,则该改变在集群中是已知的。如果当该行最后一次改变时,该加入成员已经在线,则在步骤654中该行不是一个增量。另一方面,如果当该行最后一次修改时该加入成员不在线,则在步骤656中将该行添加到由当前成员创建并维护的当前成员的增量组中。
如果没有任何增量,则在此之后在询问658中对是否存在更多的行需要处理进行判断。如果还有更多的行需要处理,则处理从步骤650继续进行。否则,在步骤660中,与当前成员确定其增量相关联的处理结束。
返回图5,在当前成员确定其相对于加入成员的增量之后,假设存在增量,则在步骤510中,当前成员确定是否存在任何冲突,并且如果存在冲突则解决冲突。参考图7描述了与确定冲突相关联的逻辑的一个在一个例子中,为了确定是否存在冲突,在步骤700(图7)中,从当前成员的增量组中选择一行,并且在询问702中对所选的行是否在加入成员的增量组中进行判断。如果该行不在加入成员的增量组中,则没有冲突,并且可以添加该行,下文将会对此进行描述。
然而,如果在询问702中该行在加入成员的增量组中,则在询问706中对该行的数据是否与该加入成员的行的数据相同进行判断。如果两行中的数据相同,则在步骤708中该行不是一个增量,并且可以从两个增量组中将该行移除。
返回询问706,如果两行中的数据不同,则存在冲突,并且在询问710中,对是通过选择当前成员的增量还是通过选择加入成员的增量来解决该冲突进行判断。可以以多种不同方式来处理行冲突,这些方式包括仲裁的方式或者编程的方式,在仲裁的方式中,将两行之一选择为当前行,在编程的方式中,编写一个程序来确定要使用的行。程序参考例如其他成员上的数据表来作出决定。在一个例子中,在选择要使用的行时,对两行的改变首项是否相同进行判断。如果两行的改变首项相同,则进一步对当前成员的LCTS和加入成员的LCTS哪一个更大进行判断。选择与较大的LCTS相关联的行。
如果确定选择当前成员的增量行,则在步骤714中从加入成员的增量组中移除该行。然而,如果确定通过选择加入成员的增量行来解决冲突,则在步骤712中从当前成员的增量组中移除该行。
在步骤704、708、712或714之后,在询问716中对是否有更多的行需要处理进行判断。如果有更多的行需要处理,则处理从步骤700继续进行。否则,冲突处理结束。
返回图5,在解决冲突之后,在步骤512中,在本例中,将增量(如果存在)发送给所有的成员。参考图8描述了与该处理相关联的逻辑的一个实施例。在图8的处理中,创建一个累积的增量组,其包括来自当前成员的增量组和加入成员的增量组的增量。在本例中,随后将该累积的组发送给集群的所有成员。(在另一个例子中,将其发送给一个子集的成员)。
参考图8,首先,在步骤800中,从当前成员的增量组中选择一行,并在步骤802中将所选的行添加到累积的增量组中。在此之后,在询问804中对该当前成员的增量组中是否有更多的行需要处理进行判断。如果还有更多的行需要处理,则处理从步骤800开始继续;否则,该逻辑就继续处理加入成员的增量组。
在步骤806中,从加入成员的增量组中选择一行,并且在步骤808中将该行应用到当前成员的表中。另外,在步骤810中,将该改变添加到累积的增量组。
然后,在询问812中对加入成员的增量组中是否有更多的行需要处理进行判断。如果还有更多的行,则处理从步骤806继续进行;否则,在步骤814中,将累积的增量组发送给集群的所有成员,包括加入成员和已加入成员。
返回图5,在将增量发送给所有成员之后(假设有增量需要发送),在步骤514中,对这些增量进行应用。参考图9描述了与该处理相关联的逻辑的一个实施例。图9的处理是由接收到增量的每个集群成员执行的。
首先,在步骤900中,从累积的增量组中选择一个增量行,并且在询问902中对该行是否存在于执行该处理的成员的表中进行判断。如果该行存在于表中,则在询问904中进一步对该增量是否是“删除”进行判断。如果该增量是“删除”,则在步骤906中删除该行;否则,在步骤908中改变该行。在此之后,处理从如下所述的询问912继续进行。
返回询问902,如果该行不存在于表中,则在询问909中对该增量是否为“删除”进行判断。如果该增量是“删除”,并且该行不存在,则不需要对该行进行处理,并且处理从如下所述的询问912继续进行。然而,如果该行不存在于该表中并且该该增量不是“删除”,则在步骤910中添加该行,并且处理从询问912继续进行。
在询问912中,对成员构成表是否需要更新进行判断。作为一个例子,对该增量的改变首项的时戳是否大于该成员构成表中的改变首项的最后改变的时戳(即,CL.CTS>CL.LCTS)进行判断。如果CL.CTS>CL.LCTS,则在步骤914中利用改变首项的最后改变的时戳来对成员构成表进行更新。在此之后,或者如果该成员构成表不需要进行更新,则在询问916中对累积增量组中是否有更多的行需要被应用进行判断。如果有更多的行需要被应用,则处理从步骤900开始继续进行;否则,应用增量逻辑结束。由此,使用两阶段提交过程来提交所有成员处的改变,然后在假设该提交成功的情况下,结束加入处理。
如上所述,利用加入处理,与成员构成表相结合的数据表的改变首项和已改变的时戳的信息实现了对表改变的相对先后顺序的确定。这提供了一种机制,其用于忽略先前已经包含在合并的表中的行。
在一个实施例中,不管加入成员是否具有任何增量,当前成员都复制已更新的表。这考虑的是加入成员不具有数据表或者当前成员的数据表中的行不在加入成员的数据表中的情况。如果成员的成员构成表被无意地(或恶意地)删除了,则加入处理仍可以工作。在这种情况下,成员加入时不带有成员构成表。当成员加入一个集群时,加入操作有效地引起全部表被传送。这也是将新安装的成员初次添加到集群的情况。然而,如果该成员是所出现的第一个成员,则其他的成员确定他们的所有表都是增量。在另一个实施例中,可能确定在当前成员的表中没有任何数据,并且作为代替,复制该加入者的表。
在又一个实施例中,有多个加入成员。在这种情况下,每个加入成员都执行在此所述的处理,然而,当前成员确定其相对于任何加入成员是否具有增量。这在当前成员的图表中引入了外部循环,其中在确定增量时针对加入成员的成员构成表中的每个表对当前成员的数据行进行检查,并且还引入了一个循环,该循环用以在确定冲突时和在冲突解决之后移除未被选择的增量时以及在当增量相同时从多个加入者的增量组中移除增量时检查每个加入成员的增量组。
此外,在对增量进行应用时,在改变一行之前,成员(当前成员或加入者)将检查该改变是否适用。因此,如果其成员构成表(MT)[row.CL].LCTS==row.CTS,则不需要对该改变进行处理并且可以跳过该改变(因为所选的增量来自于该节点)。在处理期间可以在每一个成员上进行该项操作,因为任何当前成员或加入成员都可能处于这种“健忘”的状态。
由于加入成员已经是非活动的,因此加入集群所包括的步骤可能根据已经发生的处理而不同。因此,下面描述了为实现加入而发生的处理的不同例子。
例1简单合并。这描述了子集群同时选择一个当前成员来进行处理的拆分修复情况。
5个成员{N1-N5}。改变首项为N1。
所有成员上的成员构成表(MT)为成员 LCTSN10N20N30N40N50LCTS==0表示成员不曾是任何行的改变首项。
所创建的两个数据行条目关键字CL CTSRG12 N1 0100CG5 N1 0101集群的MT成员 LCTSN10101
N20N30N40N50该集群随后拆分(即划分)。
子集群A={N1-N3},CL=N1。
子集群B={N4-N5},CL=N4。
子集群A改变了RG12关键字CL CTSRG12 N1 0200RG45 N1 0101子集群A的MT成员 LCTSN10200N20N30N40N50子集群B改变了RG45关键字CL CTSRG12 N1 0100RG45 N4 0200子集群B的MT成员 LCTSN10101N20N30N40200N50
修复了网络拆分,并且子集群A和子集群B重新合并为一个完整的集群{N1-N5},CL=N1。假设子集群A的主项N1是当前成员。N1将N1的MT发送给所选的加入成员(N4)。N4随后将计算一个增量,N4将这个增量发送给N1。N1随后将针对N的增量的每一行而确定是否存在与该行的冲突。这可以描述为1.将N1.MT发送给N4。
2.针对N4中的每一行,确定N4是否具有增量。
a.N4.RG12.CL=N1。N1.MT[N1].LCTS=0200,N4.RG12.CTS=0100。
N1更大,因此N1具有更近的改变。RG12不是增量。
b.N4.RG45.CL=N4。N1.MT[N4].LCTS=0;N4.RH45.CTS=0200。
N4更大,因此RG45是增量。
3a.将来自N4的增量(RG45)连同N4.MT一起发送给N1。
3b.N1确定其相对于N4的增量。该检查不是利用每个增量行,而是利用相对于N4的MT的数据表中的每个行。如果其是增量,则可以检查从N4接收到的增量以查看该行是否为其中的增量以及其是否具有相同的数据值。
4.针对增量中的每一行,确定是否存在冲突。
a.针对行N1.RG45。N1.RG45.CL=N1。N4.MT[N1].LCTS=0101。N1.RG45.CTS=0101。它们相等,这意味着N4知道RG45的N1版本,因此N4.RG45是已更新的行。N1利用来自N4的行对RG45进行更新。
5.通过上述步骤,合并所有的数据行。现在合并成员构成行。针对N1.MT中的每一行,与N4中相同的行进行比较。选择具有最大LCTS的行。
6.现在N1复制MT和数据表。
例2复杂合并如果集群{N1,N2,N3,N4,N5}具有完全复制的数据表和成员构成表,并且随后拆分成子集群A{N1,N2,N3}和子集群B{N4,N5},则每一方都知道当划分发生时有效的LCTS值。因此,如果A方进行了改变并定义了RG12,则该条目的CTS值将大于该行的CL的先前的LCTS。如果B方(N4,N5)改变了先前的用于RG45的条目,则该条目的CTS同样将大于CL的先前的LCTS。
如果修复了该拆分并且两个子集群准备合并,则A方将具有1行的增量组(RG12),并且B方将具有1行的增量组(RG45)。与上述的简单情况相似,当应用到A方时,B方的增量将代替该行。
然而,假设N5在修复拆分之前发生故障。然后,当修复拆分时,成员N4将并入子集群A,从而成员构成为{N1-N4}。该行增量仍将被发现和应用。
如果随后N4死机,使成员构成再次成为{N1-N3},并且再次修改了RG45,则RG45将会接收到已更新的CTS。更重要的是,RG45的CL值将从N4变为N1。注意,现在有行RG45的3个单独的组。即成员构成{N1-N3},N4以及N5,并且它们都具有截然不同的CTS值。
如果N5随后加入该集群,则N5将发现它相对于集群没有增量,原因是对RG45的改变是当N4在集群中时应用的。而该集群将发现它相对于N5具有两个必须应用的改变(RG12和RG45)。下面将进一步描述这个例子。
网络拆分成子集群A={N1-N3},CL=N1以及子集群B={N4,N5},CL=N4。
子集群A的成员构成表成员 LCTSN10101N20N30N40N50子集群B的成员构成表成员 LCTSN10101N20
N30N40N50子集群A和子集群B上的数据行关键字CL CTSRG12 N1 0100RG45 N1 0101子集群A改变了RG12关键字CL CTSRG12 N1 0200RG45 N1 0101子集群B改变了RG45关键字CL CTSRG12 N1 0101RG45 N4 0200N5发生故障。A={N1-N3},B={N4}。
N4与A合并。A={N1-N4}。将N4上发生的RG45改变反映到A中。
子集群A的成员构成表成员 LCTSN10200N20N30N40200N50子集群A上的数据行关键字CL CTSRG12 N1 0200RG45 N4 0200
N4发生故障。使得A={N1-N3}。
子集群A(N1-N3)改变了RG45关键字CL CTSRG12 N1 0200RG45 N1 0201子集群A的成员构成成员 LCTSN10201N20N30N40200N50N5加入A方。
N5的成员构成成员 LCTSN10101N20N30N40200N50N5上的数据行关键字CL CTSRG12 N1 0101RG45 N4 02001.将N1.MT发送给N5。
2.针对N5中的每一行,确定N5是否具有增量。
a.N5.RG12.CL=N1。N1.MT[N1].LCTS=0201,N5.RG12.CTS=0101。行RG12的CTS小于N1的MT LCTS,因此N1上的数据行比N5上的数据行更近,因此该行不是增量。
b.N5.RG45.CL=N4。N1.MT[N4].LCTS=0200;N5.RG45.CTS=0200。N4的MT LCTS与行RG45中的N4的CTS相同,因此该行不是增量。
3.没有增量被发送给N1,但是仍然合并成员构成表(在这种情况下,N1的成员构成表将不发生改变)。N1仍复制合并的成员构成表和数据表。
尽管在此描述了加入处理的例子,但是在不偏离本发明的精神的情况下可以对这一处理进行各种变更。作为一个例子,提供一种优化,其中处理和/或复制的信息保持最少。例如,在处理的早期阶段(例如,在加入处理的初始阶段)对是否有任何需要处理的增量进行判断。如果没有任何增量,则处理迅速停止。参考图10对此进行了更详细的描述。
参考图10,如在此所描述的那样,既在当前成员处又在加入成员处执行处理。首先,在步1000中,当前成员将其最后改变的时戳发送给加入成员,并且加入者将其最后改变的时戳发送给当前成员。在此之后,加入成员和当前成员中的每一个对当前成员的改变首项是否等于加入成员的改变首项进行判断。在这一例子中,每个成员都知道另一个成员的首项;然而,在另一个实施例中,对改变首项信息进行交换。如果改变首项不同,则不对时戳进行比较,因此在步1006中,如果有增量,则当前成员和加入成员都将处理增量。然而,如果当前成员的改变首项与加入成员的改变首项相等,则在询问1004中进一步对当前的LCTS是否与加入的LCTS相等进行判断。如果当前的LCTS与加入的LCTS相等,则在步1008中没有增量需要处理,并且处理完成。然而,如果当前的LCTS与加入的LCTS不相等,则在询问1010中进一步对当前LCTS是否大于加入成员的LCTS进行判断。如果当前LCTS大于加入成员的LCTS,则在步1012中当前成员可能具有增量。然而,如果当前成员的LCTS小于或等于加入的LCTS,则在步1014中加入成员可能具有需要处理的增量。如果在步1006和步1014中有需要处理的增量,则在步1016中,如以上参考图6A和图6B所述的那样,处理从确定是否有任何增量开始继续进行。
在上面的实施例中,如果没有需要处理的增量,则处理结束。如果加入者或当前成员具有需要处理的增量,则处理继续。当前成员将它的表的元数据(例如,成员ID、CL以及LCTS)发送给加入者,并且加入者将它的表的元数据发送给当前成员。对于每个表,分别对每个元数据的值进行比较。在当前成员或加入成员上只对那些具有增量的表进行处理。
在上述的例子中,已经假设成员在集群中的存在表示已经合并了在其中成员是改变首项的任意改变。然而,如果在特定成员上丢失了数据,则情况将不是这样。例如,如果例如由于表删除或替代,成员(例如,节点)上的成员构成表全部丢失,则成员已经忘记了当它作为改变首项存在时所进行的改变。该成员就叫做一个“健忘”的成员。
对于健忘的成员,对元数据进行交换以使得可以确定这种情况。当对表进行改变时,将针对该已改变的时戳保存为表中的元数据(CL.CTS),并且作为整组表的元数据。因此,每个表记录所应用的最后时戳,并且成员构成表记录应用到任意表的最后时戳。当成员加入时,其与当前的集群交换这组元数据,并且因此,可以确定该成员是否已经忘记了它的任何改变。例如,如果表已经被移除,则将元数据时戳交换为CL=0,CTS=0。这直接意味着包含在集群成员上的表应当在不考虑任何增量的情况下被使用。如果成员是加入该集群的第一个成员,则加入成员将发现整个数据表都将被看做增量并被用来与当前成员进行交换。
为了处理从不同成员移动或恢复表的情况,表的元数据还包含成员标识。因此,在导入后,成员能够确定该表是否是在其自身上创建的,并且如果不是,则忽略并移除该表,用包含于加入成员的集群中的当前信息对该表进行替换。
如果重置了成员的系统时间,从而使时间值不再是单调递增的,则这也可以被发现,因此不会使改变具有不正确的时戳。为了处理这一点,成员构成表的元数据还包含由成员自身形成的用于LCTS的条目。因此,在导入后,如果元数据LCTS小于系统时间,则将使用的值是LCTS+1,直到系统时间之类的时间重置为正确的值,或系统时间跟上改变计数器为止。这确保了值保持单调递增。
如果两种情况同时发生,则重置系统时间并将表恢复到前一个镜像,以成员作为改变首项的一些改变将以大于正由成员使用的单调确定的值的CTS值存在于集群中。在这种情况下,复制的已解决的成员构成表包括晚于在成员上使用的单调递增的值的LCTS值。当检测到这一点时,将该值重置为包含于复制的成员构成表中作为该表的条目的值LCTS+1。
此外,如果将表恢复到先前的版本,并且将计时器向后调,则检查接收到的成员构成表以查看LCTS是否大于所记录的LCTS,并且将时戳设定为较大的值。对于多个加入者,这一处理相对于所有的成员构成表,即当前成员和所有加入者而进行。在增量处理期间进行检测是因为最新的时戳存在于增量中。因此,该逻辑是如果row.CL==该成员&&row.CTS>该成员的MT[该成员],则将计时器更新为单调递增的。(注意,这将时戳恢复为该成员为CL时的最后CTS。如果其他的成员未对改变进行记录,则有可能在数据表被替换时这些改变已经丢失。)下面描述与健忘的成员相关联的处理的例子。
例3健忘的成员(例如,节点)时间动作16:00 N1和N2是所定义的节点。
20:36 N1和N2开启并运行,以N1作为主项。
23:45 将一个备份镜像切换到磁带上。
00:01 进行一个改变(C1).
00:45 N1发生故障,N2成为主项。
01:15 进行另一个改变(C2)。
02:15 一个人停止了N2。
02:23 N1被擦除(scratch)并从备份磁带上重新加载。
03:02 N1启动。
03:04 N2启动并加入到与N1一起。改变C1和C2都只存在于N2上。
与上面的例子相似,当N2计算其增量时,C1和C2都在增量中,原因是在进行这些改变之前就恢复了成员构成表,N1和N2的LCTS都来自第一次备份发生之前。改变C1和C2在备份之后,因此当N2加入时,N2将正确地将C1和C2放在其增量中。N1接受了这两个改变,原因是每一行的CTS都大于该行的CL的LCTS,并且这些行的N1的CTS小于N2针对这些行的CL而具有的LCTS。
上面详细描述了用于在诸如集群成员之类的独立更新的条目之间提供一致的信息的协调处理。除了上述内容之外,在此还叙述了两种情形。一种情形是当表中的行被删除时的情形,并且另一种情形是处理删除的成员。
当数据表中的一行被删除时,其被标记为已经被删除,但是仍保留在数据表中。处理这种已删除的行的一种方式是一旦删除了一行就不允许改变。因此,如果检测到增量改变,则忽略该改变并且该行仍保持为已删除状态。保留已经被删除的行,直到集群的所有成员都在线为止,此时将这些“未处理的删除”行从复制到加入成员的数据表中移除。如果在所有成员在线的同时删除行,则无需将该行保留为“未处理的”并且可以移除该行。
如同对任意其他的数据行那样处理已删除的行。其包括指示出进行删除的时间的时戳,并且可以作为增量被检测并在加入处理期间被处理。一种潜在的机制是将删除看做相对于改变具有优先权。因此,如果在冲突解决期间检测到行的增量改变,则对删除进行处理,而不是进行改变。
如果将删除的行添加回表中(该行的关键字与已删除的行的关键字相同),则如果成员都未记录了对该行的未处理的删除,则保留该行。还存在其他的机制,其在这些情况下通过使冲突解决处理确定应当保留哪一行来实现正确的处理。
在一个实施例中,对已删除的行进行累积,直到每个成员都加入了该集群为止。如果所有的成员都存在于集群中,则可知每个成员都已经看到了该已删除的行并且该已删除的行可以被丢弃。
当删除一个成员时,在成员构成表中将该成员标记为已删除,并且将其保留在成员构成表中,直到所有的成员都已经加入为止。将已删除的成员保留在成员构成表中是因为其成员ID(标识)和时戳可能在数据表中,并且该信息被用于确定增量。然而,已删除的成员不计算在所需的成员数目中,以便丢弃已删除的行或已删除的成员。
当所有已定义的成员都已经加入集群时,从成员构成表中丢弃已删除的成员。将数据表处理为移除该已删除成员的条目。在表被复制之前,以该已删除的成员作为改变首项值的行替换它们的时戳以表明处理该加入的当前集群成员是改变首项并且当前的时戳是已改变的时戳,使得数据表的行都不指向已删除的成员。这一处理是以不可再分的方式进行的,因此从成员构成表中删除成员并改变时戳标签是以不可再分的方式进行的。如果这些动作之一失败,则它们就都失败。
在又一个实施例中,还处理已添加的成员的情况。在此,一个成员上的成员构成表具有比另一个成员上的成员构成表更多的条目。在这种情况下,如果时戳属于一个不存在于成员构成表中的改变首项,则其被假设为一个增量。当解决成员构成表条目时,将该条目添加到成员构成表。
在另一个实施例中,不是单独的节点个别地加入,而是通过拆分创建的两个子集群在修复拆分之后又回到一起。在这种场景中,来自于一个子集群的一个成员被看做是当前成员,并且另一个子集群的一个成员被看做是加入者。在该加入子集群中的所有成员不需要处理合并步,但是需要进行增量应用和提交的处理。(注意,有可能有多于两个子集群进行合并,并且因此仍会有多个加入者——来自于除了从中选择当前成员的那个子集群之外的每个子集群的加入者)。
以上详细描述了用于帮助协调通信环境的独立更新的分布式数据的能力。为了协调数据,使用了局部单调递增的值。这些值的一个例子是本地时戳。这些时戳是单调递增的,因此确保了在更新中使用的将来的时戳早于先前的时戳。通过使用局部单调递增的值,在不需要集中式更新日志,集中式数据服务器,共享磁盘或其他的共享介质,或者硬件时钟的情况下对更新进行有利的协调。此外,在不需要定数的情况下进行协调。
在本发明的一个或多个方面中,以这样一种方式在多个正在进行通信的节点之间复制永久性的数据,即允许在任意时间段上当未与其余节点进行通信的节点(包括已经从一组节点中被删除的节点)的任意子集可能已经对数据进行了更新时,节点同时对已明确更新的数据条目以及未明确更新的条目进行正确的标识,允许在一些节点上删除数据条目并且允许对从节点上丢失的数据进行检测。
尽管上文已经描述了多个例子,但在不偏离本发明的精神的情况下,可以进行多种变更。例如,除了在此描述的那些环境之外的环境也可以包含和使用本发明的一个或多个方面。例如,尽管已经参考集群式环境描述了本发明的一个或多个方面,但是这只是一个例子。任何具有待协调的独立更新的数据的环境都可以使用本发明的一个或多个方面。此外,集群或其他环境的成员可以不是节点,诸如可以是虚拟机或其他类型的实体。此外,在其他的实施例中,为了执行用于协调独立更新的数据的加入处理或其他处理,可以进行一种或多种优化或其他改变。在其他的例子中,附加的、不同的或更少的逻辑可以作为协调组件的一部分。还有可能有多种其他的变更。
此外,尽管这些例子使用了时戳,但是可以使用任意的单调递增的值,包括但不限于计数器。时戳只是一个例子。
本发明的一个或多个方面的能力可以以软件、固件、硬件或它们的某些组合来实现。
本发明的一个或多个方面可以包括在具有例如计算机可读介质的一种制造产品(例如一个或多个计算机程序产品)中。该介质中具有例如用以提供和实现本发明能力的计算机可读程序代码装置或逻辑(例如指令、代码、命令等)。这种制造产品可以作为计算机系统的一部分而包括或单独地进行销售。
另外,可以提供机器可读的至少一种程序存储装置,其包含至少一个指令程序,该指令程序可由机器来执行以实现本发明能力。
在此描述的流程图仅仅是例子。在不偏离本发明的精神的情况下,可以对在此描述的这些示图或步骤(或操作)进行多种变更。例如,可以以不同次序来执行各步骤,或可以添加、删除或修改各步骤。所有这些变更都应看做是所要求保护的发明的一部分。
尽管在此已经详细示出和描述了优选的实施例,但是本领域的普通技术人员将很容易理解,在不偏离本发明精神的情况下,可以进行各种修改、添加、替换等,并且因此这些修改、添加、替换等都应看做是在所附权利要求书中所限定的本发明的范围之内。
权利要求
1.一种帮助协调分布式通信环境的数据的方法,所述方法包括确定所述分布式通信环境的一组分布式数据与所述分布式通信环境的另一组分布式数据是否一致,其中所述确定包括在所述确定中使用一个或多个局部单调递增的值;以及响应于所述确定,对所述一组分布式数据和所述另一组分布式数据中的至少一组分布式数据进行更新,以协调所述一组分布式数据与所述另一组分布式数据之间的一处或多处不一致。
2.根据权利要求1所述的方法,其中所述使用包括将所述一组分布式数据的局部单调递增的值与所述另一组分布式数据的局部单调递增的值进行比较。
3.根据权利要求1所述的方法,其中所述分布式通信环境包括集群式环境,所述一组分布式数据包括所述集群式环境的集群的一个成员的数据,并且所述另一组分布式数据包括所述集群的另一个成员的数据。
4.根据权利要求3所述的方法,其中所述一个成员包括所述集群的当前成员并且所述另一个成员包括所述集群的加入成员,并且其中所述使用包括将所述加入成员的局部单调递增的值与从所述当前成员的成员构成数据结构中获得的局部单调递增的值进行比较,以确定所述加入成员是否具有一个或多个增量,其中与所述加入成员的局部单调递增的值相关联的值是为了从所述当前成员的成员构成数据结构中获得局部单调递增的值而用于所述当前成员的成员构成数据结构中的索引;以及将所述当前成员的局部单调递增的值与从所述加入成员的成员构成数据结构中获得的局部单调递增的值进行比较,以确定所述当前成员是否具有一个或多个增量,其中与所述当前成员的局部单调递增的值相关联的值是为了从所述加入成员的成员构成数据结构中获得局部单调递增的值而用于所述加入成员的成员构成数据结构中的索引。
5.根据权利要求4所述的方法,其中用于所述当前成员的成员构成数据结构中的索引的值包括对与所述加入成员的局部单调递增的值相关联的数据的改变首项的指示,并且其中用于所述加入成员的成员构成数据结构中的索引的值包括对与所述当前成员的局部单调递增的值相关联的数据的改变首项的指示。
6.根据权利要求1所述的方法,其中所述分布式通信环境包括集群式环境,所述一组分布式数据包括所述集群式环境的集群的当前成员的数据,并且所述另一组分布式数据包括所述集群的加入成员的数据,并且其中所述使用包括将所述当前成员的局部单调递增的时间值与所述加入成员的局部单调递增的时间值进行比较,以确定所述当前成员和所述加入成员中的一个或多个是否具有相对于对方的一个或多个增量。
7.根据权利要求6所述的方法,其中所述比较是响应于所述当前成员的改变首项与所述加入成员的改变首项的比较结果为相等而进行的。
8.根据权利要求1所述的方法,其中在所述分布式通信环境的一个通信节点上维护所述一组分布式数据,并且所述另一组分布式数据是所述一组分布式数据的一组复制数据并且在所述分布通信环境的另一通信节点上维护所述另一组分布式数据,并且其中当所述一个通信节点与所述另一通信节点彼此不进行通信时,作为对所述一组分布式数据和所述另一组分布式数据中的至少一组分布式数据进行更新的结果,存在一处或多处不一致。
9.一种帮助协调集群式通信环境的数据的方法,所述方法包括由加入成员发起加入所述集群式通信环境的一个集群的操作,所述集群包括至少一个当前成员;由所述至少一个当前成员中的当前成员向所述加入成员提供当前成员构成数据结构;由所述加入成员确定一组增量,所述一组增量包括所述加入成员与所述当前成员之间的零处或多处数据不一致,所述确定使用至少一个局部单调递增的值;由所述加入成员向所述当前成员提供所述一组增量以及加入成员的成员构成数据结构;由所述当前成员确定一组增量,所述一组增量包括所述当前成员与所述加入成员之间的零处或多处数据不一致,所述确定使用至少一个局部单调递增的值;由所述当前成员解决所述加入成员的一组增量与所述当前成员的一组增量之间的零处或多处冲突,以提供一组已解决的增量;以及向所述集群的一个或多个成员,包括所述加入成员提供所述一组已解决的增量。
10.根据权利要求9所述的方法,其中由所述加入成员确定增量包括从所述加入成员的数据结构中选择数据行;确定当所述数据行最后一次改变时所述当前成员是否存在于所述集群中,所述确定使用至少一个局部单调递增的值;以及针对所述数据结构的零个或多个数据行重复所述选择和确定。
11.根据权利要求9所述的方法,其中由所述当前成员确定增量包括从所述当前成员的数据结构中选择数据行;确定当所述数据行最后一次改变时所述加入成员是否存在于所述集群中,所述确定使用至少一个局部单调递增的值;以及针对所述数据结构的零个或多个数据行重复所述选择和确定。
12.根据权利要求9所述的方法,其中所述发起包括同时向所述集群加入多个加入成员。
13.根据权利要求9所述的方法,其中所述加入成员的一组增量和所述当前成员的一组增量中的至少一组增量包括已删除的行,并且其中保留所述已删除的行,直到所述集群的所有非活动成员都已经加入所述集群为止。
14.根据权利要求9所述的方法,其中具有复制的且彼此一致的数据的多个加入成员准备加入所述集群,并且其中所述多个加入成员中的单个加入成员与所述发起、由当前成员进行的提供、由所述加入成员进行的确定、由所述加入成员进行的提供、由所述当前成员进行的确定以及所述解决相关联。
15.一种帮助协调分布式通信环境的数据的系统,所述系统包括用于确定所述分布式通信环境的一组分布式数据与所述分布式通信环境的另一组分布式数据是否一致的装置,其中所述用于确定的装置包括用于在所述确定中使用一个或多个局部单调递增的值的装置;以及用于响应于所述确定而对所述一组分布式数据和所述另一组分布式数据中的至少一组分布式数据进行更新以协调所述一组分布式数据与所述另一组分布式数据之间的一处或多处不一致的装置。
16.根据权利要求15所述的系统,其中所述用于使用一个或多个局部单调递增的值的装置包括用于将所述一组分布式数据的局部单调递增的值与所述另一组分布式数据的局部单调递增的值进行比较的装置。
17.根据权利要求15所述的系统,其中所述分布式通信环境包括集群式环境,所述一组分布式数据包括所述集群式环境的集群的当前成员的数据,并且所述另一组分布式数据包括所述集群的加入成员的数据,并且其中所述用于使用一个或多个局部单调递增的值的装置包括用于将所述加入成员的局部单调递增的值与从所述当前成员的成员构成数据结构中获得的局部单调递增的值进行比较以确定所述加入成员是否具有一个或多个增量的装置,其中与所述加入成员的局部单调递增的值相关联的值是为了从所述当前成员的成员构成数据结构中获得所述局部单调递增的值而用于所述当前成员的成员构成数据结构中的索引;以及用于将所述当前成员的局部单调递增的值与从所述加入成员的成员构成数据结构中获得的局部单调递增的值进行比较以确定所述当前成员是否具有一个或多个增量的装置,其中与所述当前成员的局部单调递增的值相关联的值是为了从所述加入成员的成员构成数据结构中获得所述局部单调递增的值而用于所述加入成员的成员构成数据结构中的索引。
18.根据权利要求17所述的系统,其中用于所述当前成员的成员构成数据结构中的索引的值包括对与所述加入成员的局部单调递增的值相关联的数据的改变首项的指示,并且其中用于所述加入成员的成员构成数据结构中的索引的值包括对与所述当前成员的局部单调递增的值相关联的数据的改变首项的指示。
19.根据权利要求15所述的系统,其中所述分布式通信环境包括集群式环境,所述一组分布式数据包括所述集群式环境的集群的当前成员的数据,并且所述另一组分布式数据包括所述集群的加入成员的数据,并且其中所述使用包括将所述当前成员的局部单调递增的时间值与所述加入成员的局部单调递增的时间值进行比较,以确定所述当前成员和所述加入成员中的一个或多个是否具有相对于对方的一个或多个增量。
20.根据权利要求19所述的系统,其中所述比较是响应于所述当前成员的改变首项与所述加入成员的改变首项的比较结果为相等而进行的。
21.一种帮助协调集群式通信环境的数据的系统,所述系统包括加入成员,发起加入所述集群式通信环境的集群的操作,所述集群包括至少一个当前成员;所述至少一个当前成员中的当前成员,其向所述加入成员提供当前成员构成数据结构;所述加入成员确定一组增量,所述一组增量包括所述加入成员与所述当前成员之间的零处或多处数据不一致,所述确定使用至少一个局部单调递增的值;所述加入成员向所述当前成员提供所述一组增量以及加入成员的成员构成数据结构;所述当前成员确定一组增量,所述一组增量包括所述当前成员与所述加入成员之间的零处或多处数据不一致,所述确定使用至少一个局部单调递增的值;所述当前成员解决所述加入成员的一组增量与所述当前成员的一组增量之间的零处或多处冲突,以提供一组已解决的增量;以及所述集群的一个或多个成员,包括所述加入成员,其被提供所述一组已解决的增量。
22.根据权利要求21所述的系统,其中所述加入成员确定所述一组增量包括所述加入成员从所述加入成员的数据结构中选择数据行;确定当所述数据行最后一次改变时所述当前成员是否存在于所述集群中,所述确定使用至少一个局部单调递增的值;以及针对所述数据结构的零个或多个数据行重复所述选择和确定。
23.根据权利要求21所述的系统,其中所述当前成员确定所述一组增量包括所述当前成员从所述当前成员的数据结构中选择数据行;确定当所述数据行最后一次改变时所述加入成员是否存在于所述集群中,所述确定使用至少一个局部单调递增的值;以及针对所述数据结构的零个或多个数据行重复所述选择和确定。
24.根据权利要求21所述的系统,其中具有复制的且彼此一致的数据的多个加入成员准备加入所述集群,并且其中所述多个加入成员中的单个加入成员与所述发起、由当前成员进行的提供、由所述加入成员进行的确定、由所述加入成员进行的提供、由所述当前成员进行的确定以及所述解决相关联。
25.一种产品,包括至少一个计算机可用介质,所述计算机可用介质具有用于帮助协调分布式通信环境的数据的计算机可读程序代码逻辑,所述计算机可读程序代码逻辑包括用于执行根据权利要求1-15中任意一项所述的步骤的指令。
全文摘要
对分布式通信环境的独立更新的数据进行协调以便向该环境的多个成员,诸如集群式环境的集群的多个成员提供一致的数据。使用局部单调递增的值来协调数据。在协调不一致的数据时所用的一类局部单调递增的值是本地时戳。
文档编号H04L29/08GK1964297SQ200610148459
公开日2007年5月16日 申请日期2006年11月10日 优先权日2005年11月10日
发明者杰弗里·S·卢卡施, 罗伯特·米勒 申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1