分布式锁的制作方法

文档序号:7630044阅读:97来源:国知局
专利名称:分布式锁的制作方法
技术领域
本发明涉及并发控制通信实体对计算机资源的共享访问,更具体地说,涉及有效、鲁棒的分布式租用锁。
背景技术
随着电子通信系统的初步发展和快速成熟,包括内部集成在计算机系统内的通信媒质和系统以及与离散计算机系统互连的通信媒质和系统,已经开发了各种分布式应用级和系统软件,以提供计算机系统内部以及互连处理器和互连计算机系统之间分布的进程在空间和时间上并发、同时和并行执行。此外,互连的处理实体,诸如逻辑电路、固件或逻辑电路与固件的组合所控制的硬件系统,还可以协作的方式并行运行。
在分布式系统中,多个进程和/或处理实体可共享经由通信系统(诸如计算机网络)访问的各种设备和计算资源。为了使分布式系统正确运转,需要控制多个进程和/或处理实体对设备和计算资源的并发和同时争用,以便防止导致定时相关性和非确定性行为的不受控制、并发或同时访问设备和计算系统。这种定时相关性可导致许多不同的反常状况,包括数据破坏、进程损毁、系统死锁和进程饥饿。已经开发了许多用于通过互通信进程实现分布式资源共享的不同技术。然而,当前可用的技术具有对通信消息传送和接收的定时相关性,并因此容易受到通信传送延迟、进程不稳定性和实际分布式系统中出现的其它问题的异常行为的破坏。此外,许多分布式资源共享协议包括消息交换无效,这要求大量的消息业务调整对设备和计算资源的共享访问。因此,分布式系统的制造商、厂商和用户继续寻求可靠、鲁棒和有效的分布式资源共享方法。

发明内容
本发明的各种实施例针对使多个通信实体可以共享访问计算资源的分布式锁和分布式锁定协议。本发明的某些实施例采用由通信实体实现的数据存储寄存器。


