联盟体系结构
图1示出了联盟基础结构100的一个示例。联盟基础结构100包括可以形成不同类型的联盟伙伴关系的节点101、102、103。例如,节点101、102、103可彼此联盟为对等体而不需要根节点。节点101、102和103中的每一个各自都有相应ID 171、182和193。
一般而言,节点101、102、103可利用联盟协议来形成伙伴关系并交换信息(例如,涉及与其它节点的交互的状态信息)。伙伴关系的形成以及信息的交换便于对资源的更高效且更可靠的访问。其它中间节点(未示出)可以存在于节点101、102和103之间(例如,ID在171和193之间的节点)。由此,例如在节点101和节点103之间路由的消息可穿过一个或多个其它中间节点。
联盟基础结构100中的节点(包括其它中间节点)可以包括相应的会合协议栈。例如,节点101、102和103分别包括相应的会合协议栈141、142和143。协议栈141、142和143中的每一个包括应用层(例如,应用层121、122和123)和其它较低层(例如,相应的其它较低层131、132和133)。会合协议栈中的每一层负责与将资源请求与相应的资源会合相关的不同功能。
例如,其它较低层可包括信道层、路由层和功能层。一般而言,信道层负责可靠地将消息(例如,使用WS-可靠消息通信(WS-ReliableMessaging)和简单对象访问协议(“SOAP”))从一个端点传输到另一端点(例如,从节点101到节点103)。信道层还负责处理传入和传出的可靠消息通信首部,并维护与可靠消息通信会话相关的状态。
一般而言,路由层负责计算向目的地的下一跳。路由层还负责处理传入和传出的寻址和路由消息首部并维护路由表。一般而言,功能层负责发出并处理诸如加入和离开请求、查验、更新和其它消息等会合协议消息,以及生成对这些消息的响应。功能层处理来自路由层的请求消息,并且如果有相应的响应消息,则使用路由层将其发回到始发节点。功能层还发起请求消息并利用路由层来传递请求消息。
一般而言,应用层处理从功能层传递的非会合协议专用数据(即,应用程序消息)。功能层可以访问来自应用层的应用程序数据,并且可以获得会合协议消息(例如,查验和更新)中的应用程序数据以及将应用程序数据置于该消息中。即,功能层可使得应用程序数据被承载在会合协议消息上,并且可使得应用程序数据被传回接收会合协议节点中的应用层。在某些实施例中,应用程序数据用于标识资源和资源兴趣。由此,应用层可以包括处理从其它较低层接收到的和发送到其它较低层的数据以标识资源和资源兴趣的应用程序专用逻辑和状态。
联盟机制
节点可以使用各种不同的机制来联盟。第一个联盟机制包括对等节点将信息转发给所有其它对等节点。当节点要加入一联盟基础结构时,该节点利用诸如,例如WS发现(WS-Discovery)等广播/多播发现协议来通告其存在并发出广播/多播寻找来检测其它节点。该节点然后建立与已经存在于网络上的其它节点的简单转发伙伴关系,并接受与新加入的节点的新的伙伴关系。之后,该节点只需将所有应用程序专用消息转发给所有其伙伴节点。
第二种联盟机制包括对等节点最高效地将应用程序专用消息发送到其目的地。当一新节点要加入一联盟基础结构时,该新节点利用诸如,例如WS发现等广播/多播发现协议来通告其存在并发出广播/多播寻找来检测作为该联盟基础结构的一部分的其它节点。在检测到另一节点时,该新节点建立与该另一节点的伙伴关系。从所建立的伙伴关系中,该新节点获知已经参与联盟基础结构的其它节点的存在。它然后与这些新获知的节点建立伙伴关系,并接受任何新传入的伙伴关系请求。
特定应用程序专用消息中的节点到达/离开和兴趣注册在该联盟基础结构上洪泛(flood),导致每一节点都在应用程序专用消息中具有其它伙伴节点和兴趣注册的全局知识。有了这一全局知识,任何节点可直接向已经表达了对应用程序专用消息的兴趣的节点直接发送应用程序专用消息。
第三种联盟机制包括对等节点非直接地将所有应用程序专用消息发送到其目的地。在该第三种机制中,节点被分配诸如,例如128位或160位ID等标识符(ID)。负责维护给定对应用程序专用消息的兴趣的注册的节点可被确定为其ID最接近通过将应用程序专用消息的目的地身份(例如,URI)映射(例如,散列)到该128位或160位ID空间所获得的ID的节点。
在该第三种机制中,节点到达和离开在整个结构上洪泛。另一方面,对特定应用程序专用消息的兴趣的注册被转发给被确定为负责维护这一注册信息的节点。出于可伸缩性、负载平衡和容错的目的,接收对特定应用程序专用消息的兴趣的注册的节点可以在其邻域集中可靠地洪泛该注册信息。对于指定节点的邻域集可以被确定为其ID在该指定节点的ID的任一侧上的预定范围内的节点集。
类似于第二种机制,新加入的节点利用诸如,例如WS发现等广播/多播发现协议来通告其存在并发出局部广播/多播寻找来检测已经是该联盟基础结构的一部分的节点。该新节点建立与所发现的节点的伙伴关系,并使用该伙伴关系来获知参与该联盟基础结构的其它新节点的存在。该新节点然后与新发现的节点建立进一步的伙伴关系,并接受任何新传入的伙伴关系请求。该新节点接受从其所负责的伙伴传入的对特定应用层专用资源的兴趣的注册,并且可在其邻域集上洪泛该注册。由此,消息一般可经由中间路由节点(例如,新加入的节点与其具有伙伴关系或者伙伴节点知道的节点)转发到其最终目的地。
响应于接收到传入的应用程序专用消息,该新节点将该消息转发给可能负责维护关于在消息中指定的目的地的注册信息的伙伴节点。由此,当使用该第三种机制时,联盟基础结构中的每一节点具有所有其它节点的全局知识,但是注册信息在节点之间高效地分区。应用程序专用消息仅经由可能负责维护对这些应用程序专用消息的兴趣的注册信息的伙伴节点来发送到其最终目的地。由此,通过仅转发给具有对所处理的消息的兴趣的注册信息的全局知识的伙伴节点来实现了间接性。这与其中间接性是通过转发给所有伙伴节点来实现的第一种机制形成对比。
第四种联盟机制包括对等节点将消息路由给其它对等节点。该第四种机制与第三种机制的区别至少在于节点到达/离开和对特定应用程序专用消息的兴趣的注册都被路由而不是洪泛。路由协议被设计成保证应用程序专用消息和表达对这些应用程序专用消息的兴趣的注册消息之间的会合。
图2示出了帮助间接地将请求路由到伙伴的计算机体系结构200的示例。计算机体系结构200描绘了可能分布在参与联盟基础结构的多个局部发现范围上的不同类型的计算机***和设备。
工作站233可以包括已注册PnP提供者实例。为向其伙伴告知该PnP提供者实例的存在,工作站233通过联盟基础结构来路由注册请求201。注册请求201最初被转发给膝上型计算机231,后者进而将注册请求201转发给消息代理237,后者又进而将注册请求201转发给消息网关241。消息网关241将注册信息注册请求201保存在其数据库中,并将成功消息204返回给工作站233。
随后,另一已注册提供者实例,此次是运行服务的提供者实例,在工作站233内变得活跃。此次,该节点知道消息网关241负责注册,并将注册请求205直接转发给消息网关241。消息网关241将注册信息注册请求205保存在其数据库中,并将成功消息206返回给工作站233。
随后,打印机236(例如,UPnP打印机)被通电,并发送通告207。服务器234检测到通告207,并将注册请求208路由到消息代理237。消息代理237将注册请求208转发给消息网关241。消息网关241将注册信息注册请求208保存在其数据库中,并将成功消息210返回给服务器234。
随后,个人计算机242发出发现所有设备的查找请求211。由于个人计算机242不知道将查找请求211转发到何处,因此它通过工作站243来路由查找请求211。由于注册和查找请求被路由到同一目的地,因此路由协议本质上保证两个请求之间的会合将导致工作站243将寻找请求211转发给消息网关241。消息网关241查找其所维护的注册信息,并将寻找请求211转发给工作站233和服务器234两者。工作站233和服务器234将分别将响应消息214和216发送给个人计算机242。
该第四种机制通过将请求路由(而非洪泛)具有请求中所指定的注册的全局消息的节点(消息网关241)来工作。如将在以下更详细描述的,该第四种机制本质上保证路由可在O(log N)个跳中实现,其中N是参与联盟基础结构的节点数。由于该第四种机制高效地划分了节点伙伴关系和注册信息,因此它能伸缩到非常大的网络,甚至因特网。
尽管描述了多种联盟机制,但是本领域的技术人员在仔细阅读了本说明书之后可以清楚其它联盟机制也是可能的。
联盟中的节点之间的关系
因此,联盟由在其间协作以形成其中可***地且高效地散布并定位信息的动态且可伸缩网络的一组节点构成。节点使用自反的、反对称的、传递的、总的、且在节点身份域上定义的二元关系被组织为已排序列表来参与联盟。该已排序列表的两端是联接的,由此形成环。由此,该列表中的每一节点可将其自身视为在该已排序列表的中间(作为使用模算术的结果)。此外,该列表被双重链接,使得任何节点可以在任一方向上遍历该列表。
每一联盟节点可被分配一来自0和某一固定上限之间的一组固定ID的ID(例如,由带有重复检测的随机数生成器)。由此,将该固定上限的ID加1将导致为0的ID(即,从链表的末尾移回该链表的开头)。另外,定义了从节点身份的值域到节点本身的1:1映射函数。
图3描绘了示例链表304和相应的环306。给定这一环,可定义以下函数:
RouteNumerically(V,Msg):给定来自节点身份的值域的值V和消息“Msg”,将消息传递到其身份可使用该映射函数映射到V的节点X。
Neighborhood(X,S):Neighborhood(邻域)是节点X的任一侧上其势等于S的节点集。
当该联盟内的每一节点具有该环的全局知识时,通过直接将Msg发送到其身份通过向V应用该映射函数而获得的节点X来实现RouteNumerically(V,Msg)。或者,当节点具有其它节点的有限知识(例如,仅具有直接相邻的节点的知识)时,通过沿着环将消息转发到连贯的节点直到其到达目的地节点X来实现RouteNumerically(V,Msg)。
或者(且有利地),节点可以存储关于环的足够的知识来执行分布式二分搜索(而不必具有全局知识或实现直接相邻节点之间的路由)。环知识的量是可配置的,使得维护环知识对于每一节点有足够小的影响,但允许从减少环跳数目中提高路由性能。
如上所述,ID可使用在自然数的足够大的、有界的集合上定义的“<”(小于)关系来分配,这意味着其范围在0和某一固定值之间(包括端点)的一组有限数字上。由此,参与该联盟的每一节点被分配落入0和某一适当选择的上界之间(包括端点)的自然数。范围不必是紧密的,并且在分配给节点的数字之间可以有间隙。分配给节点的数字用作其在环中的身份。映射函数通过将落在两个节点身份之间的数字映射到其身份在数值上更接近该数字的节点来解决数字空间中的间隙。
该方法具有若干优点。通过向每一节点分配均匀分布的数字,该环的所有段都被均匀填充的可能性增加。此外,后继者、前导者和邻域计算可以使用模算术来高效地完成。
在某些实施例中,联盟节点被分配来自一ID空间的ID,该ID空间非常大,以致于两个节点被分配相同的ID的机率是高度不可能的(例如,当使用随机数生成时)。例如,一节点可被分配范围在0到bn-1的ID,其中b等于例如8或16,而n等于例如128位或160位等效数字。因此,节点可被分配例如范围在0到1640-1(或近似地1.461502E48)之间的ID。范围0到1640-1将提供例如足够数量的ID来向因特网上的每一节点分配唯一ID。
由此,联盟中的每一节点可具有:
ID,其是均匀分布在范围0到bn-1中的数值;以及
由以下各项构成的路由表(所有算术都以模bn完成):
后继者节点(s);
前导者节点(p);
邻域节点(pk,...,p1,p,s,s1,...,sj),使得
sj.s.id>(id+u/2),j≥v/2-1,且pk.p.id<(id-u/2),且k≥
v/2-1;以及
路由节点(r-(n-1),...,r-1,r1,...,rn-1),使得
r±i=RouteNumerically(id±bi,Msg)。
其中b是数基,n是以位数为单位的字段大小,u是邻域范围,v是邻域大小,且算术是以模bn来执行的。为得到良好的路由效率和容错,u和v的值可以是u=b和v≥max(log2(N),4),其中N是物理上参与联盟的节点的总数。N可以例如在存在ID的均匀分布时从其长度大于或等于b的环段上存在的节点数中估算。b和n的典型值是b=8或16,且n=128位或160位等效数字。
因此,路由节点可以形成横跨环的对数索引。取决于节点在环上的位置,例如,当在集合id±bi(其中i=(1,2,...(n-1)))中的每一数字处有一现有节点时,精确的对数索引是可能的。然而,情况可以是在该集合中的每一数字处没有现有节点。在这些情况下,可选择最接近id±bi的节点作为路由节点。所得的算术索引并不是精确的,并且甚至可能对集合中的某些数字缺少唯一路由节点。
再次参考图3,图3示出了联盟基础结构中的节点之间采用已排序列表304和相应的环306的形式的二元关系的示例。已排序列表304的ID空间在范围0到28-1(即255)中。即,b=2且n=8。由此,图3所示的节点被分配范围在0到255的ID。已排序列表304利用自反的、反对称的、传递的、总的、且在节点身份域上定义的二元关系。已排序列表304的两端是联接的,由此形成环306。这使得图3中的每一节点可将其自身视为在已排序列表304的中间。已排序列表304被双重链接,使得任何节点可以在任一方向上遍历已排序列表304。用于遍历已排序列表304(或环306)的算术以模28来执行。由此,255(或已排序列表304的末尾)+1=0(或已排序列表304的开头)。
路由表指示ID 64的后继者是ID 76(从ID64开始顺时针的紧接着的ID)。后继者可以在例如新节点(例如,具有ID 71)加入或现有节点(例如,ID 76)离开联盟基础结构时改变。同样,路由表指示ID 64的前导者是ID 50(从ID 64开始逆时针的紧接着的ID)。前导者可以在例如新节点(例如,具有ID 59)加入或现有节点(例如,ID 50)离开联盟基础结构时改变。
路由表还指示对ID 64的一组邻域节点具有ID 83、76、50和46。一组邻居节点可以是在ID 64的指定范围(即,邻居范围u)内的指定数量的节点(即,邻域大小v)。可能使用各种不同的邻域大小和邻居范围,诸如,例如V=4和U=10来标识邻域节点集。邻域集可以例如在节点加入或离开联盟基础结构时,或在指定数量的节点或指定范围改变时改变。
该路由表还指示ID 64可以路由到ID为200、2、30、46、50、64、64、64、64、76、83、98、135和200的节点。该列表通过标识最接近id±2i的集合中的每一数字的节点来生成,其中i=(1,2,3,4,5,6,7)。即,b=2且n=8。例如,ID为76的节点可从计算对64+23,即72最接近的节点来标识。
节点可以将消息(例如,对资源访问的请求)直接路由到前导者节点、后继者节点、邻域节点集中的任何节点、或任何路由节点。在某些实施例中,节点实现数值路由函数来路由消息。由此,可在节点X处实现RouteNumerically(V,Msg)来将Msg传递给联盟中其ID数值上最接近V的节点Y,并将节点Y的ID返回给节点X。例如,ID为64的节点可以实现RouteNumerically(243,Msg)来使得消息被路由到ID为250的节点。然而,由于ID250不是对于ID64的路由节点,因此ID64可将消息路由到ID2(对243最接近的路由节点)。ID为2的节点可以进而实现RouteNumerically(243,Msg)以使得消息被路由(直接地或通过其它中间节点)到ID为250的节点。由此,情况可以是RouteNumerically函数被递归地调用,其中每一调用将消息路由到更接近目的地的地方。
Proximity
有利的是,本发明的其它实施例帮助基于一个或多个邻近性类别(例如,地理边界、路由特性(例如,IP路由跳)、管理域、组织边界等)的多个邻近性准则来将环划分成环的环或环的树。应当理解,环可使用同一类型的邻近性准则来多次划分。例如,环可基于大陆邻近性准则和国家邻近性准则(两者都是地理边界邻近性类别)来划分。
由于ID可在ID空间上均匀分布(随机数生成的结果),因此循环ID空间的任何给定段有很高的可能性包含属于不同邻近性类的节点,只有这些类具有大致相同的势。该概率在存在足够数量的节点来获得有意义的统计行为时进一步增加。
由此,任何给定节点的邻域节点从邻近性的观点来看通常是良好分散的。由于所发布的应用程序状态可以在邻域节点之间复制,因此所发布的信息从邻近性的观点来看也是良好分散的。
图4示出了帮助邻近路由的环的环400。环401可被视为主或根环,且包含环402、403和404的每一个中的所有节点。环402、403和404的每一个可包含来自环401的、基于指定的邻近性准则划分的节点子集。例如,环401可以基于地理位置来划分,其中环402包含在北美的节点,环403包含在欧洲的节点,而环404包含在亚洲的节点。
在包含65,536(216)个ID的数值空间中,将消息从ID为5,345的北美节点路由到ID为23,345的亚洲节点可包括在环402内路由消息,直到标识了亚洲节点的邻居节点。该邻居节点然后可将该消息路由到亚洲节点。由此,在北美节点和亚洲节点之间形成了单个跳(而非多个跳)。因此,路由是以资源高效的方式来执行的。
图5示出了帮助邻近路由的示例性的、归纳了邻近性的环的分区树500。如图所示,环的分区树500包括多个环。每一个环表示一已排序链表的一个分区。每一个环包括其ID在该已排序链表中的多个节点。然而,为了清楚起见,由于潜在节点的数量,未在环上明确地描绘节点(例如,分区树500的ID空间可以是b=16且n=40)。
在分区树500内,根环501基于准则571(第一管理域边界准则)被划分成多个子环,包括子环511、512、513和514。例如,DNS名称的每一分量可被认为是一邻近性准则,它们之间的部分排序按照其从右到左出现在DNS名称中的次序来归纳。相应地,子环511可基于准则581(第二管理域边界准则)被进一步划分成多个子环,包括子环521、522和523。
子环522可基于准则572(地理边界准则)被进一步划分成多个子环,包括子环531、532和533。基于位置的邻近性准则可以按照大陆、国家、邮政编码等来部分排序。邮政编码本身是分层地组织的,这意味着它们能够被视为进一步归纳了邻近性准则的部分排序的子列表。
子环531可基于准则573(第一组织边界准则)被进一步划分成多个子环,包括子环541、542和543。邻近性准则的部分排序的列表可以按照一给定公司在组织上如何结构化(如分公司、部门和产品组)来归纳。相应地,子环543可基于准则583(第二组织边界准则)被进一步划分成多个子环,包括子环551和552。
在分区树500内,每一节点具有单个ID,并沿着从根开始到叶的相应分区路径参与环。例如,参与子环552的每一节点也参与子环543、531、522、511和根501。路由到目的地节点(ID)可以通过如下实现RouteProximally函数来完成:
RouteProximally(V,Msg,P):给定来自节点身份的域的值V和消息“Msg”,按照邻近性准则P将消息传递到被认为是等效的节点中其身份可被映射到V的节点Y。
由此,路由可以通过逐渐移向给定环内更接近目的地节点的地方,直到如从目的地节点位于当前节点和其后继者或前导者节点之间的条件所确定的在该环内的路由不能做出任何进一步的进展来完成。此时,当前节点开始经由其所参与的下一更大的环中其父节点路由。这一通过沿着分区路径向着根环爬来逐渐移向目的地节点的过程在如最初在RouteProximally调用中指定的在所请求的邻近上下文中达到最接近目的地节点的节点时终止。
路由跳可以保留在发起该请求的节点的邻近邻域中,直到由于目的地节点位于其外部而在该邻域中不能做出任何进一步的进展。此时,邻近性准则被放松以增加邻近邻域的大小来做出进一步的进展。重复该过程,直到足够地扩展了邻近邻域来包括目的地节点(ID)。在每一相继的邻近邻域放松之后做出的路由跳可能是在邻近空间中与前一跳相比更大的跳跃,而在数值空间中做出相应的更小的跳跃。由此,仅绝对需要的数量的此类(环间)跳在到达目的地之前做出。
情况可以是对于查找消息避免了某些跳,因为所发布的应用程序数据在其在目的地节点的邻域节点之中复制时沿着分区树向下复制。
为实现邻近路由,每一联盟节点维护对其作为成员所参与的所有环中其后继者和前导者节点(类似于对于单个环的后继者和前导者),即邻近前导者、邻近后继者和邻近邻域的引用。为了使得路由高效,节点还可维护对作为路由伙伴的、最接近该环的任一半上距离呈指数地增加的其它节点(类似于对单个环的路由节点)的引用。在某些实施例中,落入一对连贯的后继者和前导者节点之间的路由伙伴节点参与由当前节点和在后继者和前导者节点对中数值上最接近它的节点分别共享的同一最低环。由此,向着目的地节点的路由跳仅在绝对需要来做出进一步的进展时才使用放松的邻近性准则来转换(即,转换到更高的环)。因此,消息可高效地与相应的联盟节点会合。
在某些实施例中,节点实现邻近路由函数来基于等效性准则关系路由消息。由此给定数字V和消息“Msg”,节点可以实现RouteProximally(V,Msg,P)来按照邻近性准则P将消息传递到被认为是等效的节点中其身份可被映射到V的节点Y。邻近性准则P标识了分区树中作为被其认为邻近地等效的所有节点的公共祖先的最低环。它可被表示为通过将沿着从根环到由其标识的环的路径找到的邻近性准则串接起来而获得的串,由路径分隔符‘/’来分隔。例如,标识子环542的邻近性准则可被表示为“Proximity:/.COM/Corp2/LocationA/Div2”。分区树500中的每一个环可以例如通过将其表示串用基于SHA的算法来散列而被分配唯一数字。如果为根环保留了数字0,则可以推断出RouteNumerically(V,Msg)≡RouteProximally(V,Msg,0)。
例如,子环544中的节点可以实现RouteProximally以标识子环531中更接近的节点(例如,对子环513中的节点)。进而,子环531可以实现RouteProximally以标识子环522中更接近的节点。同样,子环522可以实现RouteProximally以标识子环511中更接近的节点。类似地,子环511可以实现RouteProximally以标识环501中更接近的节点。由此,情况可以是RouteProximally函数被递归地调用,其中每一调用将消息路由到更接近目的地的地方。
由此,当考虑邻近性准则时,到最终目的地的路径上的路由跳可以保留在发起请求的节点的附近,同时在数值空间中在始发节点和目的地节点之间做出显著的进展,直到或者到达目的地节点,或者在所选邻近性准则下不能做出任何进一步的进展,此时只需足够地放松该准则以向着目的地做出进一步的进展。例如,邻近性准则可以对于要从环531向上路由到环522的消息足够地放松等等。
利用以上关于邻近性的方法,有可能将所发布的信息限于一给定环。例如,组织可能希望确保组织特有的信息不对其信任域之外的实体或者(1)以向其域外部的节点的邻域复制的形式隐式地,或者(2)以服务对这一信息查找请求的形式显示地可用。第一方面通过仅在与指定环内的目标ID相邻的节点之中复制所发布的信息来满足。由于由节点发起的所有消息都通过向着根环相继爬过它所属的环来路由,因此在一组织内始发的所有查找请求有很大的可能性能够定位被限制到它的所发布的信息,由此隐式地满足了第二方面。
并且,组织不希望节点自动与其信任域外部的节点联盟。这可例如在访问的销售人员将他/她的膝上型计算机连接到顾客房屋中的网络时发生。理想地,属于该销售人员的膝上型计算机希望定位到其归属域中所发布的信息和/或与其归属域中从其最低的优选邻近环开始的节点联盟。它通常不被允许与顾客的域外部的节点联盟。支持这一情形需要定位归属域中的种子节点的能力。这些种子节点可用于定位归属域中发布的信息、加入归属联盟、选择性地跨域导入和导出所发布的信息、以及作为仲裁其他节点提交的冲突故障报告的一种可能方法。种子节点有时被称为消息网关。
在其它实施例中,实体发布对根环中的种子节点的引用。种子节点可以在与环(作为目标ID)相关联的唯一数字(诸如通过散列其表示串获得的)处发布。种子节点信息可以由在到根环中的相应目标ID的路径上的各个环中的节点按需进一步高速缓存。这一按需高速缓存提供了改进的性能并减少了在相当频繁地查找半静态信息时可能发生的热点。种子节点信息也可经由诸如DNS等其它手段来获得。
为提供对于受限制的所发布信息的容错,每一节点可以维护其所参与的所有环中的一组邻域节点。给定以上原因,由节点维护的状态可概括如下:
●ID,其是均匀分布在范围0到bn-1中的数值。
●由以下各项构成的路由表(所有算术都以模bn完成):
○对节点参与的每一环,如环d
■后继者节点(sd)
■前导者节点(pd)
■邻域节点(pkd,...,P1d,pd,sd,s1d,...,sjd),使得sjd.sd.id>(id+u/2),j≥v/2-1,Pkd.Pd.id<(id-u/2),且k≥v/2-1。
○路由节点(r-(n-1),...,r-1,r1,...,rn-1),使得r±i=RouteProximally(id±bi,updateMsg,d),使得适当时sd≤id+bi≤sd+1或pd+1≤id-bi≤pd。
其中b是数基,n是以位数为单位的字段大小,u是邻域范围,且v是邻域大小。
注意,由环“d”中的给定节点维护的邻域节点的子集再次可作为邻域节点出现在给定节点也参与的子环“d+1”中。由此,可以得出由给定节点跨其所参与的所有D个环维护的邻域节点的总数的上限为D*max(u,v)/2。这考虑了仅保持对给定节点的一个引用,并且最坏情况的上限是针对平衡树的。
应当注意,当环被划分成多个相应的兄弟子环时,例如通过别名化来准许指定节点同时参与多个相应兄弟子环中多于一个子环。别名化可以被实现来将例如来自不同子环的不同状态与指定节点相关联。由此,尽管对给定节点的别名具有相同的ID,但是每一别名可以具有与其相关联的完全不同的状态。别名化允许指定节点参与具有完全不同的邻近性准则的多个环,这些完全不同的邻近性准则不必是更具体的邻近性准则的共同的祖先。即,指定节点可以参与邻近性树的多个分支。
例如,双NIC(有线和无线)膝上型计算机可被认为在邻近性上等效于共享与该膝上型计算机相同的LAN段的两个其它无线和有线节点。但是,这两个不同的邻近性准则可被建模为仅在应用了诸如,例如基于组织成员关系的不同的更高优先级的邻近性准则之后才适用。由于该膝上型计算机属于相同的组织,因此两个子环中带别名的节点表示1)有线LAN段中的成员资格,以及2)无线LAN段中的成员资格合并成表示该膝上型计算机所属的组织的环中的单个节点。应当理解,RouteProximally如所预期的那样工作,而没有对别名化的存在有任何修改。
每一邻近环可根据(可能不同的)环参数来配置。环参数可用于定义邻域(例如,环参数可表示邻域范围、邻域大小、用于查验和离开消息的查验消息和离开消息定时和分发模式)、指示特定的联盟机制(例如,从上述先前描述的第一到第四种联盟机制中,或从其它联盟机制中)、或定义同一邻近环中的路由伙伴之间的通信细节。某些环参数可能较概括,适用于多个不同的联盟机制,而其它环参数更具体,且适用于特定类型的联盟机制。
用于配置较高级邻近环的环参数在某些实施例中可以由较低级邻近环继承。例如,情况可以是环543继承环531的某些环参数(后者进而从环522继承,等等)。由此,与环531相关联的邻域大小和邻域范围也与环541相关联。
然而,所继承的环参数可以被更改,和/或邻近环可以根据不同的环参数来个别地配置。例如,情况可以是环511是用于包含大量节点的管理域的,且因此上述第四种联盟机制对环511更适当。另一方面,情况可以是环521是用于具有相对较小数量的节点的小型企业的,且因此上述第二种联盟机制对环521更适当。由此,与环521相关联的环参数可以被设为(或将继承的参数改为)与同环511相关联的环参数不同的值。例如,指示特定类型的联盟机制的环参数可以在环511和521之间不同。类似地,定义邻域的参数可以在环511和521之间不同。此外,环521可以根据对上述第二种联盟机制专用的特定参数来配置,而环511根据对上述第四种联盟机制专用的特定参数来配置。
因此,邻近环可以基于邻近环中的节点的特性(例如数量、所包括的资源等)来灵活地配置。例如,管理员可以使用配置过程(例如,通过用户界面)为邻近环选择环参数。配置过程可以帮助配置邻近环之间的继承关系,以及配置个别邻近环,以便诸如,例如覆盖以其它方式继承的环参数。
图8示出了用于对联盟基础结构的节点分区的方法800的示例流程图。方法800将参考图5中的分区树500的环来描述。方法800包括访问包含已被分配给联盟基础结构中的节点的节点ID的已排序链表的动作(动作801)。例如,可访问由环501表示的已排序链表。已排序链表的节点ID(环501上所描绘的节点)可以表示联盟基础结构(例如,联盟基础结构100)中的节点。
方法800包括访问表示用于对已排序链表分区的多个不同邻近性准则的邻近性类别的动作(动作802)。例如,可访问表示域边界561、地理边界562、以及组织边界563的邻近性准则。然而,在所访问的邻近性准则中也可以表示其它邻近性准则,诸如信任域边界。邻近性类别可以包括先前创建的邻近性准则的部分排序的列表。环可以基于邻近性准则的部分排序的列表来划分。
方法800包括基于第一邻近性准则将已排序链表划分成一个或多个第一子列表的动作(动作803),其中一个或多个第一子列表中的每一个都包含来自已排序链表的节点ID的至少一个子集。例如,环501可以基于准则571被划分成子环511、512、513和514。子环511、512、513和514中的每一个可以包含来自环501的节点ID的不同子集。
方法800包括基于第二邻近性准则将选自一个或多个第一子列表的第一子列表划分成一个或多个第二子列表的动作(动作804),其中一个或多个第二子列表的每一个都包含第一子列表中所包含的节点ID的至少一个子集。例如,子环511可以基于准则581被划分成子环521、522和523。子环521、522和523中的每一个可以包含来自子环511的节点ID的不同子集。
图9示出了用于填充节点路由表的方法900的示例流程图。方法900将参考图3中的已排序链表304和环306来描述。方法900包括将前导者节点***到路由表中的动作(动作901),该前导者节点在已排序链表的第一方向中相对于当前节点在当前节点之前。例如,ID为50的节点可作为ID为64的节点(当前节点)的前导者被***到路由表中。在顺时针方向321上移动(从已排序链表304的A端向着已排序链表304的B端),ID为50的节点在ID为64的节点之前。***前导者节点可以在当前节点和前导者节点之间建立对称伙伴关系,使得当前节点是前导者节点的伙伴,而前导者节点是当前节点的伙伴。
方法900包括将后继者节点***到路由表中的动作(动作902),该后继者节点在已排序链表的第一方向中相对于当前节点在当前节点之后。例如,ID为76的节点可作为ID为64的节点(当前节点)的后继者被***到路由表中。在逆时针方向322上移动,ID为76的节点在ID为64的节点之后。***后继者节点可以在当前节点和后继者节点之间建立对称伙伴关系,使得当前节点是后继者节点的伙伴,而后继者节点是当前节点的伙伴。
方法900包括将适当的邻域节点***到路由表中的动作(动作903),该邻域节点基于邻域范围和邻域大小在第一方向和第二相反方向两个方向上从已排序链表中标识。例如,ID为83、76、50和46的节点可作为ID为64的节点(当前节点)的邻域节点被***到路由表中。基于邻域范围20和邻域大小4,可在顺时针方向321上标识ID为83和76的节点,并在逆时针方向322上(从已排序链表304的B端移向已排序链表304的A端)标识ID为50和46的节点。情况可以是在某些实施例中没有标识适当的邻域节点。***邻域节点可以在当前节点和邻域节点之间建立对称伙伴关系,使得当前节点是邻域节点的伙伴,而邻域节点是当前节点的伙伴。
方法900包括将适当的路由节点***到路由表中的动作(动作904),该路由节点基于联盟基础结构的数基和ID空间的字段大小在第一和第二两个方向上从已排序链表中标识,该路由节点表示在第一和第二两个方向上该已排序链表的对数索引。例如,ID为200、2、30、46、50、64、64、64、64、76、83、98、135和200的节点可作为ID为64的节点的路由节点被***到路由表中。基于数基2和字段大小8,可在方向321上标识ID为64、64、76、83、98、135和200的节点,并在方向322上标识ID为64、64、50、46、30、2和200的节点。如在环306内描绘的,路由节点表示顺时针方向321和逆时针方向322两个方向上已排序链表304的对数索引。***路由节点可以在当前节点和路由节点之间建立对称伙伴关系,使得当前节点是路由节点的伙伴,而路由节点是当前节点的伙伴。
图7示出了考虑了邻近性准则的、用于填充节点路由表的方法700的流程图。方法700将参考图5的环来描述。方法700包括将关于当前节点所参与的每一分层地划分的路由环的前导者节点***到路由表中的动作(动作701)。每一前导者节点在当前节点所参与的每一分层地划分的路由环中在第一方向(例如,顺时针)上在当前节点之前。分层地划分的路由环根据相应的邻近性准则来划分,并且至少包含双向链表的子集(可能是整个双向链表)。例如,情况可以是指定节点参与根环501以及子环511、522、523、531和542。由此,从环501和子环511、522、523、531和542的每一个中为指定节点选择一前导者节点。
方法700包括将关于当前节点所参与的每一分层地划分的路由环的后继者节点***到路由表中的动作(动作702)。每一后继者节点在当前节点所参与的每一分层地划分的路由环中在第一方向上在当前节点之后。例如,从环501和子环511、522、523、531和542的每一个中为指定节点选择一后继者节点。
方法700包括将关于当前节点所参与的每一分层地划分的路由环的适当的邻域节点***到路由表中的动作(动作703)。邻域节点可以基于邻域范围和邻域大小从当前节点所参与的分层地划分的路由环中在第一方向(例如,顺时针)和第二相反方向(例如,逆时针)两个方向上标识。例如,从环501和子环511、522、523、531和542的每一个中为指定节点标识邻域节点。
方法700包括将关于当前节点所参与的分层地划分的路由环的适当的路由节点***到路由表中的动作(动作704)。例如,从环501和子环511、522、523、531和542的每一个中为指定节点标识路由节点。
在某些实施例中,对节点Y所参与的除了叶环(或在利用别名化的实施例中的多个叶环)之外的每一邻近环d***适当的路由节点。适当的路由节点可以基于以下表达式来***:
如果Y.sd.id<Y.id+bi<Y.sd+1.id为真,则使用环d;或者
如果Y.pd.id<Y.id-bi<Y.Pd+1.id为真,则使用环d。
如果在前一步中未标识环,则使用叶(例如,环501)环作为环d。现在,环d是节点Y应在其中查找最接近z的路由伙伴的邻近环。
图10示出了用于将消息向着目的地节点路由的方法1000的示例流程图。方法1000将参考图3中的已排序链表304和环306来描述。方法1000包括接收节点接收消息以及指示目的地的数字的动作(动作1001)。例如,ID为64的节点可接收指示目的地212的消息。
方法1000包括确定接收节点是数值上比相应的前导者节点离目的地更远和数值上比相应的后继者节点离目的地更远中的至少一种的动作(动作1002)。例如,在方向322上,ID64比ID50离目的地212更远,而在方向321上,ID64比ID76离目的地212更远。方法1000包括确定目的地不在对应于接收节点的邻域节点集内的动作(动作1003)。例如,ID为64的节点可确定目的地212不在邻域集83、76、50和46内。
方法1000包括从对应于接收节点的路由表中标识中间节点的动作(动作1004),该中间节点数值上比相应的路由表中的其它路由节点离目的地更近。例如,ID为64的节点可标识ID为200的路由节点在数值上比其它路由节点离目的地212更近。方法1000包括将消息发送到中间节点的动作(动作1005)。例如,ID为64的节点可将消息发送到ID为200的节点。
图11示出了用于基于邻近性准则将消息向着目的地节点路由的方法1100的示例流程图。方法1100将参考图4和图5的环来描述。方法1100包括接收节点接收消息以及指示目的地和邻近性准则的数字的动作(动作1101)。邻近性准则定义了一个或多个节点类。接收节点作为基于邻近性准则从一个或多个节点类所选的当前节点类的一部分接收消息。例如,ID为172的节点可接收指示目的地201的消息以及指示目的地节点是由环401所表示的类的一部分的邻近性准则。ID为172的节点可以接收作为环404的一部分的消息。
方法1100包括确定在所选节点类的节点中,接收节点是数值上比相应的前导者节点离目的地更远和数值上比相应的后继者节点离目的地更远中的至少一种的动作(动作1102)。例如,在环404内,ID为172的节点在顺时针方向上比ID为174的节点离目的地201更远,且在逆时针方向上比ID为153的节点离目的地201更远。
方法1100包括确定对由邻近性准则定义的一个或多个节点类的任一个,目的地不在接收节点的邻域节点集内的动作(动作1103)。例如,ID为172的节点可确定目的地201不在环404或环401中相应的邻域集内。
方法1100包括从接收节点的路由表中标识中间节点的动作(动作1104),该中间节点数值上比路由表中的其它路由节点离目的地更近。例如,ID为172的节点可标识ID为194的节点在数值上比环404中的其它路由节点离目的地201更近。方法1100包括将消息发送到中间节点的动作(动作1105)。例如,ID为172的节点可将所接收到的消息发送到ID为194的节点。ID为172的节点可将所接收到的消息发送到ID为194的节点,以遵循先前定义的邻近性准则的部分排序的列表。
节点194可在环404内尽可能地接近目的地201。由此,可适度足够地放松邻近性以允许在下一分支中在环401内向目的地进一步路由。即,路由从环404转换到环401,因为在环404上不能做出向着目的地的任何进一步进展。或者,情况可以是ID为201的节点在环401中ID为194的节点的邻域内,导致没有进一步的路由。由此,在某些实施例中,放松邻近性准则以到达下一更高的环足以引起进一步的路由。
然而,在其它实施例中,导致转换到下一更高的环的邻近性准则的增量放松继续直到能发生进一步的路由(或直到遇到根环)。即,在可做出进一步的路由进展之前发生向更高环的多个转换。例如,现在参考图5,当在环531上不能做出进一步路由进展时,可足够地放松邻近性准则以转换到环511或甚至转换到根环501。
节点阶段
参与联盟基础结构的节点可以在不同的操作阶段中操作。对于节点的有效阶段值可被定义为一有序集的成员。例如,{节点Id}.{实例ID}.{阶段值[阶段状态值:***,同步,路由,操作].[阶段.未知指示:传输时已知的阶段,传输时未知的阶段]}定义了表示联盟基础结构内的给定节点的阶段空间的一种可能的有序集。节点实例可以按序转换(或前进)通过从***到同步到路由到操作的节点阶段状态。此外,在某些实施例中,节点实例可被配置成使得防止节点实例转换回先前的节点阶段状态。在某些实施例中,在每副节点上升时,节点将其实例ID前进。
例如,可防止节点实例从路由转换回同步(或转换回***),等等。因此,在某些实施例中,当已知给定节点实例(例如,由(节点Id,实例Id)标识)前进到特定的节点阶段状态(例如,操作),则也已知该给定节点实例不可能(且在某些实施例中不会)回退到先前的节点阶段状态(例如,回到路由、同步或***)。由此,在特定节点阶段状态之前的节点阶段中的任何节点实例很有可能是该节点的新(且前面的)实例。
在某些实施例中,将阶段信息和相应的实例Id(当节点上升时前进)一起传输。由此,有可能确定对于同一实例的较小的节点阶段状态较旧。此外,当已知一较新的节点实例(在任何阶段状态值)时,关于较旧实例的任何信息被认为是过时的。
节点经常可以重新引导或者丢失与彼此的通信,诸如,例如在首次启动时、通过优雅离开、或作为异常终止(崩溃)的结果。由此,任何节点阶段状态中的节点有可能重新引导或丢失与其它节点的通信。例如,崩溃可导致路由阶段状态中的节点重新引导。在重新引导或丢失通信期间,可能没有方法来确定一节点在什么节点阶段状态。因此,当一节点正在重新引导或丢失与节点的通信时,可设置[阶段.未知指示]来指示该节点的阶段状态当前是未知的。然而,可维护任何先前表达的和/或检测到的关于该节点的阶段状态且该状态不会丢失。
可使用[阶段.未知指示]来指示在发送阶段状态值时阶段状态是否已知(例如,未设置阶段.未知的阶段值),或者阶段状态是否是先前表达的阶段状态且该阶段状态在发送该阶段状态时不是已知的(例如,设置了阶段.未知的阶段值)。由此,节点的阶段(其阶段值)可以使用阶段状态值和阶段.未知指示两者来表示。
加入协议
有时,节点可以加入和离开现有联盟。节点可以实现用于加入和离开联盟的适当协议。例如,节点可以实现Join()函数以成为现有联盟的一部分。实现Join()函数的节点在到达最终的操作阶段状态之前可以转换通过三个有序阶段状态:***阶段状态、同步阶段状态以及路由阶段状态。在其它实施例中,这些特定的有序阶段状态可能不存在,而可以定义其它阶段状态。图12A示出了节点建立联盟基础结构内的成员资格的示例。图12B示出了联盟基础结构内的节点交换消息的示例。
***阶段:节点Y通过发出加入消息来进入该阶段状态,该加入消息至少包括其节点ID并指示对联盟的加入动作。加入消息可以是由新加入的节点(节点Y)在将其目的地特性设为新加入的节点的身份的情况下发送的路由的消息。在该阶段状态中,新加入的节点被***在联盟中其前导者和后继者节点之间。***阶段状态可以根据以下算法来实现(所有算术都以模bn来执行):
IP1.Y标识已经是加入节点希望从中参与联盟的最低环的一部分的现有节点。这或者可被静态地配置,或者可使用DHCP和/或DNS和/或WS发现或(可能公知的)常量来动态地发现。设该现有联盟节点为E。
IP2.Y调用E.RouteNumerically(Y,joinMsg)来确定在节点Y所参与的每一邻近环中其ID在数值上最接近Y.id的节点X。这可包括将加入消息路由到多个节点。
IP3.确定数值上的后继者和前导者节点。(注意,完成以下***所需的数据可以在加入消息及其响应中携带。由此,不需要附加的往返。)
情况1:X.id>Y.id
Y.s=X,Y.p=X.p,X.p.s=Y,且X.p=Y
情况2:X.id<Y.id
Y.p=X,Y.s=X.s,X.s.p=Y,且X.s=Y
响应于加入消息,节点X(处理该加入消息的节点)可以向节点Y发回加入响应。该加入响应可以指示节点Y的前导者节点(Y.p)和后继者节点(Y.s)。节点Y可以接收加入响应,并处理加入响应以变得知晓其前导者和后继者节点。在处理了加入响应之后,节点Y可以是联盟中的弱路由参与者。例如,节点Y可以仅仅将发送给它的消息转发给或者其后继者或者其前导者节点。由此,节点Y被***到联盟基础结构中,但是未填充路由和邻域表。在到达这一点之前,节点Y将通过向发送节点返回指示节点Y的活跃度阶段是处于***阶段状态的状态消息,来请求向其发送消息的其它节点通过不同的节点重定向发送给它的消息。
一般而言,有时,节点可以交换同步请求和响应消息。同步请求和同步响应消息可以包括从发送者的观点来看的关于其它节点的活跃度信息(例如,首部)。也可在同步请求和响应消息中包括邻域状态,使得邻域中的应用层知晓彼此的状态。何时交换同步请求和响应消息的一个示例是在同步加入节点的阶段状态期间。然而,同步请求和响应消息也可以在其它可操作阶段状态(例如,在操作阶段状态中)期间交换。
图16示出了消息模型和相关的处理模型1600的示例。如图16所示,节点可以发送和接收同步请求消息。例如,同步请求消息1601可以在功能层1651处从新***的节点(例如,图12B中ID为144的节点)接收。应用程序数据1602(例如,命名空间订阅)可以承载在同步请求消息1601中。功能层1651可以将包括在同步请求消息中的任何应用程序数据通知给应用层1652。例如,功能层161可以向应用层1652调用包括应用程序数据1602的邻域状态同步事件1603。包括应用程序数据1607的同步请求1631也可被发送到处理模型1600中类似于对同步请求1601的处理来处理同步请求1631的另一节点。
响应于某一功能层事件(例如,同步请求消息1601、同步响应消息1641、或查验消息1612),功能层1651可以调用应用层1652中的邻域状态请求功能1604。邻域状态请求1604是对应用层的获得需要在邻域中传播的状态的请求。响应于邻域状态请求1604,应用层1652可以向功能层1651提供包括可任选应用程序数据1607的邻域状态1606。或者,应用层1652可以作为对某一应用层事件的反应来发送包括可任选应用程序数据1607的邻域状态1606。使用类似于以上的内部机制,功能层1651可以发送包括可任选应用程序数据1607的同步响应消息1608来传播应用层邻域状态。
同步阶段:在处理了加入响应消息之后,节点Y从***阶段状态转换到同步阶段状态。在同步阶段状态中,新***的节点Y与邻域中的节点同步信息。一般而言,节点Y可以至少向在***阶段状态中标识的其前导者和后继者节点发送同步消息。处理同步消息的这些节点可以返回指示这些处理节点的相应的邻域和路由伙伴节点的同步响应。在更具体的示例中,同步阶段状态可以根据以下算法来实现(所有算术都以模bn来执行):
SP1.从节点Y所参与的每一邻近环中的邻域(Y.s)和邻域(Y.p)节点的并集来计算邻域(Y)。该并计算可以如下完成:
(sj,...,s1,s,p,p1,...,pk),使得sj.s.id>(Y.id+u/2),j≥v/2-1,pk.p.id<(Y.id-u/2),且k≥v/2-1
SP2.简要地参考图16,经由邻域状态请求(例如,邻域状态请求1604)查询Y的本地应用层(例如,应用层1652)来获得可任选的应用程序专用邻域数据(例如,应用程序专用数据1607)。
SP3.将至少包括从Y的观点来看的每一邻近邻域和路由伙伴节点的活跃度状态信息的同步消息至少发送给邻近后继者和前导者节点。经由SP2访问的任何可任选的应用程序专用邻域数据(例如,应用程序数据1607)被包括在同步请求1631中。
SP3.Y从处理在SP2中发送的同步消息的这些节点接收回同步响应消息。例如,节点Y可以与其计算的邻域内的一个或多个节点交换同步消息(请求/响应)。在与节点Y的至少一个以及可能所有的邻域节点交换了同步消息之后,计算的邻域节点可以交换进一步的消息以传播同步的数据。同步消息(请求或响应)可以是由节点发送的非路由消息,以主动将其数据与例如在节点邻域中的目标节点同步。
SP4.当接收到SP3中的同步响应消息(例如,同步响应消息1641)时,可经由邻域状态同步事件1603将这些接收到的同步响应消息中存在的任何可任选的应用程序专用邻域数据(例如,应用程序数据1622)提供给Y的应用层1652。
作为同步阶段状态的一部分,邻近后继者(例如,Y.s)和前导者(Y.p)节点与新***的节点(例如,Y)交换其路由表。接收同步消息的节点可以通过发送同步响应来响应。同步响应类似于同步消息携带数据,除了是从响应节点的观点来看的之外。同步消息和同步响应都可携带(或承载)应用程序数据。由此,应用程序数据可在同步阶段状态期间在节点之间传播。当同步阶段状态完成时,节点可以处理目的地为它的消息,而非仅仅将其转发给或者后继者或者前导者。然而,节点仍可被视为弱路由参与者,因为其路由表未被填充。
路由阶段:在完成了同步阶段状态之后,节点转换到路由阶段状态。在路由阶段状态,新同步的节点(例如,节点Y)计算其路由节点。路由阶段状态可以根据以下算法来实现(所有算术都以模bn来执行):
RP1.如果路由阶段状态正作为平衡过程(稍后解释)的一部分来执行,则确保后继者节点(Y.s)和前导者节点(Y.p)在节点Y所参与的每一邻近环中都是活跃的。如果任一个不是活跃的,则通过选择考虑中的环中的邻域节点之中的下一最佳后继者或前导者节点来确定对故障节点的替换节点。
RP2.对于1≤i≤n-1
RP2a.计算z=Y.id±bi
RP2b.如果环d不是最具体的邻近性,则找出节点Y所参与的且满足条件Y.sd.id<Y.id+bi<Y.sd+1.id或Y.pd.id<Y.id-bi<Y.Pd+1.id的邻近环d。或者,使得环d成为最具体的邻近环。现在,环d是节点Y应在其中查找最接近z的路由伙伴的邻近环。设Q是在Y.sd.r±i和Y.pd.r±i之间数值上最接近z的节点。如果|Q.id-z|在bi的可配置百分比(通常是20%)内,则只需令Y.r±i=Q。如果Q.id比(Y.sd.id±bi)或(Y.pd.id±bi)更接近z,则意味着节点Y是邻近环d中比Y.sd或Y.Pd更好的对节点Q的伙伴路由节点。因此,如果尚未发送updageMsg(更新消息),则将其发送给节点Q,该消息提供i和节点Y作为参数,使得节点Q能够建立节点Y为r-i处其伙伴路由节点。
RP2c.如果该阶段状态正作为平衡过程的一部分来执行,并且如果Y.sd.r±i.id==Y.pd.r±i.id,则在(Y.sd.id±bi)和(Y.pd.id±bi)之间的数值范围中仅有一个节点。该节点是后继者(或前导者)节点的路由节点r±i所指向的节点。因此,只需令Y.r±i=Y.sd.r±i.i。
RP2d.否则,通过对节点Q调用RouteProximally并将邻近性准则设为环d的邻近性准则来计算路由伙伴Y.r±i。这意味着Y.r±i=Q.RouteProximally(z,updateMsg,d)。
RP3.此时,节点Y不仅能处理目的地为它的消息,而且还能路由消息。
RP4.如果尚未订阅,则对伙伴路由节点的端点ID订阅从应用层发送的活跃度通知事件。并且,对于不再是伙伴路由节点的那些节点,撤消先前与应用层建立的任何活跃度事件订阅。例如,订阅和/或撤消请求可向上传递到实现用于相应的应用程序(例如,命名空间应用程序)的发布-订阅逻辑的应用层(例如,应用层121)。当在应用层处接收到后续的应用程序专用活跃度消息(例如,因命名空间订阅所得的消息)时,可将通知(事件)向下推至其它较低层(例如,其它较低层131)以供处理。
图17描绘了可在功能层1751和应用层1752之间发生的多个活跃度交互的示例。如图17所示,端点是例如表示各节点的发布/订阅话题(例如,由URL或URI表示),并且可以是例如联盟基础结构节点。订阅活跃度事件1701可以从功能层1751向应用层1752调用以订阅活跃度事件(例如,订阅发布/订阅话题)。撤消活跃度订阅1702可以从功能层1751向应用层1752调用以撤消对活跃度事件的订阅。端点停机1703可以从应用层1752向功能层1751发送以指示端点可能停机并向功能层1751提供可任选的替换端点。端点停机事件1703可以基于先前的订阅(例如,订阅活跃度事件1701)异步地发送。
节点停机1704可以从功能层1751向应用层1752调用,以指示功能层1751(或某一其它较低层)检测到了故障节点并可任选地向应用层1752提供替换节点。应用层1752可以随后将检测到可能的故障节点传播到其它感兴趣的各方。节点停机事件1704可以在功能层1751或某一其它较低层检测到可能的故障节点的任何时刻异步地发送。发送活跃度1706可以在应用层1752检测到一节点停机(例如,从节点停机事件1704或从某一其它带外机制)时从应用层1752向功能层1751调用。发送活跃度事件1706可以使得功能层1751发送活跃度消息。发送活跃度事件1706也可在应用层1752检测到节点停机并且不依赖于任何先前建立的订阅(经由订阅活跃度)的任何时刻异步地调用。
由此,在某些实施例中,功能层1751被递归地使用。例如,功能层1751可以向应用层1752指示对指定节点(例如,是开机或停机的特定节点)的兴趣。应用层1752可以制定对涉及该指定节点的通知的应用程序专用订阅,然后重复使用功能层1751来将所制定的订阅传递到其它联盟节点中的适当的相应应用层1752实例。例如,如果联盟节点内的应用层1752实现命名空间发布/订阅行为,则功能层1751可以将该订阅路由给管理关于指定节点的通知的发布/订阅管理器,该发布订阅管理器被实现为至少是相关的联盟节点中的应用程序1752的一部分。因此,功能层1751用于路由功能层1751所引起的被生成的订阅。也可使用类似的递归机制来取消订阅或以其它方式指示对指定节点不再感兴趣。
操作阶段:在完成了路由阶段状态之后,节点转换到操作阶段状态。节点可以保持在操作阶段状态中,直到其停机(例如,重新引导)。在操作阶段状态中,节点可以不时地将更新消息发送给路由伙伴。更新消息(更新请求和更新响应)可包括关于发送节点(例如,关于所有感兴趣的邻近邻域)的邻域节点活跃度信息。该发送的活跃度信息也可包括发送者的活跃度信息。更新消息可以是节点发起的、周期性地更新其路由伙伴节点的路由的消息。应用程序数据可被承载在更新消息上,使得应用程序数据可以在路由伙伴更新期间传播。消息目的地被设为期望路由索引处的理想路由伙伴的身份。该消息的消息ID特性被分配一应用程序序列号,以便使处理该消息的节点能确定最新消息并且该消息被邻近地路由。
接收更新消息的节点可以用更新响应来响应。更新响应携带了与更新消息相同的数据,除了该数据是从响应节点的观点来看的之外。通过交换更新消息和更新响应,节点能够交换路由信息。有时,可操作节点可更新路由伙伴。
有时,可操作节点也可发送查验消息(例如,查验消息1609和1611)。查验消息是节点发送的单向消息,用于周期性地通告其存在并在其邻域内散布关于其邻域/路由节点的信息并复制(例如,承载)应用程序数据。
原始节点可以向其一个或多个直接前导者和后继者邻域节点发送查验消息。由此,取决于查验分发模式(即,向哪些节点发送查验消息),与原始节点有关的信息被传播给该原始节点的邻域内的环上的其它节点。例如,原始节点可以仅将查验消息发送给其直接前导者和后继者节点,并且查验消息从原始节点的位置(节点ID)在两个方向上沿着环向外传播到该原点的邻域的边缘。或者,原始节点可以将查验消息发送给其邻域中其前导者和后继者两个方向上每第n个节点。
接收查验消息的每一节点检查从邻域范围的观点来看其对原始节点的兴趣。如果不感兴趣,则它丢弃该查验消息。如果感兴趣,则它处理该查验消息,并且如果转发被约束到始发节点的邻域,则根据其指定的环模式来转发该查验消息。例如,在处理了查验消息之后,如果发送和原始节点在其前导者节点集中,则接收节点可将查验消息转发给至少其后继者节点,或者如果发送和原始节点在其后继者节点集中,则至少转发给其前导者节点。
由此,查验消息的向外传播在该消息到达原始节点周围的邻域节点集的边缘时停止。查验消息的消息ID特性被分配一应用程序序列号,以便使处理该消息的节点能确定来自原始节点的最新消息并避免重复处理或另外的不需要的转发。
回头参考图16,查验消息1609可以在功能层1651处从邻域节点接收。应用程序数据1612(例如,命名空间订阅)可以被承载在查验消息1609中。功能层1651可以将包括在查验消息中的任何应用程序数据通知给应用层1652。类似地,功能层1651可以将包括在同步请求消息中的任何应用程序数据通知给应用层1652。这两种传递情况都可经由向应用层1652发送包括应用程序数据1612的邻域状态同步事件1603来实现。
响应于某一功能层事件(例如,接收到查验消息1609),功能层1651可以向应用层1652发送邻域状态请求1604。邻域状态请求1604是在应用层1652上调用的,以获得需要在邻域中可任选地传播的状态。响应于邻域状态请求1604,应用层1652可以向功能层1651返回包括可任选应用程序数据1607的邻域状态1606。功能层1651可以发送包括可任选应用程序数据1607的查验消息1611,以向邻域和路由伙伴节点传播活跃度信息以及可任选的应用层邻域状态。功能层1651也可发送包括可任选应用程序数据1607的同步响应1608来传播应用程序状态。
离开协议
当对于节点而言离开联盟是适当的时候,节点可以实现Depart(离开)函数来优雅地从联盟中移除。节点通过向其一个或多个直接邻近前导者和后继者节点,以及可能的同一邻近邻域中的其它节点发送离开消息来离开现有联盟。由此,取决于离开分发模式(即,向哪些节点发送离开消息),与离开节点有关的信息被传播给该离开节点的邻域内的环上的其它节点。离开消息是优雅地离开的节点获得的单向消息,用于向其至少一个邻近邻域内的一个或多个其它节点通知其即将发生的离开。离开节点以类似于查验消息的传播的方式来传播离开消息(例如,在其邻域内)。例如,ID为30的节点可将离开消息1219发送到ID为17和40的节点。ID为30的节点然后可从给定邻近环的观点来看将其自身从联盟基础结构中移除。注意,节点有可能将其自身从一个邻近邻域中移除,但不从其可能所属的其它邻域中移除。
由于在ID为30的节点被移除之后ID为17和40的节点(即,前导者和后继者节点)可能是最接近ID 30的节点,因此使ID为17和40的节点知晓ID为30的节点的离开。由此,要传递给ID 30的将来消息可在ID为17和40的节点处适当地处理。ID为17和40的节点可以将ID为30的节点的离开传播到环1206上的其它节点。在缺少ID为30的节点的情况下,ID为17和40的节点也可重新计算前导者和后继者指针,这些指针可能指向对方。
离开消息的消息ID特性被分配与查验消息一样的应用程序序列ID,以使处理该离开消息的节点能够确定由原始节点发送的一系列查验和离开消息中最新的消息。从联盟邻近环的优雅离开是可任选的,但鼓励这样做。然而,联盟被设计成在节点突然离开的情况下自我复原。
活跃度
在联盟的生存期期间,节点可以交换活跃度信息来维护该联盟。活跃度信息可以按活跃度消息首部的形式被包括在在联盟内交换的实际上任何消息中。例如,加入消息、加入响应、同步消息、同步响应、更新消息、更新响应、应用程序专用消息、活跃度消息以及查验消息都可包括活跃度信息首部。当联盟节点发送任何消息或响应时,该节点可以包括活跃度信息以供其它节点处理。活跃度信息可被包括在活跃度消息的活跃度信息首部中。
指示节点的活跃度状态的活跃度信息可以使用以下特性来表示:
[节点]:标识其活跃度状态正被表示的节点。节点可以基于进一步包括[实例ID]的[引用特性]来标识。
[引用特性]:在WS寻址规范中指定的元素信息项。WS寻址定义了包括在引用特性集中的[实例ID]引用特性。
[实例ID]:标识节点的特定实例的数字。可使用递增自举计数(boot count)作为节点的实例ID。
[阶段]:传达所标识的节点的阶段。
[阶段状态值]传达所指示的节点实例已知已达到的最高阶段状态(***、同步、路由、操作)。
[阶段.未知指示]传达当前阶段是已知还是未知的指示符。
[新鲜度]:传达信息的新鲜度并且其值范围从0到MaxFreshness。该值越高,信息就越新鲜,0意味着没有信息,而MaxFreshness是协议定义的常量。
[色彩]:标识节点所属的邻近性等效类。具有相同色彩值的两个节点总是被认为是最邻近的,因为它们都属于由色彩值所标识的相同的等效类。邻近性等效类的数量可以在更多节点加入联盟时随着时间而增加。
[权重]:提供节点能力度量,且其值范围从0到MaxWeight。它测量联盟节点的所需特性,诸如大计算能力、高网络带宽和长开机时间。该值越高,则节点越能够使其从伙伴关系的观点来看合乎需要。
在某些环境中,节点的[节点]和[新鲜度]特性或者隐式地或者显式地在诸如[原始]和[发送者]消息首部等较大范围内传达,且因此,再次在活跃度首部中包括上述特性将是重复的。例如,消息的发送者只需传达其当前阶段、色彩和权重信息,因为其ID、实例Id在消息寻址首部中提供且其新鲜度被蕴含在内。
活跃度状态可以至少基于如下定义的“<”二元关系来部分排序:
“L1<L2”为真,如果
1.“L1.[节点].[名称]==L2.[节点].[名称]”为真,且在执行了测试并按照所列出的次序短回路时以下之一为真:
·L1.[节点].[引用特性].[实例ID]<L2.[节点].[引用特性].[实例ID]
·L1.[阶段.未知指示]!=真AND L2.[阶段.未知指示]!=真ANDL1.[阶段状态]<L2.[阶段状态]
·L1.[新鲜度]<L2.[新鲜度]
2.或者,“L1.[色彩]==L2.[色彩]”为真,且在执行了测试并按照所列出的次序短回路时以下之一为真:
·L1.[阶段状态]<L2.[阶段状态]
·L1.[权重]<L2.[权重]
此外,当检测到或怀疑指定节点变得不可用(例如,停机)时,可以向指定节点发送活跃度“停机”消息。作为一个示例,当应用层(例如,应用层121)检测到另一应用层(例如,应用层123)或主存另一应用层的节点停机时,则检测应用层可以例如根据消息模型和相关的处理模型1600和/或1700通知其它较低层(例如,其它较低层131)该节点可能停机。这一通知可使得诸如,例如功能层1651等其它较低层发送活跃度停机消息。这仅是对活跃度停机消息的生成的激励的一个示例。
由于活跃度停机消息被路由且因此被传递给最接近被怀疑停机的那些节点的节点,因此如果对指定节点的活跃度停机消息被传递回到该指定节点,则或者该指定节点从未停机,或者该指定节点是一不同的实例(例如,具有不同的实例ID)。另一方面,如果活跃度停机消息被传递到另一节点,则它指示指定节点的确看似已停机。因此,如果接收活跃度停机消息的节点将其自身视为在指定节点的邻近邻域中,则它可如所描述地将对该指定节点的离开消息发送到该邻近邻域中,并向其应用层指示(例如,使用节点停机1704)指定节点可能停机且接收节点是其替换。对指定节点的活跃度停机消息可在将其目标ID设为可能停机的节点的ID的情况下邻近地路由。
平衡过程
本发明的各实施例被设计成适应大量节点在较短的一段时间内加入和离开联盟。如果在各节点处维护的对数搜索树变得不平衡,则网络中的这一改变可导致路由延迟。即,如果在环的一侧的节点要比另一侧多。为促进最优路由效率,参与联盟的节点在满足特定准则时执行平衡过程。
例如,当以下条件中的任一个为真时,任何节点可执行平衡过程来确保平衡的路由表以获得最优路由效率:
·接收到配置的数量的上述活跃度消息。
·自从接收到最后一条上述活跃度消息以来已经经过了配置量的时间。
·邻域在某些新节点已到来或某些现有节点已离开的意义上已改变。
平衡路由表是简单的过程。例如,具有未平衡的路由表的节点可以重新执行加入协议的同步和路由阶段状态。
与1)找出对一数字的最接近的路由节点,2)节点遵循离开协议优雅地离开联盟,以及3)节点遵循平衡过程接收活跃度消息相组合的动作RP2b、RP2d和RP4在联盟节点相当快速且大量地加入和离开网络时导致更快速的复原***。
状态消息
状态消息是由接收者节点向发送者节点发送的非路由的消息,其通知发送者节点先前转发给接收者节点的相关消息的路由成功/失败。图18描绘了形成请求-响应消息交换模式的一部分的消息如何跨环上的节点路由的示例。状态消息可包括标识其路由状态正被报告的原始的相关消息的首部。由此,状态消息可以在节点之间用于指示消息被成功地从一个节点路由到下一节点。例如,从节点1801到节点1806路由请求消息1811包括通过节点1802、1803、1804和1805发送请求1811。对应的层叠成功状态消息(状态1817、1818、1819、1820和1821)可分别从节点1806发送到节点1805,从节点1805发送到节点1804,从节点1804发送到节点1803,从节点1803发送到节点1802,以及从节点1802发送到节点1801。响应于请求1811,可从节点1807到节点1801端对端地发送响应1816。响应1816是可任选的,并且可能不在单向消息交换模式中存在。
图13示出了节点加入联盟基础结构的方法1300的示例流程图。方法1300将参考图12A和12B中的环1206来描述。方法1300包括向联盟基础结构发出加入消息的动作(动作1301)。例如,ID为144的节点可以向包括环1206的联盟基础结构发出加入1201。方法1300包括从加入节点接收加入消息的动作(动作1308)。例如,包括环1206的联盟基础结构中的现有节点可接收加入1201。
方法1300包括向处理节点路由加入消息的动作(动作1309)。处理节点可以是在路由加入消息时其ID数值上比联盟基础结构中的其它活动节点更接近加入节点的ID的节点。例如,加入1201最初可在ID为64的节点处接收,路由到ID为135的节点,并路由到ID为151的节点。
方法1300包括为加入节点计算一个或多个前导者节点和一个或多个后继者节点的动作(动作1310)。例如,ID为151的节点可以为ID为144的节点计算直接前导者节点和直接后继者节点。在环1206内,ID为151的节点可以计算ID为135的节点是直接前导者节点,而ID为151的节点是直接后继者节点。可对其它邻近环进行类似的计算。
方法1300包括为加入节点计算一个或多个路由节点的动作(动作1311)。例如,ID为151的节点可以为ID为144的节点计算路由节点(从ID为151的节点的观点来看)。在环1206内,ID为151的节点可例如计算ID为218和40的节点为ID为144的节点的路由节点。可对其它邻近环进行类似的计算。
方法1300包括向加入节点发送加入响应的动作(动作1312)。加入响应可以在给定其当前的联盟基础结构视图的情况下标识如由处理节点所计算的加入节点的所有前导者和后继者邻域和路由伙伴节点。例如,加入响应1202可以至少将ID为135的节点标识为对ID为144的节点的直接前导者节点,可以将ID为151的节点标识为对ID为144的节点的直接后继者节点,并可以将标识在ID为151节点处为ID为144的节点(新加入的节点)计算的任何路由节点(对于ID为144的节点)。
方法1300包括从处理加入消息的联盟节点接收加入响应的动作(动作1302)。例如,ID为144的节点可从ID为151的节点接收加入响应1202。
方法1300包括向直接邻近前导者节点和直接邻近后继者节点中的至少每一个发送同步请求的动作(动作1303)。例如,现在参考图12B,ID为144的节点可以向ID为135和151的节点发送同步请求1203。同步请求1203可以包括ID为144的节点的任何邻域节点的标识和/或ID为144的节点的任何路由伙伴的标识。
ID为135和151的节点可接收同步请求1203。响应于接收同步请求1203,ID为135和151的节点可以从相应的路由表中标识其邻域和路由伙伴节点。ID为135和151的节点可以在同步响应1204中包括其标识的邻域和路由伙伴节点的活跃度信息,并将同步响应1204发送给ID为144的节点。
方法1300包括从邻近前导者和后继者节点中的每一个接收同步响应的动作(动作1304)。例如,ID为144的节点可从ID为135和151的节点接收同步响应1204。同步响应1204可以包括关于环1206或联盟基础结构中的其它环上的一个或多个节点的活跃度信息。同步响应1204还可标识ID为144的节点的任何预期的路由伙伴节点。
方法1300包括计算邻居节点的动作(动作1305)。例如,ID为144的节点可以基于Id为135和151的节点的邻域节点的并集来计算相应的邻域节点。邻域节点可以基于加入响应消息和任何同步响应消息的概括视图来计算。
方法1300包括计算路由节点的动作(动作1306)。例如,ID为144的节点可以从环1206的节点中计算路由节点。路由伙伴可以基于加入响应消息和任何同步响应消息的概括视图来计算。
方法1300包括至少将邻域节点信息与所计算的路由伙伴交换的动作(1307)。例如,ID为144的节点和ID为218的节点(计算的路由伙伴)可以交换对应于其各自的邻域节点的状态信息(例如,实例ID、阶段状态等)。这些交换通过新加入的节点如在以上路由阶段状态中描述的向至少每一个唯一计算的路由伙伴发送(路由)更新消息来实现。处理更新消息的节点作为对从新加入的节点接收这些更新消息的反应,将发送相应的更新响应消息。更新响应至少包括其本身及其邻域节点的活跃度信息。
方法1300还包括发起向至少一个邻域节点的路由表的初始传播的动作。例如,ID为144的节点可以在查验消息中包括计算的邻域和路由伙伴节点,并将该查验消息发送给ID为174的节点(例如,计算的邻域节点之一)。ID为174的节点可以接收该查验消息,并用源自ID为144的节点处的活跃度信息来更新相应的路由表。ID为174的节点可以在第二查验消息中还包括其相应的路由表,并将该第二查验消息在某一将来时刻发送给ID为144的节点。ID为144的节点可以接收该第二查验消息,并可用包括在该第二查验消息中的活跃度信息中的节点(即,ID为174的节点的路由表中的节点)来更新其相应的路由表。ID为144的节点可以对环1206中的其它邻域节点重复查验消息的发送。
应当理解,当新加入的节点加入联盟时,该新加入的节点可能未找到现有联盟成员,且因此变为唯一的成员。由此,可能没有为该新加入的节点分配的前导者、后继者或邻居节点。因此,新加入的节点在所有情况下都作为最佳路由伙伴来映射。
此外,尽管方法1300是参考单个环(环1206)来描述的,但是应当理解,在某些实施例中,本来加入一个环的节点也可加入一个或多个其它环。例如,简要地回头参考图5,本来加入环551的节点也加入环543、531、522、511和501。由此,方法1300可被实现来加入多个环。在其它实施例中,可在加入多个环时重复方法1300中的部分或所有动作。例如,再次参考图5,当节点同时加入环551和环514时(例如,别名化),可以重复1300的一个或多个动作。在任何情况下,可访问加入节点ID,并用其来标识已排序链表中的加入节点,以及该加入节点要参与的相应的分层地划分的子列表。从已排序链表和每一划分的子列表中标识接收节点。加入消息被路由到已排序链表和每一划分的子列表中的处理节点(例如,基于ID)。从已排序链表和每一划分的子列表中的处理节点接收加入响应。
图14示出了节点维护联盟基础结构中的成员资格的方法1400的示例流程图。方法1400将参考环1206来描述。方法1400包括向邻域节点发送第一查验消息的动作(动作1401)。第一查验消息指示发送第一查验消息的当前节点是邻域节点的邻居。第一查验消息还可包括当前节点的路由伙伴和邻域节点的状态。例如,ID为144的节点可将查验消息发送到ID为151的节点。在接收到第一查验消息之后,可以使ID为151的节点知道ID为144的节点是ID为151的节点的邻居。节点151还可从节点144发现较新的活跃度信息(关于环1206上的其它节点的),作为该动作的副作用。
查验消息可基于例如与查验消息要被发送到其中的邻近环相关联的配置状态来以指定的频率周期性地重复。该频率可以取决于配置状态而变化。例如,对WAN的指定查验频率可以与对LAN的指定频率不同。查验消息也可根据查验分发模式来发送。对于始发节点的查验分发模式可以指示查验消息要被发送到环上两个方向上的邻域节点。例如,ID为144的节点可以在ID为135的节点的方向和ID为151的节点的方向这两个方向上发送查验。查验分发模式和频率可以变化。例如,每一邻近环不同。
方法1400包括从邻域节点接收第二查验消息的动作(动作1402)。该第二查验消息向当前节点指示至少发起第二查验消息的邻域节点是当前节点的邻居。第二查验消息还可包括始发邻域节点的路由伙伴和邻域节点的状态。例如,ID为151的节点可将第二查验消息发送到ID为144的节点。在接收到第二查验消息之后,可以使ID为144的节点知道ID为151的节点是ID为144的节点的邻居。第二查验消息还可包括关于环1206上的其它节点的活跃度信息。由此,一般而言,查验消息可以在邻域内交换,并且可用于维护联盟内存在的节点的邻域成员资格(对每一邻近成员资格)和近似的公共领域视图。
接收到的查验消息可被周期性地重复/转发给向其中发起该查验(由始发节点发送)的邻近邻域内的其它节点。转发的查验消息也可根据查验分发模式来发送。对于转发节点的查验分发模式可以指示查验消息要被发送到远离始发节点的方向上的邻域节点。例如,ID为1151的节点可以将发自ID为144的节点的查验在ID为174的节点的方向上转发。查验转发分发模式可以例如在每一邻近环中变化。
节点可被配置成以相应的间隔接收查验消息。当未接收到预期的查验消息时,节点可以解释通信失败,并对应发起该预期的、但至少晚了的查验消息的节点将另一节点的阶段.未知指示设为真。
方法1400包括将更新请求消息邻近地路由到理想路由节点的动作(动作1403)。更新请求消息向接收这一路由的更新请求的路由节点指示当前节点正作为接收路由节点的路由伙伴参与。更新请求消息还可至少包括当前节点的邻域节点的身份(例如,采用活跃度信息的形式)。例如,ID为144的节点可以将更新消息1216路由到ID为208的节点(从144偏移了64的理想路由伙伴)。由于节点210(先前计算的路由节点)最接近208,因此它将接收并处理路由的更新请求。在接收到更新消息1216之后,可以使ID为210的节点知道(或得到加强)ID为144的节点是ID为210的节点的路由伙伴。
方法1400包括从处理(接收)路由节点接收更新响应消息的动作(动作1404)。更新响应向当前节点指示处理路由节点正作为当前节点的路由伙伴来参与。更新响应消息还可至少包括处理路由伙伴的邻域节点的标识符。例如,ID为210的节点可将更新响应1207发送到ID为144的节点。在接收到更新响应1207之后,可以使ID为210的节点知道ID为210的节点是ID为144的节点的路由伙伴。
方法1400还可包括适当地更新节点信息以指示当前节点和邻域节点正作为邻居参与,且当前节点和邻域节点正作为路由伙伴参与的动作。例如,ID为144的节点可以更新对应于ID为151的节点的节点信息来指示ID为144和141的节点正参与(邻近)邻域。类似地,ID为144的节点可以更新对应于ID为210的节点的节点信息来指示ID为144和210的节点作为路由伙伴参与。
在某些实施例中,在指定节点X处保存的应用程序状态使用可靠洪泛协议在其邻域(X)节点之中复制。应用程序状态中的每一项都有所分配的所有者,这可以是创建该项的端点。应用程序状态中的每一项还有由其所有者给予的相关联的时间戳(也称为序列号)。时间戳具有至少三个分量:
○拥有实体的实例ID(例如,无符号整数)。必须至少是单调(>1)递增的。
○标识由所有者生成的特定序列的序列ID(例如,URI)。该分量允许同一拥有者生成多个独立序列。
○标识所标识的应用程序序列ID内的偏移量的序数(例如,无符号整数)。
项时间戳用于在复制期间检测与相应的项相关联的最新信息,因为项时间戳至少生成具有<实例ID,序列ID,和偏移量>三元组的部分排序。与所复制的项相关联的时间戳与本地时间戳(如果有)进行比较以检测最新的那一个。项时间戳也用于支持创建/更新/删除操作的幂等语义。例如,当一节点接收到更新应用程序状态中的现有项的请求时,该更新仅在与该更新请求相关联的时间戳要高于与本地项相关联的时间戳的情况下才被接受。可在项没有被分配单个所有者的情况下利用基于向量时间戳的冲突解决技术。应用程序状态复制提供了容错并方便了跨邻域节点的负载平衡请求。
作为一个可任选行为,(在一段时间之后)未检测到来自(发自)其它伙伴(路由和/或伙伴)节点的预期的更新或查验的节点可以认为阶段状态未知,将阶段.未知指示设为真,并如此向其它第三方节点报告它。换言之,可能需要更新和查验的周期性生成。该要求和实际超时值可以是各个邻近环的属性。例如,环对于某些子环(例如,在LAN段中)可具有更限制性的定制要求,并且节点故障检测/报告相当快。另一方面,环对于其它子环(例如,在因特网上)可具有较不限制的定时要求(或甚至没有定时要求),并且主动节点故障检测/报告相当长(或不存在)。
图15示出了用于发现关于另一节点的活跃度信息的方法1500的示例流程图。方法1500将参考图12A和12B中的环1206来描述。一般而言,诸如,例如同步1204、同步响应1204、更新1216、更新响应1207等任何消息可包括至少一个活跃度首部。在某些实施例中,活跃度首部包括节点的<节点ID,实例ID,阶段[阶段状态值].[阶段.未知指示],新鲜度值,色彩(邻近性)值,以及权重值>。在其它实施例中,活跃度首部包括<阶段[阶段状态值].[阶段.未知指示],新鲜度值,色彩(邻近性)值,以及权重值>。在这些其它实施例中,活跃度首部可用于扩充已经包括了发送者和原始节点的节点ID和实例ID的寻址首部。由于寻址首部已经包括了节点ID和实例ID,因此该信息可在活跃度首部中省略。
方法1500包括接收表示关于参与联盟基础结构的节点的状态信息的活跃度首部的动作(动作1501)。活跃度首部至少包括接收到的参与节点ID、接收到的节点的实例ID、接收到的阶段值、以及接收到的新鲜度值。例如,ID为144的节点可从ID为151的节点接收同步响应1204中的第一活跃度首部。该第一活跃度首部可包括ID为174的节点的<参与节点ID,实例ID,阶段[阶段状态值].[阶段.未知指示],新鲜度值,色彩(邻近性)值,以及权重值>。阶段状态值(例如,***、同步、路由、操作)标识在第一新鲜度值的时刻ID为174的节点的所表达的阶段。阶段值(例如,阶段状态:[***,同步,路由,操作]和阶段.未知)标识在第一新鲜度值所指示的时刻ID为174的节点的所表达的和/或检测到的阶段信息。
然而,新鲜度值可以因通信延迟而扣除。新鲜度值也可随着时间的流逝而衰减。对于新鲜度值的衰减曲线可以对不同阶段状态(包括未知)而不同(并且可能不是线性和对称的)。由此,跨不同的节点阶段,新鲜度值的衰减可以是非线性和/或非对称的。
方法1500包括至少访问在当前节点处维护的参与节点的当前实例ID、当前阶段值、以及当前新鲜度值的动作(动作1502)。例如,ID为144的节点可以访问先前接收并存储的ID为174的节点的实例ID、阶段值[阶段状态值].[阶段.未知指示]以及新鲜度值。
方法1500包括至少分别将接收到的实例ID、接收到的阶段值和接收到的新鲜度值与在当前节点处的当前实例ID、当前阶段值和当前新鲜度值进行比较的动作(动作1503)。例如,ID为144的节点可以将先前接收并存储的ID为174的节点的实例ID、阶段值[阶段状态].[阶段.未知指示]和新鲜度值与在活跃度首部中接收到的实例ID、阶段值[阶段状态].[阶段.未知指示]和新鲜度值进行比较。
ID为144的节点可基于(按序)第一实例ID大于当前存储的ID为174的节点的实例ID、基于第一阶段状态值比当前存储的ID为174的节点的阶段状态值更前、或基于第一新鲜度值是大于当前存储的ID为174的节点的新鲜度值的值,确定ID为174的节点的当前状态信息(例如,从ID为151的节点接收)是陈旧的。ID为144的节点还可确定至少一个阶段.未知指示(或者是当前存储的,或者是在活跃度首部中接收的)指示在检测/发送阶段状态时阶段状态是已知的。
方法1500包括基于比较确定参与节点的状态信息是否要在当前节点处更新的动作(动作1504)。例如,基于ID为174的节点的值的比较,ID为144的节点可确定ID为174的节点的状态信息要被更新。更新ID为174的节点的过时的状态信息可包括用包括在活跃度首部中的值来替换当前存储的值(例如,对于实例ID、阶段状态值、阶段.未知指示或新鲜度值)。例如,ID为144的节点可以更新ID为174的节点的状态信息以指示ID为174的节点已转换到更前面的阶段状态。
在某些实施例中,可以检测到与参与节点的通信可能已丢失。例如,ID为144的节点可以检测到与ID为151的节点的通信已丢失。简要地参考图17,响应于对活跃度事件1701的先前的订阅(具有ID为151的节点的端点),应用层1752可以向功能层1751发送端点停机事件1703(具有ID为151的节点的端点)。在这些实施例中,这些检测到的活跃度条件可以在阶段.未知指示符被设为真且带有上一个已知的阶段状态值的活跃度信息中指示。
方法1500还可包括从联盟基础结构中的第二个不同的节点接收包括第二活跃度首部的消息的动作。例如,ID为144的节点可以接收包括第二活跃度首部的状态消息(从ID为103的节点或环1206的某一其它节点)。该第二活跃度首部可包括ID为174的节点的<参与节点ID,第二实例ID,第二阶段值[阶段状态值].[阶段.未知指示],第二新鲜度值,第二色彩(邻近性)值,以及第二权重值>。第二阶段状态值(例如,阶段状态:[***,同步,路由,操作]和阶段.未知指示)标识在第二新鲜度值的时刻ID为174的节点的所表达的/检测到的阶段。
或者,在接收第一活跃度首部之后,ID为144的节点可尝试直接与ID为174的节点通信。如果通信成功,则ID为174的节点可以返回在寻址首部中有节点ID和第二实例ID且具有活跃度首部的消息(例如,同步响应),该活跃度首部包括<第二阶段值,第二新鲜度值,第二色彩(邻近性)值,以及第二权重值>。如果检测到故障,则ID为144的节点生成内部活跃度状态改变(例如,新鲜度=最大,且阶段.未知指示=真)并如同该状态改变是从另一节点接收的那样来处理该状态改变。这一状态改变具有最高新鲜度值。
方法1500还可包括将第二实例ID、第二阶段值和第二新鲜度值分别与当前实例ID、当前阶段值和当前新鲜度值进行比较的动作(动作1506)。例如,在从ID为103的节点接收到状态消息之后,ID为144的节点可以基于(按序)第二实例ID大于第一实例ID、第二阶段比第一极端值更前、或第二新鲜度值大于第一阶段值,来确定ID为151的节点的当前状态信息是陈旧的。
方法1500还可包括基于比较来确定是否要更新参与节点的状态信息的动作。例如,基于ID为174的节点的值的比较,ID为144的节点可确定ID为174的节点的状态信息要被更新。更新ID为174的节点的过时的状态信息可包括用包括在第二活跃度首部中的值来替换当前存储的值(例如,对于实例ID、阶段状态值、阶段.未知指示或新鲜度值)。例如,ID为144的节点可以更新ID为174的节点的状态信息以指示ID为174的节点已转换到更前面的阶段状态。
在某些实施例中,在相等的色彩值的上下文中比较阶段值。如上所述,节点可参与多个邻近环。参与多个邻近环可以作为对更具体的环的参与蕴含着对更一般的环(沿着公共脊骨)的参与的结果而发生。例如,回头参考图5,节点对环532的参与也蕴含着节点正参与环522、511和501。由此,更具体的环的色彩也表示所有父邻近环。同样如上所述,对多个邻近环的参与可以在一个环中的节点被别名化到一个或多个其它环(可能沿着不同的脊骨)时发生。例如,仍参考图5,参与环532的节点可以被别名化到环531(或甚至环541,这蕴含了对环531、522、511和501的参与)。由此,一个环(例如,环531)的色彩可被视为另一个环(例如,环532)的对等色彩(或邻近性)。
当一节点以别名化的方式参与多个邻近环时,该节点的阶段值(例如,阶段状态值和/或阶段.未知指示)有可能在不同邻近环之间有所不同。由此,接收关于另一节点的状态信息的节点在确定对该节点和色彩是否要更新当前状态信息之前标识关于状态信息(色彩)的相应的邻近环。例如,ID为144的节点可以在将所接收到的状态信息与当前状态信息进行比较之前标识对于所接收到的对应于ID为174的节点的状态信息的相应的邻近环。
标识适当的邻近环可以包括将接收到的色彩值与一个或多个当前色彩值进行比较。当接收到的色彩值和当前色彩值相等时,可将诸如,例如当前实例ID、当前阶段值和当前新鲜度值等其它状态信息与诸如,例如接收到的实例ID、接收到的阶段值和接收到的新鲜度值等相应的接收到的状态信息进行比较。另一方面,当接收到的色彩值和当前色彩值不同时,不发生进一步的比较。
色彩值之间的相等可以用多种方式来获得。例如,色彩值之间的相等可以在当前色彩值和接收到的色彩值指示相同的邻近环(例如,环532)时获得。此外,色彩值之间的相等可以在将更具体的色彩值与相应的父色彩值(例如,沿着同一脊骨的另一环)比较来获得。例如,将环532的色彩值与环511(或环522或501)的色彩值进行比较可得到相等。由此,子邻近性是父邻近性,但是更为具体。
由此,一般而言,联盟基础结构中当前可操作的节点可以甚至在与其它节点的通信看似丢失时交换关于这些其它节点的所表达的和检测到的活跃度状态信息。
程序引导机制
一般而言,为使节点成为联盟的活动成员(例如,加入),节点必须与已经是它打算加入的叶环的活动成员的至少一个其它节点通信。为帮助确保该初始形式的通信是可用的,联盟可以利用程序引导机制。程序引导机制可用作当其它类型的通信无法标识叶环的活动成员或者安全约束要求新加入的节点最初与诸如种子节点等一组特殊节点中的至少一个节点通信时的最后手段。即,当其它类型的通信失败或者由于安全要求,可使用程序引导机制来标识叶环的活动成员节点。
在某些实施例中,使用种子节点来程序引导与联盟的通信。种子节点提供了对某些类型的跨近邻(近邻间)的通信的公知的入口点。种子节点因基础结构故障/恢复和一般的动态性而帮助复原环分区。每一个环可具有至少一个可操作种子节点以便为联盟提供基本程序引导特性。
对等种子节点可以在它们之中通信以便维护一近邻的环结构(例如,双重链表),该结构至少由对于该近邻的所有活动种子节点构成。可使用专用种子节点同步协议来向每一种子节点至少提供所有其它种子节点的存在(活动)状态的总知识。活动种子节点是它所归属的邻近性叶环以及该叶环的所有其它祖先环的成员节点。由此,种子节点可以表示例如从种子节点的叶环到根环的整个邻近环脊骨。因此,种子节点可以作为这些邻近环的每一个中的高度可靠且公知的入口节点来运作。结果,关于种子节点的存在状态可用于联盟内的各种形式的通信(例如近邻间通信)。因此,种子节点可以提供多个特殊的特性,诸如,例如担当对于加入节点的公知的“加入点”,担当安全环授权机构,协助复原基础结构分区,以及担当对于其每一近邻的稳定“入口节点”。
为提供存在数据,种子节点的到来和有序的离开可以被注册为其每一近邻中的会合点处的稳定入口点。例如,注册消息可被路由到其目的地ID是串“Proximity:/”的SHA-1散列的固定URI。尽管在一个实施例中担当稳定入口点的种子节点以此方式来注册其自身,但是存在其中所选的非种子节点也可用同一方式并用此处对种子节点描述的相同或相似的协议来注册其自身的其它实施例。当稳定入口节点(诸如种子节点)注册时,该稳定入口节点可以指示它是其成员的每一个环。由此,在由该固定URI标识的会合点处维护的信息本质上是稳定入口节点及其相应的环成员的列表。因此,任何节点可以参考由该固定URI标识的会合点来获得可用稳定入口节点及其环成员的列表。
在一个实施例中,稳定入口节点直接注册这些到达和离开事件。在另一实施例中,稳定入口节点直接在其直接邻近环内的会合点处注册这些事件,并且该会合点透明地帮助(直接地或间接地)更新注册/取消注册稳定入口节点所属的每一剩余的邻近环中的所有其它适当的会合点。联盟的应用程序状态定序和传播特性可用于维护并传播该稳定入口节点注册信息。例如,可使用可靠洪泛协议来在节点的邻域节点之间复制保存的应用程序状态。
稳定入口节点的存在数据向着根环的提升允许联盟中的其它节点在每一近邻中查找至少一个入口节点。入口节点查找可通过将节点查找消息向着执行查找的节点的叶环和期望的邻近环的最低公共祖先环(“LCAR”)中的上述确定的会合点路由来促进。例如,参考图5,环541中的节点可能期望与环533中的节点通信。然而,环541中的节点可能没有环533中的任何节点的直接知识。由此,环541中的节点可以向环522(环541和环533的LCAR环)发送节点查找消息。环522中处理入口节点存在信息(例如,由于该入口节点获得的注册消息而导致存在于***中)会合点节点可返回具有至少关于环533中的已注册稳定入口节点的联系信息的查找响应消息。
在某些实施例中,稳定入口节点是被特别地配置为用于维护各个近邻的存在数据的稳定入口节点的种子节点。在其它实施例中,其它类型的节点也可担当维护关于各个近邻的存在数据的稳定入口节点,并且还可被配置成执行其它操作。例如,某些其它类型的节点可被配置(例如,由管理员)为高度可用,且因此适用作稳定入口节点(即,如上所述地注册)。然而,其它类型的节点可能不包括附加种子节点功能(例如,可能不作为安全环授权机构而被信任)。在某些实施例中,维护关于其直接近邻的入口节点存在状态的会合点可以在一个或多个祖先环中将其自身注册为稳定入口节点。
节点监视
图19A示出了方便一个节点监视另一个节点的示例环体系结构1900。如图所示,环体系结构至少包括环1901(以及任意数量的其他较高和/或较低层环(未示出))。环1901可类似于图3的环306来配置。然而,监视可在任何节点环上发生,包括图4、5、12A和12B中的环的任一个。图19A描绘了对象节点1902(具有ID=83)和监视节点1903(具有ID=2)的扩展视图。在所示实施例中,监视节点1903要监视对象节点1902。然而,环1901上的任何节点可被配置成监视环1901上的任何其他节点。
图20示出了用于一个节点监视另一节点的方法2000的示例流程图。方法2000将参考图19A所示的数据和组件来描述。
方法2000包括对象节点生成用于监视对象节点的对象侧生存时间(time-to-live)持续时间值的动作。例如,对象节点1902可建立生存时间(TTL)持续时间值1913。TTL持续时间值1913指示对象节点1902能将与监视节点1903的监视关系认为是活动的持续时间。
方法2000包括对象节点向监视节点发送建立请求的动作,该建立请求指示对象节点请求监视节点监视对象节点,该建立请求包括对象侧生存时间持续时间值(动作2002)。例如,对象节点1902可向监视节点1903发送包括TTL持续时间值1913的建立请求1922。
方法2000包括对象节点基于对象侧生存时间持续时间值和发送建立请求的时间来建立现有对象侧死亡时间(time-to-die)时间的动作,其中对象节点时钟在从监视节点接收建立授权之前到达现有的对象侧死亡时间时间是对象节点必须转换到故障状态的指示(动作2003)。例如,对象节点1902可基于TTL持续时间值1913和向监视节点1903发送建立请求1922的时间来建立对象侧死亡时间时间1917。对象侧死亡时间时间1917可以是相对于对象节点1902的时间。如果对象节点1902的时钟在从监视节点1903接收到建立授权之前到达对象侧死亡时间时间1917,则对象节点1902要转换到故障状态。在某些实施例中,当对象节点1902的时钟在从监视节点1903接收到建立授权之前到达对象侧死亡时间时间1917,则导致故障状态。在其他实施例中,发生其他活动以使对象节点1902转换到故障状态。
方法2000包括监视节点从对象节点接收建立请求的动作,该建立请求指示对象节点请求监视节点监视对象节点,该建立请求至少包括对象侧生存时间持续时间值,该对象侧生存时间持续时间值用于确定对象节点处的对象侧死亡时间时间,其中对象节点时钟在从监视节点接收到建立授权之前到达对象侧死亡时间时间是对象节点必须转换到故障状态的指示(动作2004)。例如,监视节点1903可从对象节点1902接收包括TTL持续时间值1913的建立请求1922。TTL持续时间值1913在对象节点1902处用于建立对象侧死亡时间时间1917。
方法2000包括监视节点从对象侧生存时间持续时间值中导出监视侧生存时间持续时间值的动作(动作2005)。例如,监视节点1902可使用TTL持续时间值1913来导出TTL持续时间值1919。在某些实施例中,监视节点1903复制TTL持续时间值1913以导出TTL持续时间值1919。在这些实施例中,TTL持续时间值1913和TTL持续时间值1919是相等的。在其他实施例中,监视节点1903修改TTL持续时间值1913以导出TTL持续时间值1919。在这些其他实施例中,TTL持续时间值1913和TTL持续时间值1919是不同的。例如,监视节点1903可以增加TTL持续时间值1913的值以导出TTL持续时间值1919,使得TTL持续时间值1919大于TTL持续时间值1913。
方法2000包括监视节点基于监视侧生存时间持续时间值和接收到建立请求的时间来建立监视侧死亡时间时间的动作,监视节点时钟在从对象节点接收到续订请求之前到达监视侧死亡时间时间指示怀疑的对象节点故障(动作2006)。例如,监视节点1903基于TTL持续时间值1919和接收到建立请求1922的时间来建立监视侧死亡时间时间1914。监视侧死亡时间时间1914可以是相对于监视节点1903的时间。如果监视节点1903的时钟在从对象节点1902接收到续订请求之前到达监视侧死亡时间时间1914,则监视节点1903怀疑对象节点1902发生故障。
方法2000包括监视节点向对象节点发送建立授权以向对象节点指示监视节点同意监视对象节点的动作(动作2007)。例如,监视节点1903可向对象节点1902发送建立授权1923。方法2000包括对象节点从监视节点接收建立授权的动作,该建立授权指示监视节点监视对象节点(动作2008)。例如,对象节点1902可从监视节点1903接收建立授权1923。一般而言,建立授权1923指示监视节点1903同意监视对象节点1902。在某些实施例中,建立授权消息可包括监视侧TTL持续时间值。例如,监视授权1923可以包括TTL持续时间值1919。
或者,监视节点可向对象节点发送建立拒绝以向对象节点指示监视节点不同意监视对象节点。例如,响应于接收到建立请求1922,监视节点1903可替换地(如由虚线所指示的)向对象节点1902发送建立拒绝1931。对象节点可接收从监视节点发送的建立拒绝。例如,对象节点1902可从监视节点1903接收建立拒绝1931。建立拒绝1931一般向对象节点1902指示监视节点1903不同意监视对象节点1902。
有时(并且在环体系结构1990内的其他操作的执行之间是混合的),对象节点可续订与所建立的监视节点的监视协定。一般而言,对象节点在有效期内(当前监视侧时间到死亡时间)离开现有协定,直到接收到新的授权。然而,对象节点可以生成新的TTL持续时间值并推导经更新的死亡时间时间将是什么。对象节点然后向监视节点发送该新的TTL持续时间值。监视节点接收该新的TTL持续时间值。当适当时,监视节点对续订请求授权,并向对象发回续订授权。对象节点接收该续订授权。响应于接收到续订授权,对象使用经更新的死亡时间时间作为新的当前死亡时间时间来实现续订的协定。续订已建立的监视协定的一个示例在方法2000的其余动作中描述。
方法2000包括对象节点在对象节点时钟到达对象侧死亡时间时间之前向监视节点发送续订请求的动作(动作2009)。例如,对象节点1902可在对象节点1902的时钟到达对象侧死亡时间时间1917之前向监视节点1903发送包括TTL持续时间值1913的续订请求1915。在某些实施例中,续订请求1915不包括对象侧TTL持续时间值。在这些实施例中,可推导对TTL持续时间值1913的继续使用。在其他实施例中,TTL持续时间值1913被明确地包括在续订请求1915中。在又一些实施例中,在续订请求1915中包括不同的对象侧TTL持续时间值。响应于对象节点1902的配置改变和/或响应于环1901中别处的配置改变(例如,改变的网络条件),对象节点1902可生成并使用新的对象侧TTL持续时间值。
节点1902还可计算如果接收到响应于续订请求1915的相应的续订授权则经更新的对象侧死亡时间时间将是什么。该计算可以至少基于发送续订请求1915的时间以及与续订请求1915相关或相关联的对象侧TTL持续时间。
方法2000包括监视节点在发送了建立授权消息之后并在监视节点时钟到达监视侧死亡时间时间之前从对象节点接收续订请求的动作,该续订请求指示对象节点未发生故障(动作2010)。例如,监视节点1903可在发送建立授权1923之后并在监视节点1903的时钟到达监视侧死亡时间时间1914之前接收续订请求1915。对续订请求1915的接收可向监视节点1903指示对象节点1902未发生故障。
方法2000还可包括监视节点向对象节点授权续订请求的动作。例如,监视节点1903可对续订请求1915授权。
方法2000包括监视节点响应于并至少基于接收到续订请求的时间来建立经更新的监视侧死亡时间时间的动作,监视节点时钟在从对象节点接收到另一续订请求之前到达经更新的监视侧死亡时间时间指示怀疑的对象节点故障(动作2012)。例如,监视节点1903可以响应于并基于接收到续订请求1915的时间以及所蕴含或指示的与续订请求1915有关或可能包含在其中的监视TTL持续时间值来建立经更新的监视侧死亡时间时间1921。经更新的监视侧死亡时间时间1921可以是相对于监视节点1903的时间。经更新的监视侧死亡时间时间1921可以是在监视侧死亡时间时间1914之后。然而,并不要求监视侧死亡时间时间1914出现在建立经更新的监视侧死亡时间时间1921之前。由此,有可能经更新的监视侧死亡时间时间1921实际上在监视侧死亡时间时间1914之前(或与其相同)。如果监视节点1903的时钟在从对象节点1902接收到另一续订请求之前到达经更新的监视侧死亡时间时间1921,则监视节点1903怀疑对象节点1902发生故障。
如果在续订请求1915中没有包括对象侧TTL持续时间值(且因此推导了TTL持续时间值1913),或者如果续订请求明确地包括TTL持续时间值1913,则监视节点1903也可使用TTL持续时间值1919来建立经更新的监视侧死亡时间时间1921。另一方面,如果在续订请求1915中包括除TTL持续时间值1913之外的对象侧TTL持续时间值,则监视节点1903可使用其他明确地包括的对象侧TTL持续时间值来导出新的监视侧TTL持续时间值。从该新的监视侧TTL持续时间值,监视节点1903然后可建立经更新的监视侧死亡时间时间1921。
方法2000包括监视节点向对象节点发送续订授权以向对象节点指示监视节点同意继续监视对象节点的动作(动作2013)。例如,监视节点1903可向对象节点1902发送续订授权1927。方法2000包括对象节点在发送了对应的续订请求之后并在对象节点时钟到达对象侧死亡时间时间之前从监视节点接收续订授权的动作,该续订授权消息指示监视节点继续监视对象节点(动作2014)。例如,对象节点1902可在发送了续订请求1915之后并在对象节点1902处的时钟到达对象侧死亡时间时间1917之前从监视节点1903接收续订授权1927。一般而言,续订授权1927指示监视节点1903同意继续监视对象节点1902。
或者,监视节点可向对象节点发送续订拒绝以向对象节点指示监视节点不再同意监视对象节点。例如,响应于接收到续订请求1915,监视节点1903可替换地(如由虚线所指示的)向对象节点1902发送续订拒绝1933。对象节点可接收从监视节点发送的续订拒绝。例如,对象节点1902可从监视节点1903接收续订拒绝1933。续订拒绝1931一般向对象节点1902指示监视节点1903不再同意监视对象节点1902。
方法2000包括对象节点响应于接收到续订授权转换到先前计算的经更新的对象侧死亡时间时间,其中对象节点时钟在从监视节点接收到另一续订授权之前到达经更新的对象侧死亡时间时间是对象节点必须转换到故障状态的指示(动作2015)。例如,对象节点1902可在接收到相应的续订授权消息时转换到经更新的对象侧死亡时间时间1952。经更新的对象侧死亡时间时间1952可在续订请求1915被发送到监视节点1903的时间附近计算。经更新的对象侧死亡时间时间1952可基于发送相应的续订请求1915的时间并基于与续订请求1915相关或相关联的TTL来计算。经更新的对象侧死亡时间时间1952可以是相对于对象节点1902的时间(例如,在对象侧死亡时间时间1917之后、之前或与其相等)。
如果TTL值1913仍是适当的TTL值,则对象节点1902也可使用TTL持续时间值1913来建立经更新的对象侧死亡时间时间1952。如果已经生成了另一TTL持续时间值,则对象节点1902也可使用其他所生成的TTL持续时间值来建立经更新的对象侧死亡时间时间1952。
在建立当前对象侧死亡时间时间(或者是1917,或者是1952)之后,对象节点1902处的时钟可以在从监视节点1903接收到另一续订授权之前到达当前对象侧死亡时间时间。这可因对象节点1902和监视节点1903之间的通信出错引起。例如,对象节点1902可在接收到续订授权1927之后并在对象节点1902的时钟到达经更新的对象侧死亡时间时间1952之前发送另一续订请求。然而,由于通信故障,其他续订请求未到达监视节点1903。或者,其他续订请求可在监视节点1903处接收到,但是来自监视节点1903的相应的续订授权由于通信出错而未到达对象节点1902。在任一情况下,对象节点1902处的时钟可在接收到响应于其他续订请求的相应续订授权之前到达当前对象侧死亡时间时间。
或者,在对象节点1902处的时钟到达经更新的对象侧死亡时间时间1952之前,对象节点1902可能误工作,使得对象节点1902被阻止向监视节点1903发送另一续订请求。
然而,不论是否发送了续订请求,如果在对象节点1902处的时钟到达当前对象侧死亡时间时间1952之前未接收到续订授权,对象节点1902就转换到故障状态。
回头参看监视节点1903,监视节点1903处的时钟可能在从对象节点1902接收到另一续订请求之前到达监视侧死亡时间时间(或者是1914,或者是1921)(由于对象节点1902处的误工作或由于环1901中的通信出错)。结果,监视节点1903怀疑对象节点1902发生故障。监视节点1903可转换到指示检测到另一节点处的怀疑的故障的超时状态。
在其他实施例中,一对节点可彼此监视。由此,第一节点可监视第二节点,而第二节点也可监视第一节点。例如,每一节点可通过与另一节点的通信来实现对象节点侧和监视节点侧方法2000。
图19B示出了方便两个节点彼此监视的示例环体系结构1900。
节点1971可生成用于监视节点1971的TTL持续时间值1929。节点1971可以向节点1972发送包括TTL持续时间值1929的建立请求1962。节点1971还可基于TTL持续时间值1929来建立对象侧死亡时间时间1973。节点1972可以从节点1971接收包括TTL持续时间值1929的建立请求1962。节点1972可以从TTL持续时间值1929中导出TTL持续时间值1949。节点1972可基于TTL持续时间值1949来建立监视侧死亡时间时间1939。节点1972可以向节点1971发送建立授权1974。节点1971可以从节点1972接收建立授权1974。
并行地,节点1972可生成用于监视节点1971的TTL持续时间值1975。节点1972可以向节点1971发送包括TTL持续时间值1975的建立请求1926。节点1972还可基于TTL持续时间值1975来建立对象侧死亡时间时间1935。节点1971可以从节点1972接收包括TTL持续时间值1975的建立请求1926。节点1971可以从TTL持续时间值1933中导出TTL持续时间值1953。节点1971可基于TTL持续时间值1953来建立监视侧死亡时间时间1937。节点1971可以向节点1972发送授权消息1976。节点1972可以从节点1971接收授权消息1976。
或者,节点1971和1972的任一个拒绝来自另一节点的建立请求。例如,节点1971可以拒绝建立请求1962。同样,节点1972可以拒绝建立请求1926。当任一节点拒绝建立请求时,它可向另一节点发送建立拒绝(例如,类似于建立拒绝1931)。这向另一节点指示没有建立监视协定。
节点1971和1972然后可以如上所述地交换续订请求和续订授权(以及类似于续订拒绝1933的续订拒绝)。因此,节点1971和1972的每一个都既是对象节点又是监视节点。基于图19B所描绘的TTL持续时间值和死亡时间时间,在建立监视关系期间和/或之后可发生各种事件。
如果节点1971处的时钟在从节点1972接收到续订授权之前到达对象侧死亡时间时间1973,则节点1971转换到故障状态。如果节点1972处的时钟在从节点1971接收到续订请求之前到达监视侧死亡时间时间1939,则节点1972怀疑节点1971发生故障。
如果节点1972处的时钟在从节点1971接收到续订授权之前到达对象侧死亡时间时间1935,则节点1972转换到故障状态。如果节点1971处的时钟在从节点1972接收到续订请求之前到达监视侧死亡时间时间1937,则节点1971怀疑节点1972发生故障。
节点故障的仲裁
由于各种不同类型的通信出错和节点误工作,存在一对节点中的每一节点怀疑另一节点发生故障的某种可能性。此外,每一节点可认为其正在正确工作。
在某些环体系结构中,资源的各部分被配置成使得在给定时刻单个节点控制资源。此外,所需的某些资源的可用性也可能很高,使得需要节点的实际上恒定的控制。由此,当一节点发生故障时,对各种资源的控制可能需要被转移到另一节点。因此,当一对节点中的一个节点怀疑另一节点发生故障时,可使用仲裁机制来确定至少哪一节点已经或将要发生故障。
例如,当一对节点中的每一节点怀疑另一节点发生故障时,每一节点可转换到超时状态并向仲裁设施报告其怀疑。当在超时状态中时,可挂起每一节点处的某些其他操作,直到接收到仲裁结果。仲裁设施可以回过来向节点报告,指示其是否要保持活动。例如,仲裁设施可以向报告节点发送要保持活动的认可消息。仲裁设施可以向报告节点发送要转换到故障状态的否认消息。接收到认可消息的节点可保持活动。未接收到认可消息(例如,由于网络条件)或接收到否认消息的节点转换到故障状态。
图19C示出了在互相监视节点各自能够报告另一节点被怀疑发生故障时方便仲裁的示例环体系结构1900。图19C描绘了节点1981(具有ID=98)、监视节点1982(具有ID=64)以及仲裁者1983的扩展视图。
在某些实施例中,仲裁者1983也是环1901的成员。在其他实施例中,仲裁者1983是环1901的祖先环的成员,但不是环1901的成员。在另外一些实施例中,仲裁者1983在包括环1901的环分层结构的外部。例如,仲裁者1983可被包括在单独的仲裁联盟节点环中。仲裁联盟中的节点可被配置为用于环1901及其祖先的节点的仲裁者。
在某些实施例中,仲裁者1983被节点1971和节点1982相互同意以便对节点1981和1982进行仲裁。在其他实施例中,仲裁者1983由另一实体分配来对节点1981和1982进行仲裁。该另一实体可以是包括环1901的环分层结构内部的节点(例如,种子节点),或是例如人类管理员。例如,该另一节点可以是环1901的成员,或是环1901的祖先环的成员但不是环1901的成员。或者,该另一实体可以在包括环1901的环分层结构的外部。例如,该另一实体可以是作为单独的仲裁联盟环的成员的节点。
仲裁者1983可具有关于包括环1901的环分层结构的变化的知识。例如,仲裁者1983可具有关于包括环1901的环分层结构的全局知识。或者,仲裁者1983可以具有关于包括在包括环1901的环分层结构中的环的某一子集的知识。在其他实施例中,仲裁者1983具有关于包括(且可能仅有)节点1981和1982的环1901中的节点子集的知识。
仲裁者1983可被配置成对包括但不限于节点1981和1982在内的任意数量的节点对进行仲裁。在某些实施例中,仲裁机制在接收到被怀疑的节点故障的报告之前没有关于它要仲裁的节点的知识。由此,尽管一对节点同意使用仲裁者1983或仲裁者1983被分配来对一对节点进行仲裁,但仲裁者1983在接收到关于该对节点中的一节点的被怀疑的节点故障的报告之前仍可能不了解任何协定或分配。
仲裁可包括提出冲突故障报告的节点之间的仲裁。例如,当第一节点正在监视第二节点且第二节点也正在监视第一节点时,情况可能是每一节点都报告怀疑另一节点发生故障。被怀疑的故障可使用实际上任何故障检测机制,包括本文中先前描述的那些机制来检测。
故障节点列表1947可以包括被报告为被怀疑的故障节点的节点的列表。节点可以向仲裁者1983将其他节点报告为被怀疑的故障节点,且在适当时,仲裁者1983可以在故障节点列表1947中包括所报告的节点。仲裁者1983在适当的时间段之后(例如,在继续冲突的可能性已经不太可能的将来时刻)可以从故障节点列表1947中移除故障节点。例如,故障节点列表1947中的条目可在其被***到故障节点列表1947之后的恢复时间间隔被移除。恢复时间间隔1942可以足够长以确保被告知发生故障的节点的确发生故障。
图21示出了用于在被怀疑的节点故障的冲突报告之间进行仲裁的方法2100的示例流程图。方法2100将参考图19C所示的组件和数据来描述。
方法2100包括第一节点向仲裁设施发送第二节点被怀疑发生故障的报告的动作(动作2101)。例如,节点1981可以向仲裁者1983发送报告1934。方法2100包括仲裁者从第一节点接收第二节点被怀疑发生故障的报告的动作(动作2102)。例如,向仲裁者1983可以从节点1981接收报告1934。
方法2100包括仲裁者确定在从第一节点接收报告之前在指定的恢复时间间隔内没有其他节点怀疑第一节点发生故障的动作(动作2103)。例如,仲裁者1983可以确定在恢复时间间隔1942内没有其他节点怀疑节点1981发生故障(在该时间间隔之后,仲裁者1983无论如何将从故障节点列表1947中移除节点1981)。
方法2100包括仲裁者在列表中记录第二节点处于故障状态的动作(动作2105)。例如,仲裁者1983可以在故障节点列表1947中记录节点1982(ID=64)处于故障状态。
方法2100包括仲裁者在最大响应时间间隔内向第一节点发送认可消息的动作,该认可消息包括指示在其之后第二节点保证转换到故障状态的时间段的故障时间值(动作2104)。例如,仲裁者1983可在接收报告1934的最大响应时间间隔1943内向节点1981发送认可消息1984。认可消息1984包括指示节点1982保证转换到故障状态的时间的故障时间间隔1936。一般而言,最大响应时间间隔表示在其之后请求者(例如,节点1981或1982)假设仲裁设施(仲裁者1983)不会回答对仲裁的请求(例如,报告1934或1938)的时间点。当在发送了仲裁请求之后在请求者处最大响应时间间隔到期时,请求者执行类似于(可能相同)在接收到明确的否认消息的情况下将执行的那些操作的操作。
方法2100包括第一节点在最大响应时间间隔内从仲裁设施接收认可消息的动作,该认可消息包括指示在其之后第二节点保证转换到故障状态的时间段的时间值(动作2106)。例如,节点1981可从仲裁者1983接收包括故障时间间隔1936的认可消息1984。故障时间间隔1936指示节点1982保证转换到故障状态的时间。由此,在故障时间间隔1936到期之后,节点1981可以试图要求对先前由节点1982控制的一个或多个环资源的控制。
方法2100包括在时间段到期之后第一节点要求对先前由第二节点控制的一个或多个环资源的控制的动作(动作2107)。例如,节点1981可以在故障时间间隔1936到期之后要求对先前由节点1982控制的环1901内的一个或多个环资源的控制。
所要求的环资源可以取决于节点1982在转换到故障状态之前所控制的环资源而变化。例如,节点1981可以承担节点1982的消息路由责任(例如,接收定向到环1901上的标识符范围的消息的责任)、节点1982的任何种子节点责任、节点1982的任何仲裁责任,等等。
在第一节点报告第二节点的某一时刻或在这之后,第二节点也可怀疑第一节点发生故障。例如,节点1982也可怀疑节点1981发生故障。
方法2100包括第二节点向仲裁设施发送第一节点被怀疑发生故障的报告的动作(动作2108)。例如,节点1982可以向仲裁者1938发送节点1981被怀疑发生故障的报告1938。方法2100包括仲裁者从第二节点接收第一节点被怀疑发生故障的报告的动作,来自第二节点的报告在从第一节点接收报告之后的指定恢复时间间隔内接收(动作2109)。例如,仲裁者1983可以在接收报告1934的恢复时间间隔1942内从节点1982接收节点1981被怀疑发生故障的报告1938。
方法2100包括仲裁者参考列表以确定第二节点要转换到故障状态的动作(动作2110)。例如,仲裁者1983可以参考故障节点列表1947以确定节点1982(ID=64)要转换到故障状态。
方法2100包括向第二节点发送否认消息以使得第二节点转换到故障状态的动作(动作2111)。例如,仲裁者1983可以向节点1982发送否认消息1985以使得节点1982转换到故障状态。方法2100包括第二节点从仲裁设施接收否认消息的动作(动作2112)。例如,节点1982可从仲裁者1983接收否认消息1985。
方法2100包括第二节点转换到故障状态的动作(动作2113)。例如,节点1982可响应于接收到否认消息1985而转换到故障状态。在发生故障之后,节点1982随后可试图重新加入环1901。
根据高速缓存的协定的路由
在某些实施例中,消息是根据高速缓存的路由协定来路由的。例如,环的相邻节点可同意对相邻节点之间未占用标识符范围的责任的划分。标识符可处于任意数量的原因而未被占用。例如,标识符可由于该标识符未被分配(即,未被分配给节点的标识符)而未被占用。对于已分配的标识符(即,已分配给节点的标识符),标识符可由于相应节点故意关闭或该节点出于某一原因,诸如,例如由于通信或节点故障而不可达到,而未被占用。
在准许节点接受关于要成为相邻节点的责任的任一未占用标识符的消息并传送该消息之前,可建立并高速缓存节点之间的路由协定。对高速缓存的路由协定的参考显著地减少了(可能的)相邻节点之间本来会发生以确定哪一节点负责特定的未占用标识符的任何通信。
高速缓存的路由协定可以按任意方式、根据可配置规则、或根据固定方法来划分未占用标识符范围。在某些实施例中,环上的相邻节点之间的标识符范围基本上对半划分。这减小了未占用标识符远离负责该未占用标识符的节点的可能性。
当在相邻节点之间存在偶数个未占用标识符时,相邻节点之间的中点在未占用标识符之间。由此,对于未占用标识符的责任可在该中点处在相邻节点之间划分。因此,每一相邻节点可被分配对于相等数量的未占用标识符的责任。
另一方面,当相邻节点之间存在奇数个未占用标识符时,相邻节点之间的中点在一未占用标识符上。由此,对这些未占用标识符的责任可在位于该中点上的未占用标识符的一侧或另一侧划分。因此,一个相邻节点可被分配对比另一相邻节点多一个未占用标识符的责任。
例如,现在参考图22A,图22A示出了方便根据节点之间的高速缓存的双向协定来路由消息的示例环体系结构2200。如图所示,包括(但不限于)节点2201、2202、2203、2261、2262和2263的各节点(示为环2250上的方块)被包括在环2250上。每一节点具有指示其在环2250上的位置的相应ID(在括号内示出)。例如,节点2201具有ID=64,而节点2202具有ID=30。
在所描绘的节点存在各未占用标识符范围。例如,未占用标识符范围2211表示节点2202和2201之间未占用标识符31到63。
如图所示,节点2201和2202已经建立并高速缓存了双向协定2223。例如,通过先前的通信,节点2201和2202可确定在ID=64和ID=30之间当前未散布有任何其他节点。由此,节点2201和2202可进一步确定它们在环2250上彼此相邻。因此,节点2201和2202可划分对于未占用标识符范围2211(即,未占用标识符31到63)的责任,使得节点2202负责未占用标识符范围2211的一部分,而节点2201负责未占用标识符范围2211的其余部分。每一节点也负责其分配的ID。即,节点2202负责ID=30,而节点2201负责ID=64。
因此,如由责任边界2213(在未占用标识符47和未占用标识符48之间)所描绘的,节点2202(ID=30)负责其自身以及未占用标识符31到47,而节点2201(ID=64)负责其自身以及未占用标识符48到63。尽管节点2201和2202之间的中点在未占用标识符47上,但节点2202被分配对未占用标识符47的责任,使得每一未占用标识符负责单个节点。由此,如上所述,当责任边界落在未占用标识符上时,相邻节点之一可被分配对该未占用标识符的单独的责任。
图24示出了用于根据高速缓存的双向协定来路由消息的方法2400的示例流程图。方法2400将参考图22A的环体系结构2200中所描绘的节点和消息来描述。
方法2400包括接收节点接收消息以及指示节点环上的目的地的目的地标识符的动作,该目的地标识符位于接收节点和直接相邻节点之一之间(动作2401)。例如,节点2201可接收指示要传送到ID=55的消息2251。或者,节点2201可接收指示要传送到ID=39的消息2252。消息2251和2252可从环2250中的另一节点接收(环内通信)、从环体系结构2200的另一环中的节点接收(环间通信)、或通过非环通信来接收。
方法2400包括接收节点参考接收节点和直接相邻节点之间的高速缓存的双向协定来确定要接收该消息的下一适当节点的动作(动作2402)。该双向协定至少暗示接收节点和直接相邻节点之间对于标识符空间的责任的划分。例如,节点2201可参考高速缓存的双向协定2223来确定要处理消息2251的下一适当节点。由于高速缓存的双向协定2223指示节点2201(ID=64)负责未占用标识符55,则节点2201确定它是处理消息2251的适当节点。同样,节点2201可参考高速缓存的双向协定2223来确定要处理消息2252的下一适当节点。由于高速缓存的双向协定2223指示节点2202(ID=30)负责未占用标识符39,则节点2201确定节点2202是处理消息2252的下一适当节点。
方法2400包括基于对下一适当节点的确定将消息发送到下一适当组件的动作(动作2403)。例如,节点2201可将消息2251提供给其对应于未占用标识符55的资源处理程序实例,因为高速缓存的双向协定2223指示节点2201负责未占用标识符55。或者,节点2201可将消息2252提供给节点2202,因为高速缓存的双向协定2223指示节点2202负责未占用标识符39。随后,节点2202可将消息2252提供给其对应于未占用标识符39的资源处理程序实例。
当一标识符未被包括在高速缓存的双向协定中时,节点可参考路由表(例如,如图3所描绘的)以便向着目的地前进。例如,节点2201可向节点2261(ID=200)发送指示要传送到ID=203的消息2253。节点2261可参考与其相邻节点的任何高速缓存的双向协定以确定负责标识符203的节点。
在某些实施例中,从给定节点的观点来看,多个双向协定可本质上表示给定节点、给定节点的直接前导者节点、和给定节点的直接后继者节点之间的三向协定。图22B示出了方便根据多个高速缓存的双向协定来路由消息的示例环体系结构2200。
如先前所描述的,节点2201和2202已经建立并高速缓存了双向协定2223。类似地,节点2201和2203可建立高速缓存的双向协定2224,以划分对未占用标识符范围2212(即,未占用标识符65到101)的责任。由此,通过先前的通信,节点2201和2203可确定在ID=65和ID=101之间当前未散布有任何其他节点。由此,节点2201和2203可进一步确定它们在环2250上彼此相邻。因此,节点2201和2203可划分未占用标识符范围2212,使得节点2202负责未占用标识符范围2212的一部分,而节点2201负责未占用标识符范围2212的其余部分。因此,如在双向协定2224内所描绘的,节点2201(ID=64)负责其自身以及未占用标识符65到82,而节点2202(ID=101)负责其自身以及未占用标识符范围83到100。
从节点2201的观点来看,高速缓存的双向协定2223和高速缓存的双向协定2224的组合本质上表示三向协定2273。即,节点2201负责节点2201和2202之间的标识符空间的一部分,且负责节点2201和节点2203之间的标识符空间的一部分。括号中的标识符范围指示形成节点2201的任一侧上的高速缓存的双向协定2223和2224的责任范围(即,47到64和64到82)。
图25示出了用于根据多个高速缓存的双向协定来路由消息的方法2500的示例流程图。方法2500将参考图22B的环体系结构2200中所描绘的节点和消息来描述。
方法2500包括接收节点接收消息以及指示节点环上的目的地的目的地标识符的动作(动作2501)。例如,节点2201可接收指示要分别传送到节点IE=55、ID=39、ID=203、ID=74和ID=94的消息2251、2252、2253、2254和2256中的任一个。消息2251、2252、2253、2254和2256可从环2250中的另一节点接收(环内通信)、或从环体系结构2200的另一环中的节点接收(环间通信)、或通过非环通信来接收。
方法2500包括接收节点参考与前导者节点的第一高速缓存的双向协定以及与后继者节点的第二高速缓存的双向协定来确定要接收该消息的下一适当节点的动作(动作2502)。第一和第二高速缓存的双向协定至少暗示前导者节点和后继者节点之间关于标识符空间的责任的划分。例如,节点2201可参考高速缓存的三向协定2223和2224来确定要接收消息2251、2252、2253、2254和2256中的任一个的下一适当节点。
由于高速缓存的双向协定2223指示节点2202(ID=30)负责未占用标识符39,则节点2201确定节点2202是处理消息2252的下一适当节点。由于高速缓存的双向协定2223指示节点2201(ID=64)负责未占用标识符55,则节点2201确定它是处理消息2252的适当节点。由于高速缓存的双向协定2224指示节点2201(ID=64)负责未占用标识符74,则节点2201确定它是处理消息2254的适当节点。由于高速缓存的双向协定2224指示节点2203(ID=101)负责未占用标识符94,则节点2201确定节点2203是处理消息2254的下一适当节点。
方法2500包括基于对下一适当节点的确定将消息发送到下一适当组件的动作(动作2503)。例如,节点2201可基于对要处理消息2251、2252、2253、2254和2256的下一适当节点的确定将消息2251、2252、2253、2254和2256发送到环2250上的下一适当组件。
例如,节点2201可将消息2252提供给节点2202,因为高速缓存的双向协定2223指示节点2202负责未占用标识符39。随后,节点2202可将消息2252提供给其对应于未占用标识符39的资源处理程序实例。节点2201可将消息2251提供给其对应于未占用标识符55的资源处理程序实例,因为高速缓存的双向协定2223指示节点2201负责未占用标识符55。节点2201可将消息2254提供给其对应于未占用标识符74的资源处理程序实例,因为高速缓存的双向协定2224指示节点2201负责未占用标识符74。节点2201可将消息2256提供给节点2203,因为高速缓存的双向协定2224指示节点2203负责未占用标识符94。随后,节点2203可将消息2256提供给其对应于未占用标识符94的资源处理程序实例。
当一标识符未被包括在高速缓存的多个高速缓存的双向协定的任一个中时,节点可参考路由表(例如,如图3所描绘的)以便向着目的地前进。例如,节点2201可向节点2261(ID=200)发送指示要传送到ID=203的消息2256。节点2261然后可参考与其前导者节点和/或其后继者节点的任何高速缓存双向协定来确定要接收消息2253的下一适当组件。
制定高速缓存的协定
环可不时地重新配置,诸如,例如当新节点加入环时或当现有节点离开环时(例如,通过优雅移除、作为节点监视的结果、通过参考仲裁者等等)。当一节点检测到环的配置已改变时,该节点可重新制定与任何相邻节点的高速缓存的路由协定。在协定重新制定期间,节点可将任何接收到的消息排队,除了用于制定协定的那些消息之外。在协定制定完成之后,该节点然后可根据该协定来处理消息。
环的重新配置可导致多个路由协定被重新制定。例如,当一节点离开环时,该离开节点的任一侧上的直接相邻节点可制定对于先前是离开节点的责任的未占用标识符范围的协定(由此可能获得对另外的未占用标识符的责任)。该重新制定将来自离开节点的未占用标识符范围的一部分与每一直接相邻节点的未占用标识符范围的责任相联接。即,每一直接相邻节点获得对离开节点的未占用标识符范围的一部分以及该离开节点的标识符的责任。
图23A到23D示出了方便制定高速缓存的双向协定的示例环体系结构2300。如图23A中所示,节点2301和2302制定了划分在责任边界2313(在未占用标识符47和未占用标识符48之间)处对未占用标识符范围2312(即,未占用标识符31到63)的责任的高速缓存的双向协定2323。类似地,节点2302和2362制定了划分在责任边界2333(在未占用标识符14和15之间)处对未占用标识符范围2311(即,未占用标识符255到29)的责任的高速缓存的双向协定2343。
在高速缓存的双向协定2323和2343的制定之后的某一时刻,节点2302可离开环2350(例如,通过优雅移除、作为节点监视的结果、基于来自仲裁者的指令等等)。现在参考图23B,在节点2302离开环2350之后,没有节点负责先前是节点2302的责任的未占用标识符。未占用标识符范围2313(未占用标识符15到47,包括现在未占用的标识符30)表示节点2302在离开环2350之前负责的未占用标识符范围。
响应于节点2302离开环2350,节点2301和2362试图标识新的直接相邻节点。节点2362试图表示新的直接后继者节点(即,在与节点2302相同的相对于节点2362的方向上的直接相邻节点)。节点2301试图标识新的直接前导者节点(即,在与节点2302相同的相对于节点2301的方向上的直接相邻节点)。在图23B中,节点2362将节点2301标识为其新的直接后继者,而节点2301将节点2362标识为其新的直接前导者。
在标识了新的直接相邻节点之后,节点2362和2301制定划分对未占用标识符范围2314(未占用标识符255到63,包括现在未占用的标识符30)的责任的高速缓存的双向协定2363。未占用标识符范围2313包括先前是节点2302的责任的未占用标识符范围2314。由此,在节点2302离开环2350之后,未占用标识符范围2313的各部分可变为节点2362或节点2301的责任。
因此,如由责任边界2353(在未占用标识符31和未占用标识符32之间)所描绘的,节点2362(ID=254)和节点2301(ID=30)制定高速缓存的双向协定2363。根据高速缓存的双向协定2363,节点2362(ID=64)负责其自身以及未占用标识符255到31,而节点2301(ID=64)负责其自身以及未占用标识符范围32到63。尽管节点2201和2202之间的中点在未占用标识符31上,但节点2362被分配对未占用标识符31的责任,使得每一未占用标识符负责单个节点。
在节点2302的离开与高速缓存的双向协定2363的制定之间的时间期间,节点2301和2362不处理指示要传送到255和63之间的范围内的标识符的消息。取而代之的是,节点2301和2362将任何消息排队,除了用于制定高速缓存的双向协定2363的那些消息之外。在高速缓存的双向协定2363的制定完成之后,节点2301和2362然后根据高速缓存的双向协定2363来处理消息。
当一新的节点在两个现有节点之间加入环,每一现有节点可制定与该新节点的路由协定(且由此可能放弃对未占用标识符的一部分的责任)。该制定可基本上在加入节点和现有节点之间拆分现有节点所负责的未占用标识符范围。即,每一现有节点可能将对现有节点的未占用标识符的一部分的责任放弃给加入节点。
现在参考图23C,在制定高速缓存的双向协定2363之后的某一时刻,节点2304(ID=44)可加入环2350。在节点2304加入环2350之后,节点2362可检测到节点2304作为其直接后继者。同样,节点2301可检测到节点2304作为其直接前导者。响应于每一检测,未占用标识符范围2314基本上被拆分成未占用标识符范围2315(未占用标识符255到43)和未占用标识符范围2316(未占用标识符45到63)。然后可制定新的高速缓存的双向协定以划分对未占用标识符范围2315和2316的责任。
现在参考图23D,在将节点2304标识为新的直接后继者节点之后,节点2362和2304制定划分对未占用标识符范围2315(未占用标识符255到43)的责任的高速缓存的双向协定2394。未占用标识符范围2315包括未占用标识符范围2314的部分,该部分先前是节点2362的责任且在该情况下该部分的某一些先前是节点2301的责任。由此,未占用标识符范围2314中曾是节点2362或节点2301的任一个的责任的部分在节点2304加入环2350时可成为节点2304的责任。
因此,如由责任边界2393(在未占用标识符23和未占用标识符24之间)所描绘的,节点2362(ID=254)和节点2304(ID=44)制定高速缓存的双向协定2394。根据高速缓存的双向协定2394,节点2362(ID=254)负责其自身以及未占用标识符255到23,而节点2304(ID=44)负责其自身以及未占用标识符范围24到43。尽管节点2201和2202之间的中点在未占用标识符23上,但节点2362被分配对未占用标识符23的责任,使得每一未占用标识符负责单个节点。
类似地,在将节点2304标识为新的直接前导者节点之后,节点2301和2304制定划分对未占用标识符范围2316(未占用标识符45到64)的责任的高速缓存的双向协定2383。未占用标识符范围2316包括未占用标识符范围2314中先前是节点2302的责任的部分。由此,未占用标识符范围2314中曾是节点2301的责任的部分在节点2304加入环2350时可成为节点2304的责任。
因此,如由责任边界2373(在未占用标识符54和未占用标识符55之间)所描绘的,节点2304(ID=44)和节点2301(ID=64)制定高速缓存的双向协定2383。根据高速缓存的双向协定2383,节点2304(ID=44)负责其自身以及未占用标识符45到54,而节点2301(ID=64)负责其自身以及标识符范围55到63。尽管节点2201和2202之间的中点在未占用标识符54上,但节点2304被分配对未占用标识符54的责任,使得每一未占用标识符负责单个节点。
在节点2304的加入与高速缓存的双向协定2394的制定之间的时间期间,节点2304和2362不处理指示要传送到255和43之间的范围内的标识符的消息。取而代之的是,节点2362和2304将任何消息排队,除了用于制定高速缓存的双向协定2394的那些消息之外。在高速缓存的双向协定2394的制定完成之后,节点2362和2304然后根据高速缓存的双向协定2394来处理消息。
类似地,在节点2304的加入与高速缓存的双向协定2383的制定之间的时间期间,节点2304和2301不处理指示要传送到45和63之间的范围内的标识符的消息。取而代之的是,节点2304和2301将任何消息排队,除了用于制定高速缓存的双向协定2383的那些消息之外。在高速缓存的双向协定2383的制定完成之后,节点2304和2301然后根据高速缓存的双向协定2383来处理消息。
从节点2304的观点来看,高速缓存的双向协定2394和高速缓存的双向协定2383的组合本质上表示节点2304、节点2362和2301之间的三向协定(未示出)。从节点2304的观点来看,相应的所表示的三向协定定义了对从ID=254(包括254)到ID=64(包括64)的(已分配的和未占用的)标识符的责任。
图26示出了用于加入双向协定的方法2600的示例流程图。方法2600将参考图23A到23D中的节点和协定来讨论。
方法2600包括当前节点访问节点环的配置已改变的指示的动作,该指示表明需要制定在当前节点和直接相邻节点之间划分对至少环上的未占用标识符的责任的双向协定(动作2601)。例如,参考图23A和23B,节点2301和/或节点2362可例如通过对节点2302的监视从节点2302或从仲裁者访问节点2302离开环2350的指示。节点2302离开环2350的指示向节点2301和/或节点2362表明需要制定划分对未占用标识符范围2314(未占用标识符255到63)的责任的双向协定。
或者,参考图23C和23D,节点2301可访问节点2304已加入环2350的指示(例如,作为节点2304的加入过程的一部分发送)。节点2304加入环2350的指示向节点2301表明需要制定划分对未占用标识符范围2316(未占用标识符45到63)的责任的双向协定。类似地,节点2362可访问节点2304已加入环2350的指示(例如,作为节点2304的加入过程的一部分发送)。节点2304加入环2350的指示向节点2362表明需要制定划分对未占用标识符范围2315(未占用标识符255到43)的责任的双向协定。
方法2600包括当前节点和直接相邻节点同意当前节点和直接相邻节点之间的责任边界的动作,该责任边界要在当前节点和直接相邻节点之间划分对未占用标识符的责任(动作2602)。当前节点和责任边界之间的未占用标识符是当前节点的责任而责任边界和直接相邻节点之间的未占用标识符是直接相邻节点的责任。
例如,参考图23B,节点2301和节点2362可同意责任边界2353,其基本上在未占用标识符31和32之间。由此,节点2301和责任边界2353之间的未占用标识符(即,未占用标识符32到63)是节点2301的责任。同样,责任边界2353和节点2362之间的未占用标识符(即,未占用标识符255到31)是节点2362的责任。
参考图23D,节点2301和节点2304可同意责任边界2373,其基本上在未占用标识符54和55之间。由此,节点2301和责任边界2373之间的未占用标识符(即,标识符55到63)是节点2301的责任。同样,责任边界2373和节点2304之间的未占用标识符(即,未占用标识符45到54)是节点2304的责任。
仍参考图23D,节点2304和节点2362可同意责任边界2393,其基本上在未占用标识符23和24之间。由此,节点2304和责任边界2393之间的标识符(即,未占用标识符24到43)是节点2304的责任。同样,责任边界2393和节点2362之间的未占用标识符(即,未占用标识符255到23)是节点2362的责任。
图6和以下讨论旨在提供其中可实现本发明的合适计算环境的简要概括描述。虽然未作要求,但是本发明将在诸如程序模块等正由计算机***执行的计算机可执行指令的一般上下文中描述。一般而言,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等。计算机可执行指令、相关联的数据结构和程序模块表示用于执行此处所公开的方法的动作的程序代码装置的示例。
参照图6,用于实现本发明的示例***包括计算机***620形式的通用计算设备,包括处理单元621、***存储器622、以及将包括***存储器622的各种***组件耦合到处理单元621的***总线623。处理单元621可以执行被设计成实现计算机***620的特征(包括本发明的特征)的计算机可执行指令。***总线623可以是几种类型的总线结构中的任何一种,包括存储器总线或存储控制器、***总线、以及使用各种总线体系结构中的任一种的局部总线。***存储器包括只读存储器(“ROM”)624和随机存取存储器(“RAM”)625。基本输入/输出***(“BIOS”)626可以被存储在ROM624中,它包含有助于例如在启动期间在计算机***620内的各个元件之间传送信息的基本例程。
计算机***620还可包括用于对磁硬盘639进行读写的磁硬盘驱动器627,用于对可移动磁盘629进行读写的磁盘驱动器628,以及用于对诸如CD-ROM或其它光介质等可移动光盘631进行读写的光盘驱动器630。磁硬盘驱动器627、磁盘驱动器628和光盘驱动器630分别通过硬盘驱动器接口632、磁盘驱动器接口633和光驱接口634连接到***总线623。驱动器及其相关联的计算机可读介质为计算机***620提供计算机可执行指令、数据结构、程序模块和其他数据的非易失性存储。虽然这里所描述的示例环境使用磁硬盘639、可移动磁盘629和可移动光盘631,但是可以使用用于存储数据的其他类型的计算机可读介质,包括盒式磁带、闪存卡、数字多功能盘、伯努里盒式磁带、RAM、ROM等。
包括一个或多个程序模块的程序代码装置可以被存储在硬盘639、磁盘629、光盘631、ROM 624或RAM 625上,包括操作***635、一个或多个应用程序636、其他程序模块637和程序数据638。用户可以通过键盘640、定点设备642或其他输入设备(未示出)(例如,话筒、操纵杆、游戏手柄、扫描仪或等)来将命令和信息输入到计算机***620中。这些和其他输入设备可以通过耦合到***总线623的输入/输出接口646连接到处理单元621。输入/输出接口646逻辑上表示各种各样不同的接口中的任一个,例如,串行端口接口、PS/2接口、并行端口接口、通用串行总线(“USB”)接口、或电气和电子工程师协会(“IEEE”)1394接口(即火线接口),或者甚至可以逻辑上表示不同接口的组合。
监视器647或其他显示设备也经由视频接口648连接到***总线623。扬声器669或其它音频输出设备也通过音频接口649连接到***总线623。诸如打印机等其它***输出设备(未示出)也可连接到计算机***620。
计算机***620可以连接到诸如办公室范围或企业范围的计算机网络、家庭网络、内联网和/或因特网等网络。计算机***620可以通过这类网络与诸如远程计算机***、远程应用程序、和/或远程数据库等外部源交换数据。
计算机***620包括网络接口653,通过网络接口653,计算机***620从外部源接收数据和/或将数据发送到外部源。如图6中所描绘的,网络接口653便于经由链路651与远程计算机***683交换数据。网络接口653可以逻辑上表示一个或多个软件和/或硬件模块,例如,网络接口卡和对应的网络驱动程序接口规范(“NDIS”)栈。链路651表示网络的一部分(例如,以太网段),并且,远程计算机***683表示该网络的节点。
同样,计算机***620包括输入/输出接口646,通过输入/输出接口646,计算机***620从外部源接收数据和/或将数据发送到外部源。输入/输出接口646经由链路659耦合到调制解调器654(例如,标准调制解调器、电缆调制解调器、或数字用户线(“DSL”)调制解调器),通过调制解调器,计算机***620从外部源接收数据和/或将数据发送到外部源。如图6中所描绘的,输入/输出接口646和调制解调器654便于经由链路652与远程计算机***693交换数据。链路652表示网络的一部分,并且,远程计算机***693表示该网络的节点。
尽管图6表示用于本发明的合适的操作环境,但本发明的原理可以被用于能够(如果必要的话,具有合适的修改)实现本发明的原理的任何***中。图6中所展示的环境只起说明的作用,决不表示其中可以实现本发明的原理的各种各样环境的甚至一小部分。
根据本发明,节点、应用层、以及其它较低层,以及相关联的数据,包括路由表和节点ID可从与计算机***620相关联的任何计算机可读介质存储和访问。例如,这类模块的各个部分和相关联的程序数据的各个部分可以被包括在操作***635、应用程序636、程序模块637和/或程序数据638中,用于存储在***存储器622中。
当诸如磁硬盘639等大容量存储设备被耦合到计算机***620时,这类模块和相关联的程序数据也可以被存储在该大容量存储设备中。在网络化环境中,相对于计算机***620或其各个部分而描绘的程序模块可以被存储在诸如与远程计算机***683和/或远程计算机***693相关联的***存储器和/或大容量存储设备等远程存储器存储设备中。可以在如前所述的分布式环境中实现这类模块的执行。
加入和离开节点环
图27示出了其中可利用本发明的原理的体系结构2700。环体系结构2700包括节点环2705。在某些实施例中,节点环2705可类似于如上所述的图23C中的环2350或与其相同。节点环2705可包括加入节点2710,其可以正试图在直接相邻节点1(2720)和直接相邻节点2(2730)之间加入环。在某些实施例中,加入节点2710可按类似于图23C中所描述的方式加入节点环2710,其中加入节点基于节点2301和1362之间的高速缓存的协定来确定标识符范围。用于在节点加入期间维护环一致性的方法在下文中参考图27的节点和数据项来更详细描述。
图28示出了用于在加入节点加入节点环时维护环一致性的方法2800的流程图。在某些实施例中,方法2800合并多个子方法,每一子方法都出于一不同节点的观点。方法2800现在将频繁地参考环境2700的组件和数据以及图30的状态图3000来描述。
方法2800包括加入节点检测环上的多个其他节点的邻域的动作,该邻域至少包括直接相邻前导者节点和直接相邻后继者节点(动作2805)。在某些情况下,加入节点2710可检测和/或建立环2705上的多个其他节点的邻域,其中该邻域包括直接相邻节点2720和其他直接相邻节点2730。在某些实施例中,诸如在状态图3000中,加入节点3005可通过在步骤1中发送介绍消息(例如,介绍3006)来建立邻域。接收这一介绍消息的每一节点可在该状态图的步骤2中用确认(ACK)消息(例如,ACK 3007)来响应。介绍3006可包括用于标识加入节点的信息的一个或多个部分,并指示加入节点3005打算加入环2705。
根据加入节点3005接收回来的ACK消息,加入节点可被配置成确定哪一节点在环上最靠近它。例如,每一ACK消息可包括指示环上的节点位置以及该节点负责的范围的标识符范围和/或位置标识符。由此,在状态图3000中,加入节点3005可确定直接相邻节点3(3010)是加入节点的直接相邻前导者节点,而直接相邻节点5(3015)是加入节点的直接相邻后继者节点。此外,加入节点3005可确定相邻节点1(3020)和相邻节点2(3025)与加入节点在同一环上,但不一定是加入节点的直接最近节点。由此,邻域建立3050可以根据示例性状态图3000来实现。
方法2800包括加入节点向选自直接相邻前导者节点和直接相邻后继者节点的直接相邻节点之一指示加入节点要获得对于加入节点和所选直接相邻节点之间的id空间的一部分的id空间所有权的意图的动作(动作2810)。例如,加入节点2710可以向选自直接相邻节点1(2720)和直接相邻节点2(2730)的直接相邻节点1指示加入节点2710要获得对加入节点2710和所选直接相邻节点2720之间的id空间的一部分的id空间所有权的意图。如上所述,id空间可包括给定节点所负责的标识符范围(未占用的或其他)。例如,id空间可包括给定节点负责的节点标识符的数值范围。
在某些实施例中,诸如在状态图3000中,加入节点3005向选自直接相邻前导者节点和直接相邻后继者节点的直接相邻节点之一指示加入节点要获得对加入节点3005和所选直接相邻节点3010之间的id空间的一部分的id空间所有权的意图的动作包括向选自直接相邻前导者节点3010和直接相邻后继者节点3015的直接相邻节点3010发送令牌请求3031的动作,该令牌请求包括一节点标识符,使得只有具有该节点标识符的节点才能够回复,并且还包括第一生存时间持续时间值3031,该第一生存时间持续时间值指示加入节点3005能将与所选直接相邻节点的监视关系认为是活动的持续时间。
在某些情况下,令牌请求消息3031包括指示加入节点3005期望的所有权范围的经更新的状态的标记。生存时间值(TTL)和关系监视可以基本上与图20的方法2000中所描述的相同。
方法2800包括加入节点指示要监视所选直接相邻节点的意图的动作(动作2815)。例如,加入节点2710可指示要如在监视指示2712中所指示地监视直接相邻节点1(2720)的意图。在这一监视关系中,加入节点2710可同意监视某一节点标识符范围。在某些情况下,范围可包括直接相邻节点2720的标识符和直接相邻节点2730的标识符之间的标识符。尽管未在图27中示出,但在某些实施例中,监视指示2712和id空间所有权指示可被组合在单个消息中。
方法2800包括第一所选直接相邻节点从加入节点接收指示加入节点要获得加入节点和第一所选直接相邻节点之间的id空间的一部分的id空间所有权的意图的指示的动作(动作2820)。例如,直接相邻节点1(2720)可从加入节点2710接收指示加入节点2710要获得加入节点和节点2720之间的id空间的一部分的id空间所有权的意图的指示(例如,id空间所有权指示2711)。
方法2800包括第一所选直接相邻节点从加入节点接收加入节点要监视所选直接相邻节点的意图的指示的动作(动作2825)。例如,直接相邻节点1(2720)可从加入节点2710接收加入节点要监视直接相邻节点2720的意图的指示(例如,监视指示2712)。
方法2800包括第一所选直接相邻节点向加入节点发送指示接受加入节点要获得加入节点和第一所选直接相邻节点之间的id空间的一部分的id空间所有权的意图的指示的动作(动作2830)。例如,直接相邻节点1(2720)可发送指示接受加入节点要获得对加入节点2710和直接相邻节点2720之间的id空间的一部分的id空间所有权的意图的id空间所有权接受2773(例如,id空间所有权接受2773)。
方法2800包括第一所选直接相邻节点向加入节点发送指示接受加入节点要监视所选直接相邻节点的意图的第二指示的动作(动作2831)。例如,直接相邻节点1(2720)可发送指示接受加入节点2710要监视所选直接相邻节点2720的意图的监视接受2783。
方法2800包括第一所选直接相邻节点向加入节点发送指示第一所选直接相邻节点要监视加入的意图的第三指示的动作(动作2832)。例如,直接相邻节点1(2720)可向加入节点2710发送指示第一所选直接相邻节点2720要监视加入节点2710的意图的监视指示2793。在某些实施例中,第一、第二和第三指示可以被组合在单个指示中。另外地或另选地,第一、第二和第三指示的任意组合可被组合在单个组合中(例如,第一和第三或第二和第三)。
方法2800包括加入节点从所选直接相邻节点接受指示接受加入节点要获得加入节点和所选直接相邻节点之间的id空间的一部分的id空间所有权的意图的第一指示的动作(动作2835)。例如,加入节点2710可从直接相邻节点1(2720)接收指示接受加入节点要获得加入节点2710和直接相邻节点2720之间的id空间的一部分的id空间所有权的意图的id空间所有权接受2773。
方法2800包括加入节点从所选直接相邻节点接受指示接受加入节点要监视所选直接相邻节点的意图的第二指示的动作(动作2836)。例如,加入节点2710可从所选直接相邻节点2720接收指示接受加入节点要监视所选直接相邻节点2720的意图的监视接受2783。
方法2800包括加入节点从所选直接相邻节点接收指示第一所选直接相邻节点要监视加入节点的意图的第三指示的动作(动作2837)。例如,加入节点2710可从所选直接相邻节点2710接收指示所选直接相邻节点要监视加入节点2710的意图的监视指示2793。在某些情况中,第一、第二和第三指示可以被组合在单个指示中。另外地或另选地,第一、第二和第三指示的任意组合可被组合在单个组合中。
在某些实施例中,诸如在状态图3000中,加入节点3005从所选直接相邻节点3010接收指示接受加入节点要获得对加入节点和所选直接相邻节点之间的id空间的一部分的id空间所有权的意图并指示所选直接相邻节点3010要监视加入节点3005的意图的指示的动作包括从所选直接相邻节点3010接收第一令牌传输3032的动作,该第一令牌传输包括:加入节点对节点环中在加入节点3005和所选直接相邻节点3010之间的未占用节点标识符的所有权范围;第二生存时间持续时间值3032,其指示所选直接相邻节点能将与加入节点3005的监视关系认为是活动的持续时间;以及指示所选直接相邻节点3010监视加入节点的第一建立授权。
方法2800包括加入节点指示接受所选直接相邻节点要监视加入节点的意图的动作(动作2840)。例如,加入节点2710可在监视协定2714中指示接受第一所选直接相邻节点1(2720)要监视加入节点2710的意图。在某些实施例中,诸如在状态图3000中,加入节点3005指示接受所选直接相邻节点3010要监视加入节点3005的意图的动作包括向所选直接相邻节点3010发送确认所选直接相邻节点要监视加入节点3005的意图的确认消息3033的动作。
再次参考图27和28,方法2800包括第一所选直接相邻节点从加入节点2710接收指示接受第一所选直接相邻节点要监视加入节点2710的意图的指示的动作(动作2845)。例如,直接相邻节点2720可从加入节点2710接收同意参与与直接相邻节点2720的单向监视关系的协定(例如,监视关系协定2714)。
在某些实施例中,所选直接相邻节点2720可另外地或另选地执行向第二所选直接相邻节点指示第一节点要终止与该第二所选直接相邻节点的任何监视关系的意图、从第二所选直接相邻节点接收指示第二节点要终止与第一所选直接相邻节点的任何监视关系的指示、以及确认第二节点要终止的意图的动作。例如,直接相邻节点1(2720)可向直接相邻节点2(2730)指示节点1要终止与节点2(2730)的任何监视关系的意图。直接相邻节点1(2720)还可从节点2(2730)接收指示节点2要终止与节点1的任何监视关系的意图的指示。直接相邻节点1(2720)还可确认节点2的终止意图。
在某些情况下,诸如在状态图3000中,直接相邻节点3(3010)可被配置成在该状态图的步骤5(3034)中向直接相邻节点5(3015)指示节点3要终止与节点5(3015)的任何监视关系的意图。直接相邻节点3(3010)还可在该状态图的步骤6(3035)中从节点5(3015)接收指示节点5要终止与节点3的任何监视关系的意图的指示。这在某些实施例中也可用于确认3034。直接相邻节点3(3010)还可在该状态图的步骤7(3036)中确认节点5的终止意图。应当注意,状态图3000的步骤(1-8)可串行或并行地发生。由此,在某些实施例中,例如标为(5)的所有步骤可同时发生,而其他步骤可串行发生。串行或并行执行的步骤的任意组合是可能的。
在某些实施例中,方法2800还包括以下可任选动作:从加入节点接收介绍消息,该介绍消息包括所指示的为加入节点所拥有的节点标识符期望的所有权范围;以及向加入节点发送确认消息,该确认消息包括加入节点所标识的节点标识符范围与所选直接相邻节点的节点标识符范围相一致的指示。在某些情况下,节点标识符范围可能不被包括在介绍消息或确认消息的任一个中。取而代之的是,节点标识符范围可在发送或接收消息的节点接收或发送时计算。
方法2800包括选自直接相邻前导者节点和直接相邻后继者节点的另一直接相邻节点向加入节点指示对于加入节点和第一所选直接相邻节点之间的id空间的一部分的id空间所有权的动作(动作2850)。例如,选自直接相邻节点1(2720)和直接相邻节点2(2730)的直接相邻节点2(2730)可向加入节点2710指示对加入节点2710和直接相邻节点2730之间的id空间的一部分的id空间所有权。
方法2800包括该另一直接相邻节点指示该另一直接相邻节点要监视加入节点的意图的动作(动作2851)。例如,直接相邻节点2(2730)可指示节点2要监视加入节点2710的意图(2794)。
方法2800包括加入节点从该另一直接相邻节点接收指示对加入节点和该另一直接相邻节点之间的id空间的一部分的id空间所有权的指示的动作(动作2855)。例如,加入节点2710可从直接相邻节点2(2730)接收指示对加入节点2710和直接相邻节点2730之间的id空间的一部分的id空间所有权的id空间所有权指示2784。
方法2800包括加入节点从该另一直接相邻节点接收指示该另一直接相邻节点要监视加入节点的意图的指示的动作(动作2856)。例如,加入节点2710可从该另一直接相邻节点2730接收指示该另一直接相邻节点要监视加入节点2710的意图的监视指示2794。
在某些实施例中,诸如在状态图3000中,加入节点3005从另一直接相邻节点3015接收指示对加入节点3005和另一直接相邻节点3015之间的id空间的一部分的id空间所有权的指示以及另一直接相邻节点3015指示该另一直接相邻节点要监视加入节点的意图的动作包括接收第三生存时间持续时间值3037的动作,该第三生存时间持续时间值指示另一直接相邻节点3015能将与加入节点3005的监视关系认为是活动的持续时间。在某些实施例中,加入节点可在步骤6中从另一直接相邻节点3015接收第二令牌传输3037,该第二令牌传输包括加入节点对加入节点3005和另一直接相邻节点3015之间的未占用节点标识符的所有权范围。在其他情况下,所有权范围可由加入节点和另一直接相邻节点中的任一个或两者来计算。
再次参考图27和28,方法2800包括加入节点向另一直接相邻节点指示加入节点要建立对加入节点和另一直接相邻节点之间的id空间的一部分的id空间所有权的意图的动作(动作2860)。例如,加入节点2710可向直接相邻节点2(2730)指示(例如,在id空间所有权指示2721中)加入节点2710要建立对加入节点2710和直接相邻节点2730之间的id空间的一部分的id空间所有权的意图。
在某些实施例中,诸如在状态图3000中,加入节点3005向另一直接相邻节点3015指示加入节点要建立对加入节点3005和另一直接相邻节点3015之间的id空间的一部分的id空间所有权的意图的动作包括发送建立加入节点3005和另一直接相邻节点3015之间的第二所有权范围的建立请求(步骤7中的3038)的动作,该建立请求3038包括第四生存时间持续时间3038,该第四生存时间持续时间指示加入节点3005能将与另一直接相邻节点3015的监视关系认为是活动的持续时间;以及发送指示加入节点监视另一直接相邻节点3015的第三建立授权。在某些实施例中,建立请求3038还可表示加入节点3005和另一直接相邻节点3015之间的第二所有权范围的指示。在其他情况下,如上所述,该范围可由节点环2705上的任意直接相邻节点对来计算。
方法2800包括加入节点发起监视另一直接相邻节点的意图的动作(动作2865)。例如,加入节点2710可发起(例如,经由监视指示2722)监视直接相邻节点2(2730)的意图。在某些实施例中,诸如在状态图3000中,加入节点3005向另一直接相邻节点3015指示加入节点要建立对加入节点3005和另一直接相邻节点3015之间的id空间的一部分的id空间所有权的意图的动作包括发送建立加入节点3005和另一直接相邻节点3015之间的第二所有权范围的建立请求3038的动作,该建立请求3038包括加入节点和另一直接相邻节点之间的第二所有权范围;第四生存时间持续时间3038,该第四生存时间持续时间指示加入节点3038能将与另一直接相邻节点3015的监视关系认为是活动的持续时间;以及指示加入节点监视另一直接相邻节点的第三建立授权3038。
方法2800包括另一直接相邻节点接收加入节点要建立对加入节点和第一所选直接相邻节点之间的id空间的一部分的id空间所有权的意图的指示的动作(动作2870)。例如,直接相邻节点2(2730)可接收指示加入节点要建立对加入节点2710和直接相邻节点2730之间的id空间的一部分的id空间所有权的意图的id空间所有权指示2721。
方法2800包括另一直接相邻节点接收加入节点要监视第一所选直接相邻节点的意图的指示的动作(动作2875)。例如,直接相邻节点2(2730)可接收指示加入节点要监视直接相邻节点2370的意图的指示2722。
方法2800包括该另一直接相邻节点向加入节点指示该另一节点要监视加入节点的意图的动作(动作2880)。例如,直接相邻节点2(2730)可向加入节点2710指示(例如,经由监视指示2794)该直接相邻节点要监视加入节点2710的意图。
在某些情况中,直接相邻节点2(2730)可另外地或另选地执行从第二所选直接相邻节点接收指示第二节点要终止与第一所选直接相邻节点的任何监视关系的意图的指示、向第二所选直接相邻节点指示第一节点要终止与第二所选直接相邻节点的任何监视关系的意图、以及接收确认第一节点的终止意图的确认的动作。该另一直接相邻节点还可确认来自第二所选直接相邻节点的指示。例如,直接相邻节点2(2730)可从直接相邻节点1(2720)接收指示节点1要终止与节点2的任何监视关系的意图的指示。节点2(2730)还可接收确认节点2的终止意图的确认(状态图3000中的3036)。节点2(2730)还可确认来自节点1的指示(2720)。
方法2800包括加入节点从该另一直接相邻节点接收指示该另一直接相邻节点要监视加入节点的意图的指示的动作(动作2885)。例如,加入节点2710可从直接相邻节点2(2730)接收指示该另一直接相邻节点要监视加入节点2710的意图的监视指示2794。在某些实施例中,诸如在状态图3000中,加入节点从另一直接相邻节点接收指示该另一直接相邻节点要监视加入节点的意图的指示的动作包括接收对建立请求的第四建立授权(例如,步骤8中的3039)的动作,该第四建立授权指示另一相邻节点3015监视加入节点3005。
此外,加入节点2710可从环上节点的至少一个(例如,直接相邻节点1(2720))接收否定确认(NAK)消息,其中NAK消息包括NAK发送者的环视图的指示。使用NAK发送者的邻域视图,加入节点2710可以基于NAK发送者的环视图来更新其邻域视图。
图29示出了用于在离开节点离开节点环时维护环一致性的方法2900的流程图。方法2900现在将频繁地参考环境2700的组件和数据以及图31的状态图3100来描述。
方法2900包括第一所选直接相邻节点接收离开节点离开节点环的动作的指示的动作(动作2910)。例如,直接相邻节点3(3110)可从环上的任一节点(例如,从离开节点4(3105))接收指示离开节点3105离开节点环的动作的指示。在某些情况下,在接收到指示时,离开节点3105可能已经离开了节点环。或者,离开节点3105可能正在离开的过程中或正在计划离开节点环。在某些实施例中,第一所选直接相邻节点3110接收离开节点3105正在离开节点环的指示的动作包括第一所选直接相邻节点3110从离开节点3105接收离开消息3121(状态图3100中的步骤1),该离开消息可包括所指示的为离开节点3105所拥有的节点标识符的所有权范围。在其他实施例中,直接相邻节点3110可从节点环之外的节点,诸如从低层总线和/或网络接收指示(例如,离开指示3121)。
方法2900包括第一所选直接相邻节点向第二所选直接相邻节点发送指示要承担离开节点对离开节点和第一所选直接相邻节点之间的id空间的一部分的id空间所有权的意图的指示的动作(动作2920)。例如,直接相邻节点3(3110)可向直接相邻节点5(3115)发送指示要承担离开节点对离开节点3105和直接相邻节点3110之间的id空间的一部分的id空间所有权的意图的指示(例如,建立和TTL 3122)。
方法2900包括第一所选直接相邻节点向第二所选直接相邻节点发送指示第一所选直接相邻节点和第二所选直接相邻节点之间的至少单向监视关系的建立的指示的动作(动作2925)。例如,直接相邻节点3(3110)可向直接相邻节点5(3115)发送指示直接相邻节点3(3110)和直接相邻节点5(3115)之间的至少单向监视关系的建立的指示(例如,建立和TTL 3122)。
在某些实施例中,诸如在状态图3100中,第一所选直接相邻节点向第二所选直接相邻节点发送指示要承担离开节点对离开节点和第一所选直接相邻节点之间的id空间的一部分的id空间所有权的意图的指示的动作包括第一所选直接相邻节点3110向第二所选直接相邻节点3115发送建立第一所选直接相邻节点3110和第二所选直接相邻节点3115之间的所有权范围的第一建立请求3122的动作(例如,在状态图3100的步骤2中),该第一建立请求包括第一生存时间持续时间3122,该第一生存时间持续时间指示第一所选直接相邻节点3110能将与第二所选直接相邻节点3115的监视关系认为是活动的持续时间;以及第一相邻节点3110接收对第一建立请求3122的第一建立授权3123的动作(例如,在状态图3100的步骤3中),该第一建立授权3123指示第二相邻节点3115监视第一所选直接相邻节点3110。
方法2900包括第一所选直接相邻节点从第二所选直接相邻节点接收指示接受第一节点要承担对离开节点之间的id空间的一部分的id空间所有权的意图的指示的动作(动作2930)。例如,直接相邻节点3(3110)可从直接相邻节点5(3115)接收指示接受直接相邻节点5要承担对离开节点3105和第一所选直接相邻节点之间的id空间的一部分的id空间所有权的意图的指示(例如,建立和TTL 3124)。
方法2900包括第一所选直接相邻节点从第二所选直接相邻节点接收指示第二所选直接相邻节点和第一所选直接相邻节点之间的单向监视关系的建立的指示的动作(动作2935)。例如,直接相邻节点3110指示直接相邻节点3115和直接相邻节点3110之间的单向监视关系的建立。
在某些实施例中,诸如在状态图3100中,其中第一所选直接相邻节点从第二所选直接相邻节点接收指示接受第一节点要承担对离开节点和第一所选直接相邻节点之间的id空间的一部分的id空间所有权的意图、并指示第二所选直接相邻节点和第一所选直接相邻节点之间的单向监视关系的建立的指示的动作包括第一相邻节点3110从第二相邻节点3115接收建立第一相邻节点3110和第二相邻节点3115之间的所有权范围的第二建立请求(例如,在状态图3100的步骤2中)的动作,该第二建立请求包括第二生存时间持续时间之内3124,该第二生存时间持续时间指示第二相邻节点3115能将与第一相邻节点3110的监视关系认为是活动的持续时间;以及第一相邻节点3110发送对第二建立请求的第二建立授权3123(例如,在状态图3100的步骤3中)的动作,该第二建立授权指示第一相邻节点3110监视第二相邻节点3115。
数据一致性
图32示出了其中可利用本发明的原理的环体系结构3200。环体系结构3200包括节点环3205。在某些实施例中,节点环3205可类似于如上所述的图23C中的环2350和/或图27中的环2705或与其相同。用于维护数据一致性的方法在下文参考图32的节点和数据项来更详细地描述。
图33示出了用于在联盟基础结构内的副本集内执行数据访问事务的方法3300的流程图。方法3300现在将频繁地参考环境3200的组件和数据来描述。
在某些实施例中,方法3300包括从节点的副本集中的多个节点之中选择一主节点的动作(动作3310)。例如,主节点3211可选自节点的副本集3210中的多个节点。为帮助维护数据一致性,可创建副本集以复制或重复数据的一个或多个部分。由此,当节点离开环(或者由于故障或者通过平滑离开)时,其他节点还将包含离开节点所持有的信息。在某些情况下,副本集中的每一节点可包括:1)副本集的身份,2)配置序列号(CSN),3)副本集的成员资格以及主节点是谁,4)最后使用的序列号(LSN),以及5)存储在副本集中的数据。1-3中表示的状态信息可被称为副本集的“配置状态”,而4-5中表示的状态信息可被称为副本集中“存储的数据”。
应当注意,以上提供的关于路由一致性和环一致性的原理、描述和解释适用于领导者选择(即,选择主节点)。例如,维护环内的id空间所有权的原理可应用于此处讨论的主和副节点。一般而言,主和副节点的特性与在以上各节中描述的任何或所有其他节点相一致。
在某些实施例中,副本集3210可用担当其主节点(主节点3211)的单个节点来创建。主节点3211可将其LSN和CSN初始化为0并初始化副本成员资格,该成员资格仅包括其自身作为成员。副本集3210然后可通过使用各种重配置算法向该副本集添加节点来扩展为所需大小,如将在以下更详细描述的。在某些情况下,副本集中不是主节点的任一节点被称为副节点。可递增LSN以创建写和重配置操作中的全序。CSN可指向副本集中的最后一次配置改变。由此,在这一情况中,CSN共享LSN序列。LSN序列中的间隙通常指示数据丢失,且应被避免。
方法3300包括确定已从节点的副本集中的多个节点之中选择了主节点的动作,该主节点被配置成接受和处理客户机数据访问请求,该副本集包括所选主节点和一个或多个副节点(动作3320)。例如,主节点3211可确定它已从节点的副本集3210中的多个节点之中选出,其中主节点3211被配置成接受和处理客户机数据访问请求3215,并且其中副本集3210包括主节点3211和副节点3212。
在某些情况下,可能期望增加多个副节点以增大容错(即,更多副节点存储相同的数据)。要添加的副节点的数量可基于最大可容许同时故障数量来确定。由此,如果最大可容许同时故障数量是例如3,则期望至少有4个副节点,使得即使在三个其他节点发生故障之后至少一个节点仍是该副本集的一部分。在某些情况下,要成为副本集的成员的副节点的数量对应于主节点的邻域中的成员的数量。
在某些情况下,该最大可容许同时故障数量可以与副节点阈值数量相关。这一阈值数量的副节点可被称为选出成员(quorum)。当数据访问请求3215是数据写请求时,阈值数量的副节点可被称为写选出成员。类似地,当数据访问请求3215是数据读请求时,阈值数量的副节点可被称为读选出成员。由此,读和写选出成员可表示为给定数量的可容许同时故障提供完整的容错所必需的最小阈值数量的节点。
方法3300包括主节点接收一个或多个客户机数据访问请求的动作,每一数据访问请求指示要在副本集中的至少一个副节点上访问的数据的至少一部分(动作3330)。例如,主节点3211可从客户机3250接收客户机数据访问请求3215,其中请求3215指示要在副本集3210中的副节点3212上访问的数据的至少一部分。数据访问请求3215可以例如包括要被写入副本集中的至少一个节点的文件。另外地或另选地,数据访问请求3215可包括要从副本集中的至少一个节点读取和检索的文件的名称。主节点3211管理传入数据请求,并向副节点3212发送包括对应于副本集的配置状态信息的适当信息。该数据部分还可包括关于副本集本身的一组控制信息,包括节点的数据序列号(DSN)、LSN、CSN、主节点身份或副节点身份。
方法3300包括主节点以接收到客户机数据访问请求的顺序向改变状态的每一客户机数据访问请求分配数据序列号(DSN),该数据序列号包括副本集中的每一节点要遵循的线性化处理顺序(动作3340)。例如,主节点3211可按照接收到请求的顺序向改变状态的每一客户机数据访问请求3215分配DSN。该DSN可包括副本集3210中的每一节点要遵循的线性化处理顺序。在某些情况下,该线性化处理顺序可被称为操作序列3501,如图35所示。在请求不改变状态的情况下,主节点3211可省略向客户机数据访问请求分配数据序列号。
根据数据序列号(DSN 3505),操作序列3501可包括以接收的顺序排列的多个操作。例如,主节点3211可分配OP1来表示第一操作,分配OP2来表示第二操作,并如OPn所表示地沿着该线向下。OPn+1可表示最后使用的序列号(LSN3515)。如上所述,可递增LSN 3515以创建写和重配置操作中的全序。CSN 3510可指向副本集3210中的最后一次配置改变。在某些情况下,CSN3510可共享LSN序列。LSN序列中的间隙通常指示未遵循操作序列3501,这通常会导致数据丢失。
方法3300包括主节点向至少一个副节点发送包括任何对应的数据序列号的至少一个客户机数据访问请求的动作(动作3350)。例如,主节点3211可向副节点3212发送包括任何分配的DSN 3216的客户机数据访问请求3215。在某些情况下,客户机数据访问请求可被发送到诸如写选出成员或读选出成员等选出成员。选出成员可用预期信息来响应,并另外地用主节点不知道的其他数据访问请求的指示来响应。例如,在主节点3211被选出之前副节点可能已处理了其他事务,或者可能已经被分配了主节点不知道的某些事务。由此,该信息可被发送到主节点3211,其可用于更新主节点的操作序列3501。在某些情况下,该过程仅在副本集重配置期间发生,如将在下文中更详细解释的。
方法3300包括主节点从至少阈值数量的副节点接收指示客户机数据访问请求的接收的确认的动作(动作3360)。例如,主节点3211可从阈值数量的副节点(例如,读或写选出成员)接收确认客户机数据访问请求3215的接收的确认消息3220。确认3220还可指示发送消息的副节点已将客户机数据访问请求3215***到其数据访问队列(即,操作序列3501)中。在某些情况下,主节点3211可从副本集中的所有节点或从其选出成员接收确认消息。确认可以另外地或另选地指示客户机数据访问请求的接受或拒绝。
方法3300包括主节点提交数据访问请求的动作,该提交包括根据客户机数据访问请求来访问数据(动作3370)。例如,主节点3211可在单个阶段中提交数据访问请求3215,其中提交包括根据客户机数据访问请求3215来访问数据。由此,在数据访问请求是写访问的情况下,主节点3211可在单个阶段中提交写请求。在单个阶段中提交可以在不与每一副节点发送和接收提交查询的情况下完成。在单个阶段中提交可被称为未分块(non-blocking)事务。如上所述,由于副本集中的故障检测是完美的,因此主节点不需要从每一副节点发送和接收提交查询。
在某些实施例中,主节点3211可向第二副本集发送客户机数据访问请求3215。第二副本集可以在与主节点的邻域不同的邻域中。在某些情况下,主节点的邻域包括与副本集中的节点相同的节点。主节点3211可请求副本集3210处理客户机数据访问请求3215的第一部分,并请求第二副本处理数据访问请求的第二不同部分。然而,这些实施例将使用二阶段提交过程。例如,该过程可包括从副本集3210接收对应于客户机数据访问请求3215的第一部分的回复。该过程还可包括从第二副本集接收对应于数据访问请求的第二不同部分的回复。回复可被组合,且基于所组合的回复,可生成最新的数据访问响应。
在一示例性实施例中,主节点3211可如下响应客户机数据写请求:1)主节点3211对照应用程序一致性约束来确认请求。如果主节点3211确认违反,则它用应用程序一致性违反的失败状态来响应于客户机3250,并跳至以下步骤(7)。2)主节点3211向写操作分配可通过原子地递增主节点的LSN而获得的序列号。在该示例中,与给定写操作相关联的序列号被称为其DSN。3)主节点3211将DSN、CSN和要写入的数据传送到所有副节点,并等待副节点的写选出成员响应(一种变型方法可以是主节点仅将要写入的数据发送到写选出成员)。
4)在听到来自副节点的写选出成员的确认之后,主节点3211本地地执行写操作,并且这是考虑提交写操作的点。主节点3211回过来用成功状态向客户机响应,并跳至以下步骤(7)。5)如果主节点3211无法从副节点的写选出成员得到确认,则它启动重配置操作以消除失败的副节点。6)如果主节点3211无法本地地执行写操作,则它启动重配置操作以转换到新的主节点,将其自身从副本集3210中移除,并跳至步骤(7)。7)主节点3211等待下一传入客户机数据访问请求。应当注意,如上所述,其他实施例是可能的,并且可包括更多或更少的步骤。
在一示例性实施例中,一个或多个副节点3212可按照以下方式来处理数据写请求:1)副节点将传入写操作中指定的CSN与其CSN进行比较。如果指定的CSN小于其CSN,则副节点忽略该请求并跳至以下步骤(4)。副节点3212断言所制定的CSN不能大于其CSN是因为这一条件暗示重配置是用不完美的故障检测器来完成的。2)副节点3212将传入写数据请求的DSN与其LSN进行比较。如果该DSN小于其(LSN+1),则副节点3212忽略该写数据请求。如果该DSN大于其(LSN+1),则副节点3212缓存该数据写请求并跳至以下步骤(4)。否则,副节点3212原子地递增其LSN并接受数据写请求,且发回确认3220。如果副节点3212由于本地故障而无法接受该请求,则它请求主节点启动重配置以将其作为副节点从副本集中移除。3)副节点3212检查当前缓存的操作并处理它们,直到其检查了它们中的每一个,从而接受其DSN在此处描述的副节点的LSN值的范围内的任何请求,由此保存了主节点建立的全序。4)副节点3212等待来自主节点3211的下一数据访问请求。处理动作可包括将相关数据写入稳定存储设施中。
在数据库设置中,用于执行写事务的一种示例性方法如下:1)对于在“提交”之前的包括“中止”之内的操作,主节点3211只需本地地执行操作并跳至以下步骤(6)。2)对于“提交”,主节点3211通过本地地准备事务来确定事务顺序。该步骤还对照数据库一致性约束来确认事务。如果本地准备失败,则它用失败状态回过头向客户机3250响应,并跳至以下步骤(6)。3)如在前一示例中的步骤(2)-(3)中所指定地,主节点3211将带有“提交”请求的事务转发给副节点3212。4)在主节点3211从副节点的写选出成员得到确认之后,它本地地提交事务并向客户机3235报告成功。5)如果主节点3211无法从副节点的写选出成员得到确认,则它中止本地地准备的事务并启动重配置操作以消除失败的副节点。6)主节点3211等待下一传入客户机数据访问请求3215。
图34示出了用于建立和维护联盟基础结构内的一致副本集的方法3400的流程图。方法3400现在将频繁地参考环境3200的组件和数据来描述。
方法3400包括从节点环中的多个节点之中建立副本集的动作,该副本集包括主节点和一个或多个副节点作为成员(动作3410)。例如,副本集3210可从节点3211、3212和节点环3205上的其他节点之中建立。副本集3210可包括主节点3211和副节点3212作为成员。在某些情况下,副本集3210的边界可以与主节点的、副节点也是其成员的邻域相同。
方法3400还包括接收指示影响副本集成员的至少一个的副本集配置事件发生的的指示(动作3420)。例如,副本集3210中的节点3211和3212中的任一个可接收影响主节点3211和副节点3212的至少一个的副本集配置事件发生的指示。副本集配置事件可包括副本集内的节点故障、节点离开副本集或节点加入副本集。将导致重配置的影响副本集的节点的其他事件也是可能的。在某些情况下,这一配置事件可在客户机数据访问请求期间发生。
方法3400包括基于所接收到的指示确定副本集要被重配置的动作,基于副本集配置事件的发生,该重配置包括从副本集中移除现有副节点、向副本集添加新的副节点、突然转换到新的主节点以及平滑地转换到新的主节点中的至少一个(动作3430)。例如,基于所接收到的指示,副本集3210中的节点之一可确定副本集3210要被重配置。取决于发生了哪一配置事件,重配置可包括从副本集中移除现有副节点、向副本集添加新的副节点、突然转换到新的主节点或平滑地转换到新的主节点。
用于重配置副本集以及转换到新的主节点的示例方法和算法包括在下文中。副本集重配置的示例一般覆盖四种情况,包括1)突然转换到新的主节点,2)平滑地转换到新的主节点,3)移除副节点,以及4)添加副节点。这四个一般的示例中的每一个可独立地发生,并且至少在某些实施例中,不涉及现有主节点的更换。
方法3400包括根据对应于副本集配置事件的重配置来重配置副本集的动作(动作3440)。例如,副本集3210可根据对应于副本集配置事件的重配置来重配置。由此,在副本集配置事件是节点故障的情况下,副本集3210可通过添加副节点、移除副节点或转换到新的主节点来重配置。类似地,当副本集配置事件是节点加入时,副本集3210可根据以上方法的任一种来重配置。在某些情况下,特定重配置方法可对应于特定重配置事件。该对应性可由用户来配置或者可以是自动的。
在某些情况下,主节点3211可基于配置状态信息来检测正在进行中的一个或多个副本集重配置。如上所述,在重配置过程期间,可对副本集选择新的主节点。根据上述实施例,环3205中的节点可以与该新的主节点通信以确保该新的主节点的信息相对于环上的其他节点是最新的。
在某些实施例中,可使用与以上参考图34所描述的副本集相似或相同的一致副本集来访问和存储数据。例如,副本集3210可被配置成维护一个或多个副本集节点上的数据存储的一部分(例如,在副节点3212上)。主节点3211可接收客户机数据访问请求3215。请求3215可包括要在节点的副本集3210内的至少一个节点上访问的信息的指示。主节点可或者直接处理该请求,或者将其传递给副节点。在主节点3211检测到它无法访问所接收到的客户机数据访问请求3215中所指示的信息的至少一部分的情况下,主节点3211可从副本集中移除其自身,使得防止存储在主节点3211上的信息响应于客户机数据访问请求而被访问。这消除了返回陈旧或过时信息的可能性,并确保响应于客户机数据访问请求3215返回的任何信息是最新的。
根据某些实施例,突然转换到新的主节点可按以下方式发生。当现有主节点发生故障时,使用可靠领导者选择算法按照上述方法选择一新的主节点。在接受任何客户机操作之前,该新的主节点可以执行以下配置改变来从副本集中移除旧的主节点:1)新的主节点检查以查看其是否知道副本集状态。如果新的主节点没有该知识,则它含蓄地确定副本集的所有成员都发生故障并跳至以下步骤(9)。2)新的主节点联系副本集的每一节点以确定其CSN和LSN,直到它在联系了所有现有副节点方面命中一固定点。使用在该步骤中收集的信息,新的主节点确定最早的CSN、最晚的CSN和最晚的LSN。注意,最早的CSN和最晚的CSN在某些(或大多数)情况下可以相同。当最早和最晚CSN不同时,指示在重配置操作的中间主节点发生故障。然后,具有大于最早CSN的CSN的任何副本当然具有最晚的数据。由此,在该步骤的最后,当最早CSN和最晚CSN不同时,新的主节点已经具有最晚的数据。否则,该新的主节点只有在最晚CSN之前写入的数据,并且步骤(3)中的检查确保它也具有在最晚CSN过去之后写入的数据。
3)如果最早CSN和最晚CSN相同且新的主节点无法联系副节点的读选出成员,则可能有数据丢失且新的主节点跳至以下步骤(9)。在某些情况下,读选出成员与其写选出成员相交是高度有利的(或甚至是必要的)。对于基于大小的选出成员,读选出成员是大于(n-w)的任何集合,其中n是在CSN中指定的副本节点的数量,而w是写选出成员。
4)新的主节点试图通过向副节点发送在以上步骤(2)中确定的其报告的LSN和最晚LSN之间的操作,使得在其配置中将副节点变为关于数据是最新的。最早CSN之后并直到最晚CSN的不完整的重配置操作可在该步骤中作为缩写的空重配置操作来发送。5)新的主节点在从具有最晚CSN的配置中移除了故障的主节点(例如,主节点3211)和副节点(例如,副节点3212)之后本地地构建新的副本配置,使最晚LSN成为其LSN,并向新的配置分配通过递增LSN获得的CSN。6)新的主节点将新的副本配置传送到所有副节点。
7)如果新的主节点响应于在以上步骤(6)中发送的重配置操作无法从所有副节点得到成功状态或听到来自任何副节点的失败状态,则新的主节点重新执行上述步骤(2)-(6)。8)在听到来自至少某些(或全部)副节点的成功状态之后,则新的主节点跳至以下步骤(10)。9)新的主节点采取执行诸如在数据中心响铃、发送寻呼消息等灾难恢复的步骤。在某些情况下,副本集只能使用手动干预来还原。10)新的主节点在此时继续进行客户机操作的处理。在以上步骤(2)中,当旧的主节点发生故障时,新的主节点可能发现正在被添加到副本集的过程中的新的副节点。该固定点是要捕捉新的主节点认为是新配置的一部分的陈旧的副节点集。如果消除同样处理新的副节点的突然主节点转换的优化,则可消除该固定点计算。
根据某些实施例,平滑地转换到新的主节点可按以下方式发生。从现有主节点转换到新的主节点与向副本集添加新的副节点(将在下文中解释)非常相似。注意,该新的主节点可以是或不是副本集中的当前副节点。在该示例中,潜在的新主节点遵循该算法来成为副本集的一部分:1)新的主节点联系副本集中的一个或多个现有副节点以向其传输数据,2)新的主节点同时联系现有主节点(例如,主节点3211)以向其转发新操作。
3)如果从新的主节点接收到的新操作的DSN大于从副节点接收到的数据,则其将新的主节点发送的新的写操作与从副节点接收到的数据进行合并。4)在新的主节点在以上步骤(1)中所联系的所有副节点都报告数据传输完成之后,该新的主节点联系现有主节点3211以启动配置改变来使得该新的主节点成为副本集的当前主节点。5)在从现有主节点接收到作为对在步骤(4)发送的重配置请求的响应的成功状态之后,新的主节点承担副本集的主节点的角色,并且6)直到步骤(5)中的重配置请求,新的主节点将它接收到的任何客户机操作转发给现有主节点。
根据某些实施例,移除副节点的过程可按以下方式发生。当完美的故障检测器(如上参考图14和19所述的)向环节点之一(例如,主节点3211)报告现有副节点3212发生故障时或当现有副节点联系其他节点之一(例如,主节点)以主动将其自身从副本集3210中移除时,节点之一(例如,主节点)可实行以下算法来从副本集中移除副节点。在该示例中,1)主节点阻断对传入客户机操作(例如,3215)的处理,并且或者缓存它们或者要求客户机(例如,3250)稍后重试,2)主节点通过从副本集成员资格中移除发生故障的副节点来本地地安装新的副本配置,并通过原子地递增其LSN来向新的配置分配CSN。在某些情况下,这意味着重配置操作采用与数据操作相同的序列流。3)主节点将新配置传送到所有副节点,以及4)在从至少某些(或全部)副节点听到成功状态之后,主节点继续进行客户机操作的处理。
在这一重配置过程中,被重配置的副节点可如下行动:1)副节点将重配置操作的CSN与其LSN进行比较。如果CSN小于(LSN+1),则副节点向主节点发送失败状态并跳至以下步骤(3)。如果CSN等于(LSN+1),则副节点原子地递增其LSN并接受重新配置操作,且发回成功状态。否则,副节点缓存重配置操作,并跳至以下步骤(3),2)副节点检查当前缓存的操作并处理它们,直到它检查了它们中的至少某些(或全部),以及3)副节点等待来自主节点的下一操作请求。
故障检测器的完美性确保旧的和新的重配置不同时存在。在某些实施例中,总体假设是存在能用于检测故障停止(fail-stop)故障的完美故障检测器。该句中对“完美”的使用捕捉了故障检测器从不报告一节点实例变为不可用,除非它(该节点的实例的存在)的确变得永久不可用的假设。如上所述,故障检测可以与上述环一致性和路由一致性特性的概念联合起来,并且可依赖于这些概念。由于旧和新重配置不同时存在,这意味着副本集状态不存在于副本集成员之外,因为副本集节点仅在其发生故障或主动移除自身之后才从副本集中移除。特性在标识副本集的所有成员都发生故障的条件时是有用的,因为新选出的主节点将意识到它在该条件下无需访问副本集状态。
在该示例中,由于主节点阻断对传入操作的处理直到重配置操作完成,因此其允许操作者忽略变得不可见的重配置操作。当启动重配置操作的主节点在重配置过程本身中发生故障并且发生故障的主节点曾经联系的副节点随后也发生故障时,重配置操作可变得不可见。该特性允许向在副本集的现有副节点中寻找单个CSN的新选出的主节点确保要么其找到的CSN实际上从观察整个***的谕示观点来看是最晚的CSN,要么在曾经变得不可见的稍后的重配置操作之后不启动任何数据操作。由此,新选出的主节点可安全地基于它在现有副节点中找到的最晚CSN来确定数据丢失,如在关于突然转换到新的主节点的示例中所解释的。
假定重配置操作可以采用与数据操作相同的序列,在重配置操作的最后,至少某些(或全部)副节点变为相对于数据是最新的(意味着它们都具有相同的LSN)。在存在写选出成员时,该特性使得新选出的主节点能够安全地基于它在现有副节点中找到的最晚CSN来确定数据丢失。
根据某些实施例,添加副节点的过程可按以下方式发生。在该示例中,新的副节点遵循以下算法来成为副本集的一部分:1)副节点联系副本集中的一个或多个现有副节点以向其传输数据,2)副节点同时联系主节点(例如,3211)以向其转发新操作,3)如果从主节点接受到的新操作的DSN大于从副节点接受到的数据,则副节点将主节点发送的新的写操作与从副节点接受到的数据进行合并,以及4)在其在以上步骤(1)中联系的至少某些(或全部)副节点报告数据传输完成之后,副节点联系主节点以启动配置改变来将其自身添加到副本集。
继续该示例,主节点所遵循的向副本集添加新的副节点的算法如下:1)响应于来自新的副节点的第一请求,主节点开始向即将的新的副节点转发新操作,尽管它还不是副本集的一部分,以及2)响应于来自新的副节点的后续重配置请求,主节点可使用实际上与上述在“移除副节点”示例中所述的相同的步骤来启动重配置操作,不同之处在于新配置添加新的副节点而非移除现有副节点。
图36示出了用于从联盟基础结构内的副本集访问数据的环境3600。环境3600包括数据访问***3610,其包括多个模块。一般而言,以下描述的每一模块都存在于环实现(例如,节点环3205)中,并且可被实现为跨构成邻域和/或副本集的节点、更一般地跨构成节点环排列的节点以及试图成为这一节点环排列中的活动节点的设备的分布式算法。该***包括被配置成建立环上的多个节点的邻域的邻域建立模块3620,该邻域至少包括直接相邻前导者节点和直接相邻后继者节点。节点环3205可包括加入节点3606,其可以正试图在直接相邻节点1(3608)和直接相邻节点2(3609)之间加入环。在某些实施例中,加入节点3606可按类似于图23C中所描述的方式加入节点环3605,其中加入节点基于节点2301和1362之间的高速缓存的协定来确定标识符范围。
该***还包括被配置成确定所建立的邻域外的加入节点指示了加入节点环中所建立的邻域的意图的意图确定模块3625。意图确定模块3625可以从邻域建立模块3620接收指示节点邻域的建立的邻域指示3621。该邻域可包括直接相邻节点1(3608)、加入节点3606和直接相邻节点2(3609)。意图确定模块3625可向一致性维护模块3630发送加入节点的加入意图3626。
一致性维护模块3630可被配置成维护所建立的邻域内的一致性,使得多个节点中的每一节点取得对该邻域中的id空间的一部分的id空间所有权。如上在标题“加入和离开节点环”中所述,邻域内的一致性可在加入节点3606加入节点环3605时维护。一致性维护模块3630可向选择确定模块3635发送一致性指示3631。应当注意,在某些实施例中,对于在环的id空间中的给定id处一致地维护的所有状态,存在为该状态单元形成的副本集,其主节点是在任何给定时刻拥有该id的环节点。当id空间所有权对于节点之间的给定id(一致地)转移时,存储在该拥有节点处(或由其控制)的任何服务状态单元的相应主度(primary-ness)也转移。在该实施例中,id空间所有权和主度以同时的方式来转移。
选择确定模块可被配置成确定多个节点中的一个节点已被选为主节点,该主节点具有对于被配置成如主节点所指示地响应客户机数据访问请求的节点副本集的责任。如上关于主节点选择所解释的,选择确定模块可确定已经对副本集(可包括所建立的邻域中的所有节点)选出了主节点,并向请求接收模块发送哪一节点被选为主节点的指示(3636)。如上所述,这一领导者选择可以遵循如本文早先定义的环一致性和路由一致性(包括至少部分地形成完美故障检测器机制的监视协定)的原理。
请求接收模块3640可被配置成从客户机3615接收一个或多个客户机数据访问请求,其中每一数据访问请求3641指示要在副本集中的至少一个节点上访问的数据的至少一部分。请求接收模块3640还可接收主节点指示3636。主节点指示3636和数据访问请求3641可以对数据访问模块3645组合3641A和3636A(或可以各自单独地发送(未示出))。数据访问模块3645可被配置成经由通信3607与节点环3605中的一个或多个节点通信,并访问在客户机数据访问请求3641中指示的数据。由此,整个***可被实例化,其中节点可加入和离开节点环3605,一致性可被维护,主节点被选出且数据被可靠地访问。该***中所描述的每一模块可以执行这些功能以及在以上各节中详细描述的对应于每一模块的其他功能。
在某些实施例中,要被访问的数据包括服务。例如,加入节点3606可提供客户机3615期望访问的服务。例如,服务可以是电子邮件应用程序。客户机3615可以指示要被访问的数据,并且数据访问***3610可被配置成访问该数据,而不论加入节点是否由于数据访问***所维护的环和数据一致性而离开该环。在其他情况下,所提供的服务可以是锁管理器、数据存储***、生产者-消费者队列或任何其他服务。在该***用于访问诸如数据库等数据的情况下,***3610可被配置成为副本集中的数据维护原子性、一致性、隔离和耐久性(ACID)特性的每一个。由此,提出了这样一种***,其可被配置成提供一致的、可靠的数据访问,而不论哪一节点实际包含数据、哪些节点正在加入或离开节点环、或是否有大量包含该数据的节点发生故障。
在某些情况下,服务所指示的操作可被划分成改变状态的操作和不改变状态的操作。在存储服务的情况下,改变状态的操作可被称为“写”,而不改变状态的操作可被称为“读”。在锁管理器服务的情况下,改变状态的操作被称为“获取”和“释放”,而不改变状态的操作被称为“查询”。在生产者-消费者队列(有时用于分布式计算)的情况下,改变状态的操作称为“入队”和“出队”,而不改变状态的操作称为“领取(peek)”。由此,在此处的某些实施例中,术语“写”捕捉了改变状态的任何操作,而术语“读”捕捉了不改变状态的任何操作。
在某些情况下,读操作由主节点3211本地地处理。如果在即将的主节点处由于客户机请求的状态不在那里存在而无法满足读,则该状态将(保证)不会存在于任一副节点处。在某些实施例中,写操作可通过主节点3211来排序。在这些情况下,主节点3211可以实际上不本地地写入客户机提供的状态,直到至少副节点的写选出成员确认了它们已经写入了这些状态本身。然后,主节点3211实际本地地写入(或尝试写入)该状态。在某些实施例中,重配置可以在副本集成员(主或副节点)不能写入所请求的状态的任何时刻发生。在这些情况下,节点可以通过从副本集中移除其自身来在副本集中启动重配置。此外,任何不响应的副节点将发生故障(由于完美故障检测器,这是有保证的),并且主节点将通过从副本集中移除该副节点来触发重配置。在某些情况下,这将不会导致主节点停止成为副本集的主节点。
数据访问***3610可被配置成根据客户机数据写请求来写入数据。由此,在数据访问请求3641(或数据访问请求3215)是或包括写请求的情况下,主节点3211可指示副节点3212将客户机数据写请求中指示的数据写入副节点中的数据存储中。在某些情况下,主节点在两个阶段中将写请求复制到一个或多个副节点3212。该变型的优点在于如果写选出成员是由副本集3210中的所有副节点组成,则其允许读操作由副节点来服务。在某些情况下,在副节点处接受写操作,且主节点可以触发附加逻辑,如将数据个别地写入每一节点可用的稳定存储。
数据访问***3610可被配置成根据客户机数据读请求来读取数据。由此,在数据访问请求3641(或数据访问请求3215)是或包括读请求的情况下,主节点3211或副节点3212可被配置成直接处理读请求。在某些情况下,主节点3211不必号召副节点来读取请求中指示的数据。在其他情况下,副节点能够自主地读取数据并响应客户机数据读请求。
本发明可具体化为其它具体形式而不背离其精神或本质特征。所述实施例在所有方面都应被认为仅是说明性而非限制性的。从而,本发明的范围由所附权利要求书而非前述描述指示。落入权利要求书的等效方式的含义和范围内的所有改变应被权利要求书的范围涵盖。