图1示出了分布式计算系统的示例。
图2-3示出分布式计算机系统中遇到的一种简单的并发问题。
图4-7示出了锁定的概念。
图8-10示出了出现在分布式系统中的许多问题的其中一种,这些系统自然地采用分布式锁,以便通过使在分布式处理实体上运行的进程相互通信来连续访问资源。
图11-17使用图4-10中所用的图示约定示出了存储寄存器的基本操作。
图18示出了实现分布式存储寄存器的进程或处理实体Pi以及多个其它的进程和/或处理实体Pj≠i使用的部件。
图19示出了通过仲裁确定分布式存储寄存器当前值。
图20示出图18图解示出的处理例程和操作例程的伪代码实现。
图21示出了基于表示本发明一个实施例的分布式存储寄存器的分布式锁定协议。
图22示出了表示本发明一个实施例的例程“租用资源”实现的简单分布式锁定协议。
图23示出了表示本发明备选实施例的例程“租用资源”的备选的、更复杂的实现。
具体实施例方式
本发明的实施例针对分布式锁定协议。分布式锁定协议用在分布式系统的实现中,包括分布式应用和分布式系统软件。分布式锁定协议还可用在简单计算机系统内,在该计算机系统中进程和处理实体经由基于消息的事务处理并发地或同时地访问共享资源,包括在总线上传送的包或共享的存储消息。
图1示出了分布式计算系统的示例。分布式计算系统包括五个不同的计算机系统102-106,其中两个具有大的本地海量存储设备107和108、盘阵列110以及高端路由节点112,该高端路由节点将处理实体、盘阵列与附加的远程计算机系统、海量存储设备和其它电子设备互连。在诸如图1所示系统的网络分布式系统中,通过一个或多个计算机网络114在进程和/或处理实体、盘阵列和路由器节点之间交换数据。出于此目的采用许多不同类型的计算机网络,包括高端光纤信道互连、以太网互连以及许多其它类型采用各种不同协议和配置并根据各种不同消息传送方法(包括类似总线的传送、类似环形的传送、点对点传送及其它方法)操作的连网系统和媒质。在分布式系统,诸如图1所示的分布式系统中,同时或并发运行在不同计算机系统上的进程可以共享一个或多个资源。例如,在计算机系统102和计算机系统103上运行的进程可访问计算机系统103的海量存储设备107。作为另一个例子,在所有计算机系统上运行的进程可共享由盘阵列110提供的特定存储量。要注意的是,诸如计算机系统102的计算机系统,可包括一个到大量的单独计算机处理器,并可支持数千个进程的并行执行,以及数十到数百个进程的同时执行。数据资源仅是共享资源的一个例子。还可共享许多其它类型的资源。例如,在分布式操作系统中,处理实体内的处理器可由分布式操作系统内的逻辑处理域共享。可在处理实体之间共享数据输入和输出设备,可由多个进程共享通信设备,并可在分布式进程之间共享许多其它类型的设备(物理设备或逻辑设备),以及主动访问和共享其它类型的设备。
分布式进程对分布式资源的共享涉及管理许多不同类型的并发问题。图2-3示出了在分布式计算机系统中遇到的一种简单类型的并发问题。在图2的上部示出了一部分数据存储资源的表示202。数据存储资源数据块(诸如数据块204)逻辑上顺序地排列在数据存储设备中。图2中表示的一部分数据资源包括13个数据块,顺序地编址为数据块73-85。在一个处理实体上运行的第一进程需将三个连续的数据块值(在图2中由符号“A”、“B”和“C”表示)206存储在数据存储资源的块78、79和80中。第二进程需将三个不同的数据块值(在图2中由符号“X”、“Y”和“Z”表示)208存储在数据存储资源的相同的三个连续数据块78-80中。在该示例中,第一进程和第二进程都争用数据资源的数据块78-80。这个争用的两个可能结果中的任一个都是有效和可接受的。一个结果210是,第一进程将数据块值“A”、“B”和“C”写入数据资源的数据块78-80。这可能在如下任一种情况下发生第二进程无法将数据块值“X”、“Y”和“Z”写入数据存储资源,或者第二进程成功地将这些数据块值写入数据存储资源,但然后第一进程用数据块值“A”、“B”和“C”重写这些数据块值。类似地,第二个有效且可接受的结果212是,第二进程成功地将数据块值“X”、“Y”和“Z”写入数据存储资源的数据块78-80。
然而,存在许多第一进程和第二进程争用访问数据存储资源的无效和不可接受的结果,包括结果214,在该结果中,第二进程设法将数据块值“X”和“Y”写入数据存储资源的块78-79,并且第一进程已经成功地将值“C”写入数据存储资源的数据块80。图2中无效和不可接受的结果214仅是可能由进程争用共享数据存储资源所产生的许多不同的无效和不可接受结果中的一个示例。
图3示出了可能导致图2中无效和不可接受的结果214的一系列事件。首先,第一进程将数据块值“A”写入共享数据存储资源的块78(302)。然后,在第二“写”操作中,第一进程将数据块值“B”写入共享数据存储资源的块79(304)。接下来,第二进程用数据块值“X”重写数据块78(306)。然后,第二进程用数据块值“Y”重写数据块79(308)。然后,第二进程将数据块值“Z”写入数据块80(310)。最后,第一进程用数据块值“C”重写数据块80(312)。
图2-3中所示的问题是数据库管理系统和共享文件系统中出现的普遍问题。数据块78-80可看作存储大的数据记录,该数据记录的不同部分包含对数据记录其它部分或存储在该文件中别处的其它数据的引用。如果用不一致的数据重写该大数据记录的一部分,则总体上该数据记录变得不一致,并可导致随后访问操作的级联数据误差,在更坏的情况下,还可导致数据库或文件系统的破坏以及访问数据的进程的损毁。
为了防止资源争用的各种类型无效和不可接受的结果,诸如图2-3中所示的破坏的数据块例子,已采用了许多技术。一种技术涉及,在进程访问资源之前该进程锁定该资源。图4-7示出了锁定的概念。为了简洁起见,图4-7中的所有图以及随后的图都采用仅对图4描述的相同的图示约定。图4示出了五个计算机系统402-406,它们通过通信网络408彼此互连,并与共享资源R410互连,该共享资源由运行在计算机系统上的进程访问。为了锁定资源,在第二处理实体上运行的进程P2将消息412传送到其它进程,以指示进程P2想锁定资源R以便访问。一旦进程P2确定成功发送了消息412,则进程P2就认为资源R410被锁定,以便由进程P2专门访问,在图5中由绕资源R的虚线圆502指示。一旦进程P2完成了对资源R的访问,则进程P2就将解锁消息602发送到其它进程,如图6中所示。如图7中所示,一旦进程P2确定已成功传送了解锁消息,则进程P2就认为资源R上的锁被移除了。
不幸地是,资源的分布式锁定充满了许多潜在的问题。图8-10示出了在分布式系统中出现的许多问题中的一个,在该系统中自然地(naively)采用分布式锁,以便通过使在分布式处理实体上运行的进程相互通信的方式来串行化对资源的访问。在图8中,进程P2802选择访问资源R 804,首先通过网络将锁定消息806发送到在其它计算机系统上运行的其它进程。然而,也访问资源R的进程P4808当前出现故障。如图9中所示,一旦进程P2确定已成功传送了锁定消息,则进程P2就认为资源R被锁定902。此时,进程P4808重新开始运行,并决定访问资源R。由于在进程P2802发送锁定消息时进程P4出现故障,因此进程P4不知道进程P2将资源R看作是锁定的。因此,进程P4向其它计算机系统上运行的其它进程发送锁定消息904。如图10中所示,在进程P4确定已成功传送了锁定消息时,虽然事实上进程P2认为资源R由进程P2锁定902,但进程P4仍认为资源R由进程P4锁定1002。然后,进程P2和P4都并发地争用资源R,这潜在地引起了问题,诸如图3中所示的问题。
存在许多对以上在图8-10中所示问题的自然、潜在的解决方案。例如,当进程P2接收到来自进程P4的锁定消息时,进程P2可向进程P4发送报警消息,通知进程P4进程P2将资源R看作是锁定的。然而,该消息可能丢失或延迟,这使进程P2和P4可能并发地争用资源R。另一个解决方案可以是将处理实体与资源R相关联,并使关联的处理实体可代表资源R来管理锁,单线程处理所有的锁定请求,以便防止对资源R的并发争用。然而,可能是这种情况进程P2相继获取资源R上的锁,并然后损毁。资源R然后保持锁定,同时该资源是未使用的,即使在进程P2不运行的情况下,也阻止其它进程访问资源R。更坏的是,显然对于在先前的实现中进程P2已经锁定了资源R这一事实而言,进程P2可以重新启动,并因此其自身不能访问资源R。处理该问题的一个尝试可以是,将定时器和处理实体(其与资源R相关联)中的锁相关联,以使该锁在指定的时间段之后自动到期。然而,当锁到期时,需要通知保存该锁的进程该锁到期,以防止该进程和随后获取资源上的锁的进程一起并发地访问该资源。然而,该通知消息可能延迟或丢失。为了处理这种问题,与资源R相关联的处理实体可将定时的授权码和锁一起返回,并监控资源的访问,以确保只有授权的进程可访问该资源。然而,当与资源R相关联的处理实体尝试代表并发争用的远程进程来锁定或释放资源R时,该处理实体自身可能损毁,授权消息可能丢失或延迟,或者该处理实体自身内部可能受到并发争用问题的损害。可证明正确的分布式锁定协议是可用的,但这些协议一般容易受到进程损毁的破坏,并具有某些严格的定时相关性,这些协议的不当破坏可能导致分布式锁无法防止多个进程并发访问的干扰,或者死锁。
本发明的实施例采用与资源相关联的分布式存储寄存器,以便实现资源的分布式锁。图11-17使用图4-10中采用的图示约定示出了存储寄存器的基本操作。如图11中所示,分布式存储寄存器1102最好是抽象或虚拟的寄存器,而不是在一个特定电子设备的硬件中实现的物理寄存器。在处理器或计算机系统1104-1108上运行的每个进程采用存储在动态存储器的和可选地备份在非易失性存储器中的少量值,以及少量分布式存储寄存器相关例程,以共同实现分布式存储寄存器1102。至少,一组存储值和例程与访问分布式存储寄存器的每个处理实体相关联。在一些实现中,在物理处理器或多处理器系统上运行的每个进程可管理其自身的存储值和例程,并且在其它实现中,在特定处理器或多处理器系统上运行的进程可共享该存储值和例程,假设局部地调整该共享以防止在处理器上运行的多个进程并发访问的问题。
在图11中,每个计算机系统都保存分布式存储寄存器的局部值1110-1114。一般而言,不同计算机系统存储的局部值一般是相同的,并且等于分布式存储寄存器1102的值。然而,有时局部值可能不都相同,如图11中所示的示例,在此情况下,如果大多数计算机系统当前保存单个局部存储的值,则分布式存储寄存器的值是多数保存的值。
在表示本发明一个实施例的图11中所示的示例中,在五个计算机系统1104-1108上运行的进程将分布式存储寄存器1102用作分布式锁,以串行化对远程资源1110R的访问。基于分布式存储寄存器的分布式锁可用于控制远程进程对单个资源或资源集合的并发访问,该资源集合本身可能分布在多个互通信的电子设备上。
分布式存储寄存器将两个基本高级功能提供给共同实现该分布式存储寄存器的多个互通信进程。如图12中所示,一个进程可将“读”请求1202送往分布式存储寄存器1102。如果该分布式存储寄存器当前保存有效值,如图13中分布式存储寄存器1102内的值“B”所示,则将当前的有效值1302返回到请求进程,如图13中所示。然而,如图14中所示,如果分布式存储寄存器1102当前不包含有效值,则将值NIL 1402返回到请求进程。值NIL是不能作为在分布式存储寄存器内存储的有效值的值。
进程还可将一个值写入分布式存储寄存器。在图15中,一个进程将“写”消息1502送往分布式存储寄存器1102,该“写”消息1502包括要写入分布式存储寄存器1102的新值“X”。如果传送到分布式存储寄存器的值成功重写了该分布式存储寄存器中当前存储的任何值,如图16中所示,则布尔值“真”1602被返回到将“写”请求迭往分布式存储寄存器的进程。否则,如图17中所示,该“写”请求失败,并且布尔值“假”1702被返回到将该“写”请求送往分布式存储寄存器的进程,分布式存储寄存器中存储的值没被该“写”请求改变。在某些实现中,分布式存储寄存器返回二进制值“OK”和“NOK”,其相当于布尔值“真”和“假”。
图18示出了进程或处理实体Pi所用的部件,该进程或处理实体与多个其它进程和/或处理实体Pj≠i一起实现分布式存储寄存器。处理器或处理实体使用三个低级原语定时器机构1802、唯一ID 1804和时钟1806。处理器或处理实体Pi使用本地定时器机构1802,该本地定时器机构1802使Pi可以设置指定时段的定时器,然后等待该定时器到期,其中在定时器到期时通知Pi以便继续某操作。一个进程可以设置定时器并继续执行,检查或轮询定时器的到期,或者进程可以设置定时器、暂停执行、并在定时器到期时被再次唤醒。在任一情况下,定时器使进程可以在逻辑上暂停操作,并随后在指定的时段之后重新开始操作,或在指定时段内执行某操作,直到定时器到期为止。进程或处理实体Pi还需具有可靠存储和可靠检索的局部进程ID(“PID”)1804。每个处理器或处理实体都需具有一个局部PID,该局部PID相对于共同实现分布式存储寄存器的所有其它进程和/或处理实体是唯一的。最后,处理器或处理实体Pi需要具有实时时钟1806,该时钟大致与某绝对时间一致。共同实现分布式存储寄存器的所有进程和/或处理实体的实时时钟不必精确地同步,但需合理地反映绝对时间的一些共享概念。大多数计算机(包括个人计算机)都包含反映当前世界时间值的电池供电的系统时钟。对于大多数目的,包括分布式存储寄存器的实现,这些系统时钟不必精确地同步,但只需近似地反映当前世界时间。
每个处理器或处理实体Pi都包括易失性存储器1808,在某些实施例中包括非易失性存储器1810。易失性存储器1808用于存储执行的指令以及用于分布式存储寄存器协议的多个变量的局部值。非易失性存储器1810用于持久地存储某些实施例中用于分布式存储寄存器协议的多个变量。变量值的持久存储提供了在损毁或通信中断之后分布式存储寄存器共同实现中进程参与的相当直接的恢复。然而,持久存储不是必需的。相反,在非持久存储的实施例中,只要动态存储器中存储的变量值如果丢失的话就一起丢失,并假设变量被适当地重新初始化了,则分布式存储寄存器协议就正确地操作,并维持了使用分布式存储寄存器的进程和处理实体的进展。每个进程Pi存储三个变量(1)val 1834,其保存分布式存储寄存器的当前局部值;(2)val-ts 1836,其指示与分布式存储寄存器的当前局部值相关联的时间戳值;以及(3)ord-ts 1838,其指示与“写”操作相关联的最近的时间戳。特别在非持久存储的实施例中,将变量val初始化为与进程或处理实体写入分布式存储寄存器的任何值都不同的值NIL,也就是说,该值NIL由此可区别于所有其它分布式存储寄存器值。类似地,将变量val-ts和ord-ts的值初始化为值“initialTS”,一个比用于产生时间戳值的例程“newTS”所返回的任何时间戳值都小的值。只要将val、val-ts和ord-ts一起重新初始化为这些值,则共同实现的分布式存储寄存器就容许通信中断以及进程和处理实体损毁,只要至少大多数进程和处理实体恢复并重新开始校正操作。
每个处理器或处理实体Pi可经由基于消息的网络互连到其它进程和处理实体Pj≠i,以便接收1812消息和将消息发送1814到其它进程和处理实体Pj≠i。每个处理器或处理实体PI都包括例程“newTS”1816,该例程在被调用时返回时间戳TSi,该时间戳TSi大于某初始值“initialTS”。每当例程“newTS”被调用时,其返回大于先前返回的任何时间戳的时间戳TSi。同样,由处理器或处理实体Pi调用的newTS所返回的任何时间戳值TSi应该不同于由任何其它处理器或处理实体Pj调用的newTS所返回的任何时间戳值TSj。一种用于实现newTS的实际方法是使newTS返回时间戳TS,该时间戳TS包括一连串局部PID 1804以及系统时钟1806报告的当前时间。实现分布式存储寄存器的每个处理器或处理实体Pi包括四个不同的处理例程(1)“读”处理程序1818;(2)“排序(order)”处理程序1820;(3)“写”处理程序1822;以及(4)“排序和读”处理程序1824。重要的是要注意,处理例程应作为关键段实现,或由锁单线程实现,以防止测试和设置局部变量值过程中的竞态状态。每个处理器或处理实体Pi还需具有四个操作例程(1)“读”1826;(2)“写”1828;(3)“恢复”1830;以及(4)“多数”1832。下面将详细描述四个处理例程和四个操作例程。
分布式存储寄存器的正确操作以及使用分布式存储寄存器的进程和处理实体的活性或进展取决于多个假设。假设每个进程或处理实体Pi都不恶意地工作。换句话说,每个处理器或处理实体Pi都忠实地遵守分布式存储寄存器协议。另一个假设是,共同实现分布式存储寄存器的大多数进程和/或处理实体Pi永不损毁,或者最终停止损毁并可靠地执行。如上所述,分布式存储寄存器的实现可容许丢失消息、通信中断以及在任意给定时刻影响少数进程和处理实体的进程和处理实体损毁。如上所述,所有进程和/或处理实体完全通过基于消息的网络互连。基于消息的网络是异步的,对消息传输时间没有限制。然而,假定了网络的公平损耗(fair-loss)属性,该属性实质上保证了如果Pi从Pj接收到消息m,则Pj发送消息m,并且还实质上保证了如果Pi重复地将消息m传送到Pj,则Pj最终将接收消息m(如果Pj是正确的进程或处理实体的话)。此外,如上所述,假设所有进程或处理实体的系统时钟都合理地反映某共享的时间标准,但不必准确地同步。
这些假设可用于证明分布式存储寄存器协议的正确性并保证进展。然而,在实际实现中,可能违反一个或多个假设,不过可获取相当正确和有用的分布式锁。此外,可将附加的安全防护嵌入在处理例程和操作例程内,以便克服硬件平台和处理实体中的特定缺陷。
分布式存储寄存器的操作基于仲裁(quorum)的概念。图19示出了通过仲裁确定分布式存储寄存器的当前值。图19使用与图11-17中使用的类似的图示约定。在图19中,进程或处理实体1902-1906中的每一个都保存局部变量val-ts,诸如进程或处理实体1902所保存的局部变量1907,其保存分布式存储寄存器的局部时间戳值。如图19中所示,如果共同实现分布式存储寄存器的各个进程和/或处理实体所保存的大多数局部值当前对与分布式存储寄存器相关联的时间戳值val-ts达成一致,则将分布式存储寄存器1908的当前值看作是大多数进程或处理实体所保存的变量val的值。如果大多数进程和处理实体不能对时间戳值val-ts达成一致,或者不存在单个多数保存的值,则分布式存储寄存器的内容是未定义的。然而,然后大多数进程和/或处理实体可选择少数保存的值,并对其达成一致,以便恢复分布式存储寄存器。
图20示出了图18中图解示出的处理例程和操作例程的伪码实现。应该注意的是,这些伪码实现省略了低级通信原语的详细错误处理和具体细节、局部锁定和计算机编程领域技术人员理解和容易实现的其它细节。在第2行,例程“多数”2002将消息从进程和处理实体Pi发送到其自身和所有其它进程或处理实体Pj≠i,这些进程或处理实体Pj≠i和Pi一起共同实现分布式存储寄存器。周期性地重新发送消息,直到接收到足够数量的答复为止,并且在许多实现中,设置定时器以便在该步骤施加有限的时间和执行限制。然后,在第3-4行,例程“多数”等待接收对消息的答复,然后在第5行返回接收的答复。如上所述,大多数进程是正确的这一假设实质上保证了例程“多数”将最终返回,无论是否使用定时器。在实际实现中,定时器以及时的方式实现处理错误发生。需注意的是,一般用时间戳或其它唯一数来唯一地标识每个消息,以使进程Pi接收的答复可与先前发送的消息相关。
例程“读”2004从分布式存储寄存器读取值。在第2行,例程“读,,调用例程“多数”,以将“读”消息发送到其自身和其它进程或处理实体Pj≠i中的每一个。“读”消息包括该消息是“读”消息的指示,以及与进程Pi所保存的局部当前分布式存储寄存器值相关联的时间戳值val-ts。如果例程“多数”返回一组答复,所有答复都包含如在第3行所确定的布尔值“真”,则该例程“读”返回局部当前分布式存储寄存器值val。否则,在第4行,例程“读”调用例程“恢复”。
例程“恢复”2006设法通过仲裁技术来确定分布式存储寄存器的当前值。首先,在第2行,通过调用例程“newTS”来获取新的时间戳ts。然后,在第3行,调用例程“多数”,以将“排序和读”消息发送到所有进程和/或处理实体。如果例程“多数”返回的答复中的任何状态都是“假”,则在第4行,“恢复”返回值NIL。否则,在第5行,将分布式存储寄存器的局部当前值val设置为与例程“多数”所返回的一组答复中的最高值时间戳相关联的值。接下来,在第6行,再次调用例程“多数”,以发送“写”消息,其包括在第2行获取的新时间戳ts以及分布式存储寄存器的新局部当前值val。如果所有答复中的状态都有布尔值“真”,则“写”操作已经成功,并且大多数进程和/或处理实体现在与第5行上局部拷贝val中存储的新值一致。否则,例程“恢复”返回值NIL。
例程“写”2008将新值写入分布式存储寄存器。在第2行获取新的时间戳ts。在第3行调用例程“多数”,以将包括新时间戳的“排序”消息发送到所有进程和/或处理实体。如果在例程“多数”返回的答复消息中返回的任何状态值都是“假”,则在第4行例程“写”返回值“NOK”。否则,在第5行通过经由例程“多数”发送“写”消息将值val写入其它进程和/或处理实体。如果例程“多数”返回的答复中的所有状态值都是“真”,如在第6行确定的,则例程“写”返回值“OK”。否则,在第7行,例程“写”返回值“NOK”。需要注意的是,在例程“恢复”2006和例程“写”的情况下,由局部处理例程更新分布式存储寄存器值val的局部拷贝和时间戳值val-ts的局部拷贝,如下所述。
接下来讨论处理例程。首先,应注意的是,处理例程将接收的值与局部变量值相比较,然后根据比较的结果设置局部变量值。应该严格串行化这些类型的操作,并且防止每个进程和/或处理实体内的竞态状态。基于原子测试与置位指令,使用关键段或局部锁,容易实现局部串行化。“读”处理例程2010接收“读”消息,并用“状态”值答复该“读”消息,该值指示接收进程或实体中的时间戳val-ts的局部拷贝是否等于该“读”消息中接收的时间戳,以及该“读”消息中接收的时间戳ts是否大于或等于局部变量ord-ts的当前值。“写”处理例程2012接收写消息,在第2行,确定局部变量“状态”的值,该值指示接收进程或实体中的时间戳val-ts的局部拷贝是否大于“写”消息中接收的时间戳,以及“写”消息中接收的时间戳ts是否大于或等于局部变量ord-ts的当前值。如果在第3行确定“状态”局部变量值是“真”,则在第4-5行,“写”处理例程用“写”消息中接收的值和时间戳来更新在动态存储器和持久性存储器中本地存储的值val和时间戳val-ts。最后,在第6行,将保存在局部变量“状态”中的值返回到发送“写”处理例程2012所处理的“写”消息的进程或处理实体。
“排序和读”处理程序2014计算局部变量“状态”的值,在第2行,并将该值返回到从其接收“排序和读”消息的进程或处理实体。“状态”的计算值是布尔值,其指示在“排序和读”消息中接收的时间戳是否大于局部变量val-ts或ord-ts中存储的值。如果“状态”的计算值是“真”,则将接收的时间戳ts存储在动态存储器和持久性存储器中的变量ord-ts中。
类似地,“排序”处理程序2016计算局部变量“状态”的值,在第2行,并将该状态值返回到从其接收“排序”消息的进程或处理实体。该状态反映接收的时间戳是否大于在局部变量val-ts或ord-ts中保存的值。如果“状态”的计算值是“真”,则将接收的时间戳ts存储在动态存储器和持久性存储器中的变量ord-ts中。
具有通过上述存储值、处理例程和操作例程实现的分布式存储寄存器,一组进程和/或处理实体可将分布式存储寄存器与一个或多个资源(对其的访问应被串行化)相关联,以允许共同实现相关的分布式存储寄存器的进程和/或处理实体对一个或多个最近资源的并发共享。图21示出了基于分布式存储寄存器的分布式锁协议,其表示本发明的一个实施例。如图21中所示,对于保存分布式锁的进程,分布式存储寄存器2104保存一连串PID值,以及该锁的到期时间。当分布式存储寄存器保存PID/过期时间值时,则与分布式存储寄存器相关联的资源被看作是由具有PID的进程或处理实体锁定2106。当没有进程或处理实体保存锁时,则与分布式存储寄存器相关联的资源被看作没有锁定。特定值“无”或“无进程”可用于指示当前没有进程保存分布式锁。分布式锁由此使任何给定的进程或处理实体可以将与分布式存储寄存器相关联的资源租用一段指定的时间。
应该注意的是,各种不同的锁语义可与分布式锁相关联。分布式锁可以是仅仅与某些类型针对资源的操作(诸如“写”操作)有关的锁,或者可通过没保存锁的进程和/或处理实体来将资源锁定到针对资源的所有操作。另外,该锁可允许高达指定的最大数量的进程并发地访问与该锁相关联的资源。如上所述,资源可以是设备、数据、存储区、数据结构、包括卷的逻辑实体以及多个进程或处理实体可并发、同时或并发且同时争用的任何其它设备或计算资源。
可以实现各种不同的分布式锁协议,以便基于分布式存储寄存器创建分布式锁,如图21中所示。下面描述两个备选实现。此外,如上述的分布式存储锁协议,假设使用分布式锁共同共享资源的进程和/或处理实体不恶意地工作,并且忠实地遵守分布式锁协议。
图22示出了由例程“租用资源”实现的简单的分布式锁协议。进程或处理实体调用例程“租用资源”,以便将与分布式存储寄存器相关联的资源或资源集合锁定一段指定的时间。在步骤2202,例程“租用资源”接收标识符R,该标识符标识特定的资源或期望锁定的资源以及期望锁定的租用时间t。需注意的是,进程或处理实体可通过经过对“租用资源”的单独调用来锁定不同资源的方式来并发地访问多个不同的资源或资源集合,每个资源与单独的分布式锁相关联。在步骤2204中,例程“租用资源”使用上述分布式存储寄存器协议来读取与资源R相关联的分布式存储寄存器的内容。如果步骤2204中的“读”操作返回在步骤2206中确定的值NIL,则在步骤2208例程“租用资源”返回值“假”。否则,如果从分布式存储寄存器读取的到期时间小于从本地系统时钟获取的当前时间,或者从分布式存储寄存器读取的PID具有在步骤2210中确定的值“无”或“无进程”,则在步骤2212中,例程“租用资源”将调用例程“租用资源”的进程或处理实体的局部PID以及等于t+当前系统时间+δ的时间值写入与资源R相关联的分布式存储寄存器。如果在步骤2212中执行的“写”操作返回在步骤2214中确定的布尔值“真”,则在步骤2216中例程“租用资源”返回值“真”。否则,在步骤2208中例程“租用资源”返回布尔值“假”。需要注意的是,在步骤2210中,到期时间与当前时间的比较足以保证租用已经到期,因为在步骤2212中加到到期时间计算的值δ填充(pad)了到期时间,以解决各种进程和处理实体的系统时钟之间缺乏精确同步的问题。同样需要注意的是,在没有再次调用例程“租用资源”的情况下,进程或处理实体不应该在租用到期之后试图访问资源或资源集合。值δ可取决于通信媒质和系统,并且可在毫秒、秒、分钟、数十分钟或更长的时间间隔范围内。在其它方法中,进程可通过在取得租用时设置定时器并在访问租用资源或资源集合之前检查定时器到期的方式,来保证它遵守分布式锁协议。同样需要注意的是,当许多进程或处理实体在某个时段上争用资源或资源集合时,在特定时间间隔内,对于任何单个进程或处理实体而言,图12中所示的例程“租用资源”的实现不保证对资源或多个资源的访问。
图23示出了例程“租用资源”的备选的、更复杂的实现。图23中所示的备选实现共享一些与图22中所示实现相同的步骤。图23中所示的备选实现中的步骤2302、2304、2306、2308、2312、2314以及2316与图22中的步骤2202、2204、2206、2208、2210、2212、2214以及2216类似或相同,为了简洁起见不再描述。在备选实现中,在步骤2302中将局部变量numwaits初始化为0。在备选实现中,在步骤2303中将“读”定时器设置为指定值。如果在步骤2304“读”操作失败,如步骤2306中确定的,则可重复地再尝试“读”操作,直到“读”操作成功了一段时间为止,在步骤2303中将“读”定时器设置为该段时间。新的步骤2305在再尝试“读”操作之前检查定时器到期。在步骤2307中,如果在步骤2304的“读”操作中从分布式存储寄存器读取的值包括当前没有进程锁定资源或资源集合的指示,则省略步骤2309中的到期与当前时间的比较。在步骤2309中,将根据系统时钟确定的当前时间与到期时间相比较。如果当前时间较大,则在步骤2310,增加局部变量numwaits的内容。如果局部变量numwaits的内容大于在步骤2311确定的常数MAXWAITS,则在步骤2308,例程“租用资源”返回值“假”。否则,在步骤2313和2315中计算等待时间wait,并且例程“租用资源”在再尝试获取锁(在步骤2303开始)之前,在步骤2317等待计算的时间wait。等待时间是直到当前租用到期的时间(如在步骤2313确定的)加上由函数δ()基于numwaits的当前值计算的一些附加时间段。因此,等待时间的这个计算考虑了补偿过程,以便在高争用时期,进程在再次尝试租用资源之前等待较长时段。需要注意的是,仅在另一个进程或处理实体当前保存分布式锁(如在步骤2307和2309确定的)时,才执行步骤2310、2311、2313、2315和2317的租用再尝试操作。然后,在步骤2312、2314和2316中,例程“租用资源”尝试以与图22中所示的第一个版本的例程“租用资源”相同的方式租用资源或资源集合,例外的是,如果“写”失败,则激活始于步骤2310的再尝试进程。
应注意的是,不存在与分布式租用(其表示本发明的一个实施例)相关的严格的时间相关性。支撑分布式租用的分布式存储寄存器仅依赖于可由所有互相通信的进程和/或处理实体访问的系统时钟。同样需注意的是,即使在多个进程或处理实体都出现故障时,该分布式租用也可操作。因而分布式租用是鲁棒且可靠的。就进程和/或处理实体之间传送多个消息以便锁定资源而言,分布式租用也是有效的。
虽然已经描述了本发明的具体实施例,但不希望将本发明局限在该实施例。对于本领域的技术人员而言,本发明精神内的修改是显然的。例如,使用不同编程语言、不同模块组织、控制结构和其它典型的编程变化,分布式存储寄存器协议和分布式锁协议的几乎无限多个不同实现都是可能的。此外,可用固件、软件或硬件逻辑电路实现这两种协议。此外,硬件逻辑电路、固件和软件的任意组合也可用于实现分布式存储寄存器协议和分布式锁协议。分布式存储寄存器只是可用于实现分布式锁定协议的基于仲裁的抽象寄存器的一个例子。任何通过分布式进程提供可靠的原子“读”和“写”操作的抽象寄存器都可用于实现分布式锁。以上描述了“租用资源”例程的几个备选实施例。除了这些例程以外,在调用租用释放例程的进程或处理实体保存分布式锁时,通过允许该进程或处理实体将值“无”或“无进程”写入分布式存储寄存器,可简单地实现租用释放例程。附加类型的分布式锁协议也是可能的。例如,代替如上所述实现租用例程,可通过从存储在分布式存储寄存器中的值中移除到期时间的方式,来实现没有相关到期时间的简单锁定例程。对分布式锁的许多其它改变也是可能的。在某些实现中,分布式存储寄存器可只存储两个值“锁定”和“未锁定”中的一个,其中成功地获取了分布式锁的进程或处理实体负责确定它们在本地跟踪锁获取,并且分布式装置用于在拥有分布式锁的处理实体出现故障时清除该分布式锁。在其它实现中,可将二进制锁定/未锁定值和到期时间存储在分布式存储寄存器中。如上所述,分布式锁可共同实现,并可用于由通过消息传递系统互相通信的进程或处理实体并发访问控制。虽然通过计算机网络互连的分布式进程和/或处理实体是可使用分布式锁的系统的一个有用例子,但本发明的方法所实现的分布式锁还可用于多个进程、线程或在单个处理实体内执行的其它这种处理实体的并发控制,其中进程、线程或其它处理实体通过某形式的消息传递(包括共享的存储消息传递)相互通信。
出于说明的目的,前文的描述使用特定术语来提供本发明的全面理解。然而,对于本领域的技术人员而言,显而易见的是,不需要实践本发明的具体细节。出于图示和描述的目的,提供了本发明具体实施例的前文描述。这些描述并不用于穷举或者将本发明限制在所公开的精确形式。显然,鉴于以上教学,许多修改和变化是可能的。示出并描述了这些实施例,以便最好地解释本发明的原理及其实际应用,从而使本领域的其它技术人员可以最好地利用本发明和各种实施例,这些实施例具有适合于所想到的特定用途的各种修改。意欲本发明的保护范围由以下权利要求书及其等效物定义。
权利要求
1.一种分布式锁(1102,2104),其由多个互通信实体(1104-1108)共同实现,所述分布式锁包括分布式存储寄存器(1102,2104),其值由大多数所述实体确定;以及分布式锁协议。
2.如权利要求1所述的分布式锁,其中实体包括进程和处理实体(1104-1108);其中所述分布式存储寄存器(1102,2104)是由所述多个实体实现的虚拟寄存器,每个实体采用一组处理例程(2010,2012,2014,2016)、操作例程(2004,2008,2006,2002)、原语和局部变量值(1834,1836,1838);并且其中所述局部变量值包括局部分布式存储寄存器值val(1834),与所述局部分布式存储寄存器值相关联的局部时间戳值val-ts(1836),以及与最近的“写”操作相关联的局部时间戳ord-ts(1838)。
3.如权利要求2所述的分布式锁(1102,2104),其中所述分布式存储寄存器的所述值由查找值实体通过以下方式确定将包括所述查找值实体的局部变量值val-ts(1836)的“读”消息从所述查找值实体发送到共同实现所述分布式锁的所述实体(1104-1108),请求所述实体返回如下指示其局部val-ts值(1110-1114)是否等于所述“读”消息中的所述时间戳值,以及所述“读”消息中的所述时间戳值是否大于或等于其局部时间戳值ord-ts(1838);并且其中写实体通过以下方式写入所述分布式存储寄存器(1102,2104)的所述值获取新的时间戳(1816)值ts;将包括所述值ts的“排序”消息从所述写实体发送到共同实现所述分布式锁的所述实体,请求所述实体返回其局部val-ts(1836)和ord-ts(1838)值是否小于所述“排序”消息中的所述时间戳值ts的指示;以及将包括所述分布式存储寄存器的新值和所述值ts的“写”消息从所述写实体发送到共同实现所述分布式锁的所述实体,请求所述实体将其局部变量值val(1834)和val-ts(1836)分别更新为所述分布式存储寄存器的所述新值和ts。
4.如权利要求1所述的分布式锁(2104),其中所述分布式存储寄存器(1102,2104)包含锁定指示或未锁定指示;其中所述锁定指示包括指示哪个实体当前保存所述分布式锁的标识符;并且其中实体根据所述分布式锁协议通过以下方式锁定与所述分布式锁(1102,2104)相关联的资源读取所述分布式存储寄存器(2204)的当前值,以通过确定所述分布式存储寄存器是否包含锁定指示来确定所述资源当前是否被实体锁定,以及当所述分布式存储寄存器的所述当前值是未锁定指示时,将所述实体的ID写入(2212)所述分布式存储寄存器。
5.如权利要求4所述的分布式锁,其中当所述分布式存储寄存器的所述当前值是锁定指示时,所述实体再尝试读取(2304)所述分布式存储寄存器(1102,2104)的所述当前值;其中所述实体在改变间隔之后再尝试读取(2304)所述分布式存储寄存器的所述当前值,以防止其它实体的饥饿而争用所述锁;其中所述锁定指示包括指示哪个实体当前保存所述分布式锁的标识符和到期时间;其中实体根据所述分布式锁协议通过以下方式锁定与所述分布式锁相关联的资源读取所述分布式存储寄存器(2304)的所述当前值,以通过确定所述分布式存储寄存器(1102,2104)是否包含锁定指示来确定所述资源(2106)当前是否被实体锁定,并且当所述分布式存储寄存器(1102,2104)的所述当前值是未锁定指示时,或者当所述分布式存储寄存器中的所述锁定指示的所述到期时间小于本地系统时间时,将所述实体的ID和到期时间写入(2312)所述分布式存储寄存器。
6.如权利要求5所述的分布式锁,其中当所述分布式存储寄存器的所述当前值是锁定指示时,所述实体再尝试读取(2304)所述分布式存储寄存器的所述当前值;其中所述实体在改变间隔之后再尝试读取(2304)所述分布式存储寄存器(1102,2104)的所述当前值,以防止其它实体的饥饿而争用所述锁;并且其中所述到期时间是当前系统时间、保存所述分布式锁的时间以及由共同实现所述分布式锁的所述实体的系统时钟之间的不精确同步性引起的漂移时间之和。
7.计算机指令,在存储在计算机可读介质中的每个实体上实现如权利要求1所述的分布式锁(2104)。
8.一种通过多路并发或同时访问实体(1104-1108)来控制对资源(2106)访问的方法,所述方法包括通过所述并发或同时访问实体来实现分布式存储寄存器(1102,2104);以及由实体将锁定指示存储(2212)在所述分布式存储寄存器中,以指示根据分布式锁协议锁定所述资源。
9.如权利要求8所述的方法,其中所述分布式存储寄存器是由多个实体实现的虚拟寄存器(1102,2104),每个实体采用一组处理例程(2010,2012,2014,2016)、操作例程(2004,2008,2006,2002)、原语和局部变量值;并且其中所述局部变量值包括局部分布式存储寄存器值val(1834),与所述局部分布式存储寄存器值相关联的局部时间戳值val-ts(1836),以及与最近的“写”操作相关联的局部时间戳ord-ts(1838)。
10.如权利要求9所述的方法,其中所述分布式存储寄存器(1102,2104)的所述值由查找值实体通过以下方式确定将包括所述查找值实体的局部变量值val-ts(1836)的“读”消息从所述查找值实体发送到共同实现所述分布式锁的所述实体,请求所述实体返回如下指示其局部val-ts值是否等于所述“读”消息中的所述时间戳值,以及所述“读”消息中的所述时间戳值是否大于或等于其局部时间戳值ord-ts(1838);并且其中写实体通过以下方式写入所述分布式存储寄存器的值获取新的时间戳(1816)值ts;将包括所述值ts的“排序”消息从所述写实体发送到共同实现所述分布式锁的所述实体(1104-1108),请求所述实体返回其局部val-ts(1836)和ord-ts(1838)值是否小于所述“排序”消息中的所述时间戳值ts的指示;以及将包括所述分布式存储寄存器(1102,2104)的新值和所述值ts的“写”消息从所述写实体发送到共同实现所述分布式锁的所述实体,请求所述实体将其局部变量值val和val-ts分别更新为所述分布式存储寄存器的所述新值和ts。
全文摘要
本发明的各种实施例是针对分布式锁(2104)和分布式锁定协议,以允许多个通信实体(1104-1108)可以共享访问计算机资源(2106)。本发明的某些实施例采用由通信实体实现的数据存储寄存器(1102,2104)来保存反映分布式锁状态的值。
文档编号H04L29/08GK1786918SQ20051013704
公开日2006年6月14日 申请日期2005年12月9日 优先权日2004年12月10日
发明者J·M·罗伊特尔 申请人:惠普开发有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1