专利名称:容错分布式锁定管理的制作方法
技术领域:
本发明涉及分布式系统,且更具体来说,涉及分布式互斥协议。
技术背景现代计算机系统通常由处理数据的CPU、与其他计算机系统通信的联网接口、及 -个或多个持久性存储单元组成。所述系统可(例如)因电源故障、程序错误或硬件 故障等原因而停止处理。这种故障一般称为进程故障。持久性存储单元能够在修理所 述故障时保持数据完整。一组所述计算机系统可经联网以形成群集。尽管网络一般是可靠的,但偶然故障 可能出现而中断某些节点或节点组之间的通信。这种通信中断一般称为网络分割。每个节点均运行进行读取及写入数据二者的事务性存储系统(数据管理系统)。 某些这种数据由在不同节点上操作的应用程序同吋存取。为保证数据一致性,分布式 事务与锁定管理技术用于管理及调节对所述数据的存取。然而,常规的分布式事务与 锁定管理技术与多个问题相关联。例如,常规系统通常会带来差的锁定转移性能。更详细地说,在数个程序争夺相 同的共享资源时,必须尽可能快地将存取授权从一个程序及/或节点转移到下一个。存 取授权必须保证公平度,以便所有程序均最终具有存取所述资源的机会,从而从活锁 提供自由度。现有的分布式存储器锁定算法假设有序单播(也称为点对点)消息接发 层(例如TCP/IP)的原始性,且通常通过跨越所述节点对通信路径施加虚拟分级树拓 扑来尝试优化对消息业务的使用。尽管在所属技术领域已实现改进,但随群集中的节 点数量增加,消息业务与相关联处理成本及延时的增加会导致所有这些算法的性能随节点数增加超过相对小的数量而急剧降级。常规系统还容易受到网络或进程故障的影响。网络、计算机系统和运行于所述计 算机系统上的进程会偶尔发生故障。在这种情形中,常规算法或停止工作(例如停止 对所有节点授予锁定)或不正确地工作(例如,算法不能提供与其在无故障环境中所 提供的相同保证或语义,例如,在尚未释放锁定时将所述锁定授予相同的节点)。常规系统还会为资源所有权转移带来差的可缩放性。在多数常规算法中,N个资 源的获取及释放会要求大量消息(最坏的情形是N*M,其中M是节点数,但最好的 情形通常是log(N)或log(M))以将锁定的所有权从一个节点成功转移到另一个。另外, 分级锁定所有权转移会要求许多消息。在多数常规算法中,对分级锁定(还称为多颗 粒锁定)的支持对每次获取分布式资源所有权均要求多个消息。因此,需要更好的分布式事务与锁定管理技术。发明内容本发明的一个实施例提供一种具有多个节点的分布式锁定管理系统,所述节点分 别以通信方式耦合到网络。所述系统在每个节点处均包含数据库,其用于存储由在一 个或多个所述节点处操作的应用程序使用的资源。所述系统还在每个节点处包含容错分布式锁定管理器(FTDLM)模块,其用于调节所述应用程序对资源的存取。FTDLM 模块针对每个资源具有1人列,所述队列用于识别拥有所述资源的分布式锁定的节点。 跨越所述节点复制每个队列。系统还在每个节点处包含全序输送装置模块,其用于以 通信方式将所述节点耦合到网络并对节点之间的消息接发施加全排序协议。全序输送 装置模块可集成到FTDLM模块中,或单独存在。在一个特定情形中,存储于任一数据库中的资源可由在不同节点上操作的应用程序同时存取,且在甚至面临进程故障或 网络分割时仍维持数据一致性。FTDLM模块中的队列可以是(例如)FIFO队列,且 每个对应资源的分布式锁定所有权被转移到所述队列中以FIFO次序识别的等待节点。 全序输送装置模块可实施为(例如)扩展虚拟同步输送装置。在一个特定情形中,全 序输送装置模块利用网络的多播能力,以便以排序保证传递消息。在另一特定情形中, 如果节点拥有资源的分布式锁定,且无其他节点等待所述资源,则FTDLM模块允许 所述资源上的无限量事务同时或连续运行。在另一特定情形中,如果节点X拥有资源 的分布式锁定,且其他节点正等待所述资源,则FTDLM模块允许所述资源上的预定 数量的未决事务运行及提交,且随后释放对分布式锁定的所有权。在一个这种情形中, 一旦FTDLM模块释放对分布式锁定的所有权则将节点X放置在所述队列中,且在其 他节点完成对所述资源的使用后,节点X即刻重新获取对所述分布式锁定的所有权。 在将对资源的分布式锁定所有权转移到节点时,FTDLM模块可允许正等待所述资源 的所有事务同时执行。在提交在正使用分布式锁定的节点处的所有事务后,FTDLM 模块可保持对所述节点处所述锁定的所有权,直到或除非另一节点请求所述分布式锁定。FTDLM模块可使用调度来确保以一定的公平度将资源存取分布在所述节点上。 在正常的正向处理期间,可在瞬时存储器中更新所述队列。在一个这种情形中,所述 队列是FIFO队列,且在检测到故障或从故障中恢复时将每个队列的顶部要素复制到 持久性存储装置中及从持久性存储装置中读取。FTDLM模块可经配置以通过单个多 播消息中数个分布式锁定的分批入队及出队而在一个安全的全有序广播中跨越各节点 获取及释放多个分布式锁定。在一个这种情形中,使用单个多播消息进行分级锁定所 有权转移。所述系统可利用全序输送装置的扩展虚拟同步语义以实施基于成员关系定 额的故障恢复系统,其中在每个节点处本地保留达成一致的成员关系。本发明的另一实施例提供-种用于调节具有多个节点的系统中的应用程序对资 源的存取的分布式锁定管理器模块,其中所述多个节点分别以通信方式耦合到网络。 所述模块针对每个资源包含一队列,所述队列识别拥有所述资源的分布式锁定的节点。 可跨越所述节点复制每个队列。所述模块还包含(或以操作方式耦合到)全序输送装 置模块,其用于以通信方式将其节点耦合到网络,及对各节点之间的消息接发施加全 排序协议。基于本地保留的成员关系,所述模块还可包含定额计算状态机,其耦合到 所述全序输送装置模块以在甚至面临网络分割及进程故障时仍保证互斥。所述模块还 可包含n个锁定队列状态机,其中n是资源数,每个锁定队列状态机均用于维持所述 队列并起始分布式锁定的所有权转移。所述模块还可包含锁定管理器状态机,其用于 为请求存取一个或多个资源的应用程序获取分布式锁定,并通知适合的锁定队列状态 机处理所述请求。所述模块可包含持久性存储装置,其用于在检测到故障或从故障中 恢复时存储指示当前的锁定所有权的队列要素。在一个这种实施例中,且在其中所有 节点同时失效的情况下,所述模块进一步配置具有FPMS (正向处理成员组)能力, 借此每个进入及退出定额状态的节点保留一组可达到的节点,因此尽管完全丢失瞬时 状态仍能实现故障恢复。在一个这种情形中,初始的先前定额是完全成员关系(所有 节点),且如果检测到一组当前可达到的节点已达到先前定额的大部分,则建立定额状 态。如果其中发生故障的节点恢复并再附着到可操作群组,则模块可通过使最新节点 向恢复节点发送必要数据来更新恢复节点的数据。在一个特定情形中,如果模块的节 点拥有对资源的分布式锁定,且无其他节点等待所述资源,则所述模块允许所述资源 上的不限量事务同时或连续运行。在另一特定情形中,如果所述模块的节点拥有对资 源的分布式锁定,且其他节点正等待所述资源,则所述模块允许所述资源上的预定数 量的未决事务运行及提交,且随后释放对所述分布式锁定的所有权。在一个这种情形 中, 一旦所述模块释放对分布式锁定的所有权则将模块的节点放置在队列中,且在其 他节点完成对所述资源的使用后,所述模块的节点即刻重新获取对所述分布式锁定的 所有权。在将对资源的分布式锁定所有权转移到模块的节点时,所述模块可允许等待 所述资源的所有事务同时执行。在提交正使用分布式锁定的节点处的所有事务之后, 所述模块可将对所述锁定的所有权保持在所述节点处,直到或除非另一节点请求所述 分布式锁定。所述模块可允许在释放分布式锁定之前运行N个事务。根据本揭示内容,所述模块的其他结构及功能将显而易见(例如,类似于先前描述于分布式锁定管理系 统中的模块)。本发明的另一实施例提供一种用于调节具有多个节点的分布式数据库系统中的 应用程序对资源的存取的分布式锁定管理器方法,其中所述多个节点分别以通信方式 耦合到网络。所述方法包含针对每个资源提供一队列,且基于队列内容识别拥有对 应于所述队列的资源的分布式锁定的节点。所述方法进一步包含跨越所述节点复制每 个队列。所述方法进一步包含对各节点之间的消息接发施加全排序协议。所述方法可 进一步包含下列的一个或多个基于本地保留的成员关系,在甚至面临网络分割及进 程故障时仍保证互斥;维持队列并起始分布式锁定的所有权转移;及为请求存储一个 或多个资源的应用程序获取分布式锁定,并处理所述请求。本文所述特征及优势并非完全包含性的,且更确切地说,在参考所述图示及说明 时,所属技术领域的技术人员将对许多其他特征及优势显而易见。此外,应注意,本 说明书中使用的语言原则上是出于可读性和指导性目的来选择,而非是为限定本发明 性主题的范围来选择。
图1图解说明一种用于根据本发明的一个实施例确定对分布式资源的锁定是否适 合的方法。图2是根据本发明的一个实施例配置的容错分布式锁定管理系统的框图。 图3是根据本发明的一个实施例配置的图2所示容错分布式锁定管理器 (FTDLM)模块的框图。图4是根据本发明的一个实施例配置的图3所示锁定管理器控制模块的框图。 图5图解说明根据本发明的一个实施例配置的图4所示锁定队列状态机。 图6图解说明根据本发明的一个实施例配置的图4所示定额计算状态机。 图7图解说明根据本发明的一个实施例配置的图4所示锁定管理器状态机。
具体实施方式
本文揭示用以管理及调节对分布式数据的存取的分布式事务与锁定管理技术。通 过本发明的一个或多个实施例,可分别消除或另外改进关于锁定转移的低性能、对网 络或进程故障的敏感性、对资源所有权转移的较差可縮放性、及分级锁定所有权转移 所需要的许多消息的前述问题。总述本发明实施例提供分布式及容错事务与锁定管理系统(在本文中一般称为 FTDLM)的独立设计。FTDLM可实施为(例如)决策支持系统(DSS)复制技术的 组件。在这种实施方案中,如根据本揭示内容所了解,FTDLM能够与系统的其他组件交互作用。本文揭示大量这种实施方案,其中移除对其他组件的所有依赖。所揭示 的设计及技术实现了分布式及容错事务与锁定管理系统的独立实施方案。在一个实例性配置中,FTDLM实施分布式事务管理及资源的双相锁定(一般称 为2PL),其中从分布且连接在网络上的多个节点同时存取所述资源。每个节点均称为 "成员",且一组节点称为"协调群组"。本实例性配置假设所述节点中的每一者先前 已就构成协调群组的成员关系的完整节点组达成一致。每个节点(或成员)均在持久 存储装置(可耐受进程及功率故障)上本地存储成员关系。多个应用程序可同时使用 每个节点上的FTDLM。FTDLM的实例性配置实施标准的事务性双相锁定语义,且行为类似于典型的锁 定管理器及事务管理器。这种组件的客户端调用BeginTransaction()、经由Lock()请求 对所述事务上下文内的资源的专有存取、及经由对TransactionCompleted()的调用来提 交所述交易。所述分布式锁定可供在提交之后释放。然而,不同于这些组件的常规实 施方案,FTDLM并不直接与类似于存取方法(其实施类似于B树等设备以操纵数据) 或记录管理器(用于以事务处理方式保留更新)等组件交互作用。如根据本揭示内容 将显而易见,可结合这些传统组件以各种方式使用FTDLM。FTDLM设计用于正确操作以在甚至面临进程及网络故障时仍保证互斥及2PL。 安全得到保证。另外,如果在残存成员中可达到定额则FTDLM维持活性(继续处理 的能力)在甚至发生故障时,在多数情况下仍能继续获取或释放锁定并开始及提交事 务。在修理这些硬件或软件故障后,系统能够将恢复节点自动并入在线群组中而不必 使系统离线。FTDLM经设计以尽可能地快,且利用例如有效的多播消息传递等基木 联网硬件特性。应注意,锁定管理器的功能可经隔离或另外独立存在。例如,在一个特定实施例 中,如果需要则可在无容错的情况下实施锁定管理器。同样,根据另一实施例配置的 容错锁定管理器可实施于非分布式系统中。锁定的用户模型及决策树FTDLM的用户模型可以多种方式实施,如根据本揭示内容将显而易见。在一个 特定实施例中,FTDLM经由包含下列3个函数的简明API向客户端展示其所有功能 TransactionID BeginTransaction() 、 Lock(TmnsactionID, NameOfResource) 及 TransactionCompleted(TransactionID)。TransactionID BeginTransaction():本函数调用不涉及网络操作艮因此有效执行。 甚至在本地节点不是定额的一部分时,也允许对本函数的调用成功。这个逻辑在(例 如)其屮客户端在更新数据而非在读取数据时获取专有锁定的使用情形中是便利的。在这种情形中,所述逻辑在甚至未连接到定额时仍允许客户端开始及提交只读事务。Lock(TransactioniU, NameOfResource): FTDLM保证如果这个函数成功返回则专 有地获得所述锁定。图1图解说明根据本发明的一个实施例指定这个调用的精确行为 的决策树图。所述逻辑经设计以便l)重复获取同一锁定不会要求网络消息,2)中止在本地实例并不具有定额时更新数据的事务,3)允许要求相同资源的多个事务同时本 地执行(其中正确性由单独的非分布式锁定管理系统保证),4)甚至在贪心的节点绝不 放走资源时仍保证公平度;及5)通过实施借以允许针对每个锁定转移执行N个事务的 "定额"来改进性能。在图l所示图示中,采用统一制模语言(UML)准则,其中圆圈表示决策问题, 箭头是答案,而矩形是所产生的动作。如果函数抛出异常,则这个函数的用户可(例 如)通过调用用户的数据库事务上的Rollback()而取消任何动作。如在图中可见,所述 树的第一个决策是本地节点是否在定额内。如果否,则所产生的动作包含抛出异常以 使得客户端退回所述事务。然而,如果本地节点在定额内,则下一决策包含确定所述 本地实例(例如,例如电子表格或字处理器等应用程序)是否拥有分布式锁定。如果 否,则所产生的动作包含请求分布式锁定并进行阻塞直到获得锁定。 一旦获得锁定, 则所产生的动作进一步包含更新事务列表,且将控制返回到函数的用户。然而,如果 所述本地实例确实拥有分布式锁定,则下个决策包含确定是否存在对这个资源的"等 待者"(另一个本地/远程实例)。如果否,则所产生的动作包含更新所述事务列表,并 将控制返回到函数的用户。然而,如果存在对所述资源的等待者,则下个决策包含确 定是否已达到定额。如果否,则所产生的动作包含更新事务列表,并将控制返回到所 述函数的用户。然而,如果已达到定额,则所产生的动作包含放弃分布式锁定、请求 锁定、及进行阻塞直到获取锁定。 一旦获取锁定,则所产生的动作进一步包含更新事 务列表、及将控制返回到函数的用户。TmnsactionCompleted(TransactionID):调用这个函数会通知FTDLM以便使其可释放在事务中获取的所有锁定。在一个特定情形中,FTDLM并不协助用户执行或保留操作。相反'FTDLM实施 双相锁定语义,以便获取并保证在从调用Lock()的时间返回到调用 TransactionCompleted()的时间内维持资源的专有所有权。这些语义经设计以便FTDLM 组件可与例如记录管理器及存取方法等其他组件组合以实施分布式数据库系统、分布 式复制系统及其他要求与高可靠性、可用性及性能互斥的应用程序。系统架构图2是根据本发明的一个实施例配置的分布式锁定管理系统的框图。 如图中可见,所述系统包含多个(N个)节点,所述节点分别以通信方式经由全 序输送装置模块耦合到网络。每个节点均包含能够执行一个或多个可存取所述节点的 本地数据库的应用程序的处理系统。另外,来自一个特定节点的应用程序可存取其他 节点的数据库。因此,存储于任一数据库内的资源可由在不同节点上操作的应用程序 同时存取。每个数据库本地的容错分布式锁定管理器(FTDLM)模块经编程或另外配 置以管理及调节对存储于其中的资源的存取。甚至在面临进程故障或网络分割时仍维 持数据一致性。回顾一组包含数据库复制品的节点在本文称为一协调群组。每个节点的处理系统可以是任一类型的计算系统,例如服务器、工作站、膝上型电脑或个人数字助理。尽管FTDLM模块、应用程序及每个节点的数据库的每一者均 在本实例性实施例中显示为离散组件,但也可使用其他配置。例如,这些组件的任一 者或全部均可经编程或另外集成到所述处理系统中。同样,全序输送装置模块可集成 到FTDLM模块中(例如,如图4中显示)。常规或定制的联网及/或进程间协议及技 术可用于实现任一节点内的各组件之间以及各节点之间的通信。另外,可为节点内及 节点间通信使用有线及/或无线技术。任一节点内的每个应用程序均存取其本地数据库以及存取其他节点的数据库。一 般来说,应用程序是可以读取、添加、删除、修改、更新或另外操纵存储在包含于分 布式系统内的一个或多个数据库中的数据的任--程序或系统。应用程序可以是(例如) 由用户激活(例如银行业或会计学软件)或由系统(例如经编程而每天自动运行的存 货控制软件)自动激活的。每个节点的数据库存储由一个或多个应用程序使用的资源。数据库的组织可以是 相同(例如,所有相关数据库)或不同(例如,某些相关及某些面向对象的数据库) 的。本文可使用数据存储设备的任一类型或组合。全序输送装置模块对全局模型内的所有数据项目施加排序,且可使用常规的全序 技术来实施。在一个特定实施例中,根据约翰斯'霍普金斯大学(Johns II叩kins University)计算机科学学院的YairAmir禾口 Ciprian Tutu的"从全序到数据库复制(From Total Order to Database Replication)"所描述来实施全序输送装置模块。同样,可根据 加利福尼亚大学圣芭芭拉分校(University of California at Santa Barbara)电子与计算机 工程系的L. E. Moser、 Y. Amir、 P. M. Mdliar-Sm池和D. A. Agarwal的"扩展虚拟同 步(Extended Virtual Synchrony)"所描述来实施全序输送装置模块。应注意,这些论 文均可在线获得,且还包含于先前并入的第60/671,373号美国临时申请案的附录B中。 进一步应注意,扩展虚拟同步输送装置是全序输送装置模块的一个具体实施方案。不同于常规的分布式锁定管理技术,本发明的一个实施例利用多播通信协议,因 此实现显著性能及可縮放性优势,且改进锁定转移问题的较差性能。与使用多播协议 将消息传递到N个节点相关联的成本(成本是O(l))明显小于使用单播劝、议将同一消 息传递到N个节点的成本(成本是O(n))。已发展虚拟同步全有序输送装置,其使用 常用联网硬件(例如以太网)的多播能力以某种排序保证及以在出现进程或网络故障 时良好定义的语义来有效及可縮放地传递消息。在本发明的一个特定实施例中,Leslie Lamport的分布式锁定算法(一般称为Bakery算法)经修改以利用全有序输送装置的 功率,因此实施稳健的分布式锁定与事务管理。此外,本发明实施例可经配置以通过利用由虚拟同步输送装置提供的故障语义来 实施基于定额(加权的多数表决合意)的故障恢复系统而消除或另外减少对网络或进 程故障问题的敏感性。另外,在许多情形中,仅要求l个多播消息传输以在M个成员 间转移N个资源的所有权。这种实施例会解决资源所有权转移的较差可縮放性问题。 这种单个多播消息技术可经扩展以还解决分级锁定所有权转移问题所需要的许多消息。
如先前解释,每个数据库本地的FTDLM模块操作以管理及调节对存储于其中的 资源的存取。下文将参照图3-7而更详细地论述FTDLM模块及其结合全有序输送装 置模块的使用。
容错分布式锁定管理器(FTDLM)
图3是根据本发明的一个实施例配置的图2所示容错分布式锁定管理器 (FTDLM)模块的框图。如图中可见,FTDLM模块包含多个FIFO队列(针对M个 资源的每一者存在一个队列)及一锁定管理器控制模块。如下文参照图4-7详细论述, 所述锁定管理器控制模块一般控制FTDLM模块的功能。在一个这种实施例中,FTDLM 与软件(例如,在处理器上执行或在处理器可读媒体上进行编码的指令组) 一起实施。 另一选择为,FTDLM可实施于(例如)硬件(例如,门级逻辑)或硬件与软件的组 合(例如,具有多个用于实施本文所述功能的嵌入式例程的微控制器)。
在协调群组(或节点组)中,每个成员(或节点)均具有对与其相关联的唯一识 别符的持久记录。另外,每个成员还具有对所述协调群组中其他成员的唯一识别符的 持久记录。这些唯-识别符被指定为图3所示"请求节点ID"。应注意,这个成员关 系信息可使用常规技术来分布及保留。因此,在执行FTDLM时,假设唯一识别的成 员列表的内容在l办调群组的所有成员上是相同的。
图2所示实例性实施例的FTDLM是点对点设计,其中不存在拥有锁定所有权的 权威记录的群集的集中式组件。每个成员均执行包含于图3所示(且参照图4-7更详 细论述)FTDLM模块中的状态机的对称实例。在每个成员处执行的逻辑均相同,但 提供与单权限锁定管理器设计所提供的互斥保证相同的互斥保证,而在性能及容错方 面具有某些优势。在一个特定实施例中,且为了确保卨性能,在正常操作期间的所有 数据结构均驻留于瞬时存储器中。在发生故障或从故障中恢复时,保留瞬时数据结构 的一部分以确保在发生故障时的高度可靠性。
如参照图3可见,每个分布式锁定(也就是可由所述系统存取的每个数据源)均 与FIFO队列相关联。所述队列的每个要素均含有节点的唯一识别符("请求节点ID")。 队列顶部的节点("第一位置")拥有分布式锁定。所述队列中列出的其他成员(第二 位置、第三位置、第四位置等)正等待所述锁定。以FIFO次序转移所述锁定。可经 由本文所述算法而跨越所述协调群组的各节点复制每个队列。
在一个实施例中,FTDLM会影响虚拟同步输送装置的能力。在进程或网络失败 的情形中,FTDLM适合地起反应以保证与无故障操作相同的语义。FTDLM可经配置 以实施数个性能优化。例如,如果节点"3"在队列顶部且队列尺寸为1 (也就是在队 列屮仅有一个要素),则允许无限量的事务同时或连续运行。如果节点"3"在队列顶 部且队列大小大于l (也就是说,在队列的后续要素中存在等待者),则允许在阻塞剩 余事务时运行及提交预定数量的"n"个未决事务。在所述"n"个事务均提交后,释 放所述分布式锁定。这个功能实现了多个所需特性,例如通过增加针对每次逐节点的分布式锁定转移 而完成的工作量来实现性能提高。同样,通过确保极主动的成员释放所述锁定以便其 他节点可使用所述锁定来提高公平度。在一个特定实施例中,出丁-性能的原因(例如, 提供更快的存取)而在瞬时存储器中存储及更新所述队列。出于可靠性的原因,如依 次将论述,队列的顶部要素可被复制到持久性存储装置,并在检测到故障或从故障进 行恢复时从持久性装置读取。
如根据本揭示内容将理解,FTDLM无需了解正被同步的资源类型,或用于保留 数据的存储格式。FTDLM的客户端会看到独立的具有客户端可在适当时使用的简单 API及清晰语义的分布式事务与锁定管理组件。在不存在故障时,FTDLM的行为是典 型针对实施全双相锁定的保守型锁定管理器。然而,锁定管理器中的容错并非微不足 道,且因此将更详细描述FTDLM在故障下的行为。
一般来说,且参照FTDLM的一个实施例的进程故障语义,如果应用程序进程继 续但FTDLM状态机发生故障,则应用程序块等待直到FTDLM状态机终止及重启。 在重启后,FTDLM状态机包含逻辑,所述逻辑使用持久本地存储装置及来自其他操 作成员的信息的组合恢复其正确的内部状态。在恢复后,FTDLM状态机再继续正确 的操作。在某些情形中,未决事务将终止,且期望应用程序重试所述事务。因此,在 这种故障类型中,应用程序一般会看到来自Lock()的极慢响应、逾时、或抛出异常(所 述应用程序将基于此异常而重试其事务)。如果应用程序和FTDLM均突然终止,则在 这两个组件都重启时操作将再继续。
参照FTDLM的一个实施例的网络分割语义,当网络分割和本地成员(对应用程 序来说)均具有定额时,正执行事务的应用程序可在FTDLM重新建立定额并从故障 中恢复时的轻微暂停(例如,Lock()调用将造成比iH常情况更长的阻塞)之后继续执 行。如果FTDLM状态机不能建立定额,则所有APT均将抛出异常。这个行为继续, 直到本地成员能够重新建立定额(通常是因为分割已结束)。
根据本发明实施例配置的FTDLM具有下列8个属性的一个或多个。
属性#1: FTDLM与数据库系统的其他要素的分离-在一个实施例中,FTDLM与 数据库系统的其他要素(例如存取方法及记录管理器)分离以提高应用程序通用性、 接口模块度、及FTDLM与本地锁定管理器之间的协同,以实现高的集合系统性能及 吞吐量。
属性#2:全有序输送装置的使用-FTDLM实施例使用全有序输送装置来影响高性 能全排序协议,所述高性能全排序协议在各成员之间分布消息确认负载以获得更大的 可縮放性,且实施流水线式消息全排序以获得更大吞吐量。此外,FTDLM可利用基 本硬件(例如实现多播的以太网或其他网络特性)的多播能力以获得更大的可縮放性 及性能。
属性#3:单分布式锁定转移-FTDLM实施例经配置以便在向本地成员转移适合的 分布式锁定时,在每个成员上,准许所有等待所述资源的事务同时执行。这允许单个分布式锁定转移实现许多同时事务的执行。执行在同一节点上的所有这些事务可能潜 在地需要由常规的本地锁定管理器串行化。这种逻辑封装在锁定队列状态机(图4及 5)和锁定管理器状态机(图4及7)中。
属性#4:粘附锁定-如果假设其中已使用某种资源的成员比其他成员更可能再次使 用所述同一资源,贝IJFTDLM的一个实施例会实施"粘附锁定"。更详细地,在提交所 有正使用锁定的事务后,FTDLM使所有权保持在所述成员处直到(或除非)另一成 员请求所述锁定(或已请求所述锁定)。这允许一个成员重复获取锁定以快速执行而无 网络开销。FTDLM通过将事务的锁定所有权和成员的锁定所有权去耦并分别以不同 方式进行优化来实现这一目的。这种逻辑封装在锁定队列状态机(图4及5)中。
属性#5:用于分布公平的调度算法-还可以将调度算法并入FTDLM的实施例以确 保甚至在节点重复地及持续不断地请求资源时,仍出于分布公平目的而将专有存取正 确分布给其他成员(以FIFO次序)。可根据需要设定公平度。这种逻辑封装在锁定队 列状态机(图4及5)中。
属性#6:出于公平目的而对定额的使用-FTDLM实施例允许在出于公平目的而放 弃锁定之前运行许多("定额")交易。更详细地,在多个参与方争夺同一锁定时,许 多常规设计会因为恒定的锁定转移而出现性能降级,且每个锁定转移均会导致少量计 算。这种逻辑封装在锁定队列状态机(图4及5)中。
属性#7:瞬时存储器的使用-FTDLM在正常的正向处理(例如,获取及释放锁定; 开始及提夂事务)期间仅存取瞬时存储器。常规的容错系统使用持久存储装置以在出 现进程故障的情况下提供可靠性。然而,由于对持久存储装置的存取明显慢于对瞬时 存储器的存取,则FTDLM实施例经设计以将对持久存储装置的存取最小化。这允许 FTDLM以比典型的持久型设计高得多的性能来操作。参照定额计算状态机(图4及6) 和锁定管理器状态机(图4及7)来提供如何在甚至没有恒定的持久存储装置存取时 仍维持容错的说明。
属性#8:使用全有序广播来获取/释放成员间的多个分布式锁定-FTDLM实施例能 够通过将一个消息中的数个锁定成批入队及出队来获取及释放安全全有序广播中各成 员间的多个分布式锁定。这种设计捕获于锁定队列状态机(图4及5)中,其使用分 布式锁定的所有权移动算法的分离及锁定对事务的关联性。
容错-进程及网络故障
除上文列举的关于性能的属性外,FTDLM实施例经配置以具有容忍进程及网络 故障二者的能力。在这里,术语"容忍"涉及在面临故障时继续处理的能力以及在故 障结束后执行在线恢复的能力。出于概念清晰的目的,所述故障可分为两类因单点 进程故障导致的故障(例如进程失效、电源故障等),及因其中某些成员不能与其他成 员通信的网络故障导致的故障(例如网络分割)。
参照进程故障容错,且根据一个实施例,在准许Lock()或TransactionCompleted() 成功之前必须建立定额。实例性定额逻辑封装于定额计算状态机(图4及6)中。在一个特定实例中,如果检测到当前可达到的成员组占先前定额的大多数,则建立定额。 这允许更易于定额建立。初始的"先前定额"是完整的成员关系。如果其中发生故障 的成员恢复并重附着到在线的可操作群组,则锁定管理器状态机(图4及7)中的逻 辑通过使最新成员向恢复成员发送必要的状态信息来更新恢复成员的数据结构。这种 恢复算法有效且利用扩展虚拟同步输送装置的性质。为避免在其中所有成员同时失效 的相对稀有情形中出现忘记锁定队列的情况,锁定管理器状态机(图4及7)可配置 有FPMS (正向处理成员组)逻辑,借此每个成员在进入及退出定额状态时保留可达 到的成员组。
关于网络分割容错,且根据一个实施例,在将成员群组(称为"配置")划分为 较小配置时,定额可再次用于确保仅一个配置具有进行更新的能力。甚至在某些成员 不能与其他成员通信时,这仍确保互斥保证。为确保在进程故障与网络分割故障的组 合期间不忘记锁定状态,FTDLM实施例包含分片保留逻辑,其实施于定额计算状态 机(图4及6)中,借以在故障及恢复期间于某些点处保留锁定队列的所有者。
锁定管理器控制
图4是根据本发明的-个实施例配置的图3所示锁定管理器控制模块的框图。如 图中可见,FTDLM使用3个交互作用的状态机(定额计算状态机、锁定管理器状态 机及锁定队列状态机)、持久性存储装置和全序输送装置模块(例如,扩展虚拟同步输 送装置或其他适合的全序输送装置)来实施锁定管理器控制功能。还显示锁定管理器 控制模块的数据流。根据本揭示内容,各种变化形式将显而易见。例如,扩展虚拟同 步输送装置可在锁定管理器控制模块外部实施(例如,如图2中显示),如可为持久性 存储装置。
FTDLM的每个实例均具有锁定管理器状态机的一个实例、扩展虚拟同步输送装 置的一个实例、定额计算状态机的一个实例、及锁定队列状态机的n个实例(要求分 布式锁定问步化的n个资源的每一者对应一个)。这些状态机使用在图4所示数据流中
指定的接口互相通信。这些状态机的集合行为实施在本专利中主张的功能。
同样描绘于图4中的数据流图示范各种状态机组件之间的关系。组件均以方框标 记,且数据流均以箭头标记。箭头方向指示数据流而非控制流。箭头的标签显示在各 组件之间流动的消息类型。尽管所述图式描绘仅一个应用程序及一个锁定队列状态机, 但可以存在同时运行的许多应用程序实例及许多锁定队列状态机实例。
扩展虚拟同步输送装置(其还可称为全序输送装置,或在本文中简称为输送装置) 以良好定义的排序保证来检测当前可达到的成员组(例如,如先前并入的约翰斯'霍普 金斯大学(Johns Hopkins University )计算机科学学院的Yair Amir和Ciprian Tutu的"从 全序到数据库复制(From Total Order to Database Replication)"中描述),并经由规则 配置及过渡配置通告来通知定额计算状态机。另外,所述输送装置用于以"安全"的 全有序传递保证在各状态机之间发送及接收消息。所述输送装置以图4所示各种 OnRcv+通告来通知这些状态机。FTDLM的这个实施例利用扩展虚拟同步(EVS)的熟知语义,如先前并入的加 利福尼亚大学圣芭芭拉分校(University of California at Santa Barbara)电子与计算机工 程系的L. E. Moser、 Y. Amir、 P. M. Mdliar-Sm池和D. A. Agarwal的"扩展虚拟同步 (Extended Virtual Synchrony)"所详细描述。为简便起见,本文描述FTDLM根据所 述输送装置假设的各种语义要求所述输送装置提供配置变化的应用程序通告。配置 是本地进程当前可存取的有序进程列表,是与容错合意算法相一致的。存在两种配置 类型规则和传统。所有消息均以传统或规则配置传递。如果以规则配置中传递消息, 则所述进程知道所述消息也以所述配置传递到所有其他成员,除非远程成员失效。这 些消息相对于规则配置是全有序(无间隙)的。不满足这个要求(在故障情形中)的 消息则以传统配置传递或不传递。接收且处于2个规则配置中的进程会接收相同的消 息组(有时称为故障可分性)。
定额计算状态机(QCSM)经由两种类型的配置消息及规则(全有序)消息从所 述输送装置接收输入。所述输送装置产生的配置消息向QCSM通知节点的故障或新 生。QCSM使用这个信息与本地保留的成员关系组合以实施持久定额计算算法,以甚 至在面临网络分割及进程故障时仍保证互斥。同样,在QCSM确定要求故障恢复(例 如,作为所述成员关系一部分的节点先前发生故障目-现在恢复并附着到网络)时, QCSM使用SendLockMgrState以使用输送装置将状态信息与FTDLM的其他正在操作 的实例同步。文中参照图6更详细论述QCSM。
锁定管理器状态机(LMSM)从三个源接收输入应用程序、QCSM及输送装置。 应用程序向LMSM通知每个事务开始及事务完成(例如,提交或退回)。应用程序使 用LMSM获取分布式锁定。LMSM阻塞锁定请求直到已获得分布式锁定。可存在0 到n个应用程序实例。QCSM在其达到定额时经由OnEnteringPrimary通告来通知 LMSM,以便LMSM可确保在其己知这个实例属于具有定额的群组时Lock()可操作。 QCSM还在因为进程或网络故障而使其不能实现定额时经由OnEnteringNonPrimary通 知LMSM。输送装置在其检测到可达到的成员组中的变化时经由OnRcvRegCorif及 OnRcvTransConf通告来通知LMSM,以便LMSM可确保在其已知当前由亍故障或恢 复成员而未建立定额时Lock()变得不可操作(例如,阻塞或抛出异常)。在LMSM已 根据其三个输入确定锁定活动可继续时,其通知适合的锁定队列状态机处理Lock或 TransactionComplete请求文中参照图7更详细论述LMSM。
锁定队列状态机(LQSM)封装为维持(例如,同步化)分布式队列以及唤醒被 阻塞的线程所必需的逻辑。其从LMSM及输送装置接收输入并输出到输送装置。在从 LMSM接收到OnLock通告时,LQSM确定Lock调用是否可立即返回(例如,因为所 述锁定已由本地成员拥有)。如果否,则LQSM向输送装置发送适合的消息(例如经 由SendEnqueue和SendEnqueueAnclDequeue消息)以起始锁定所有权的分布式转移。 在从LMSM接收到OnCommit通告时,LQSM确定将任何锁定释放给其他成员是否是 必需的。如果是,则其在输送装置上发送出队消息(例如经由SendDequeue)。在从输送装置接收到出队消息(例如经由OnRcvDequeue通告)时,LQSM确定这是否能使 任何正在等待的事务继续(例如,因为远程成员的出队会使本地成员处于队列的顶部) 并在适合的时候通知正在等待的事务。文中参照图5更详细论述LQSM。在图4所示的这个实施例中,持久性存储装置用于在检测到故障或从故障中恢复 时存储锁定队列的顶部要素,如根据本揭示内容将显而易见。持久性存储装置可以是 (例如)ROM、闪存、或其他非易失性存储器。锁定队列状态机(LOSM)图5图解说明根据本发明的一个实施例配置的图4所示锁定队列状态机。LQSM 可使用(例如)软件(例如C十+)、硬件(例如,门级逻辑)或硬件与软件的组合(例 如,具有多个用于实施与LQSM相关联的功能的嵌入式例程)来实施。本实施例的 LQSM实施单资源互斥算法,以出于性能及实施容错的目的利用扩展虚拟同步输送装置。更详细地说,本实施例的LQSM修改Leslie Lamport Bakery算法(见先前并入的 第60/671,373号美国临时申请案附录A的34-35页对Lamport的原始算法的简明及实 际实现),以通过利用扩展虚拟同步输送装置来提供显著改进的性能。对这种用于跨越 影响扩展虚拟同步的分布式节点复制状态机的算法的实现已提供于先前并入的第 60/671,373号美国临时申请案中(在其附录A的37页上),且还在这里再现(并在本 文中称为算法1):〃复制的状态机。〃利用安全的全有序广播原始性的功率(安全仅在所有接收机已被确认时 〃传输消息)。〃用户对状态机进行变化且在变化完成时等待调回(及在所有机器上 〃重复)。〃线程安全、分布式复制的状态机。 〃方法具有无误差返回代码以确保可靠性。《〃这个状态机类存储数据且具有执行变化的方法,〃ChangeState(Change ch)。//这个RSM的正确性无需是线程安全的。 StateMacMne state;〃来自用户的改变状态的请求。 ChangeS加eRe.cpst(Cliange cli)《〃对堆栈使用锁定类以在异常的情况下处理对破坏的锁定退出。 LocalLock lck(m—!ock》m」ock.LockO;//向包含自身的所有成员广播变化请求。SafeTcrta0yOrd鹏dBroadcjast(c^ g—LocalProcegsID);》;〃已从网络接收到状态变化请求。OriRec:dveChange(Chaiige成ProeessID MSourceProcess, LTS ltsSource)〃对堆栈使用锁定类以在异常的情况下处理对破坏的锁定退出。 JLocdLock lck(艮lcN:k);m—幽te.ChangeState(ch);TellUserAbout Stat^ha,Compldioii();creturn;}算法l用于复制实施互斥的状态机,因此产生分布式互斥算法(其使用扩展虚拟 同步输送装置)。这种使用扩展虚拟同步输送装置的分布式互斥算法的实现提供于先前 并入的第60/671,373号美国临时申请案(在其附录A的39页上)中,且还在这里再 现(并在本文中称为算法2):〃这里的状态机是进程索引的FIFO队列。对协调群组中的所有处理复 〃制所述队列。关于Lock(),将所述请求插入队列中, 〃等待复制所述请求,随后返回。在这里应注意RSM代码所完成的及 〃在锁定管理器代码中完成的。 〃每个资源均需要这类实例。 〃这种实施方案是线程安全的。eJass Singl汰esourceLodk〃这个队列是从上文的基类ReplicatedStateMachine导出的。〃基类RSM将对协调群组中的所有成员复制这个队列且确保队列具有〃相同的操作序列。 QueueOfProceases m一rsra;LockO{〃对堆栈使用锁定类以在异常的情况下处理对破坏的锁定退出。 Loca!Locfc tek(nlock);ni一loc'lc,Lock();m—rsmChangeStatdleciufet(RLMCtenge(rlm—ADD, o rooessIDLocal);〃在这个处理ID达到队列顶部时等待以信号通知事件。 WaitFoiThisRcqxiestToReachFrontOfQueue();》Unlock0LocalLock lck(m—todc); m—lock.Loclc();m—r犯LCliangeStateRequesl(RLMChang《rlmJlEMOVE, g_j>rocessIDLocal);》〃在每次状态变化时由m—rsm调用。 OnStatsChange(Change ch)JLoealLoclc kk(徵—lock);if(gjjmcessMLocal = m—rsra,Toplteni().ProccssIDO) {SignalLocalWaiterO;在FTDLM的一个特定实施例中,算法2具有下列功能(l)在不存在故障时保证 单个资源的互斥的安全及活性(例如,"未做错事(does nothing wrong)"和"终于做对某事(does something right eventually)"); (2)为了对单个资源的专有存取(例如,保证 某种等级的公平度)而对请求者的所有权FIFO授权;及(3)不要求头/主节点(以适合 针对容错群集来扩展所述算法)。算法2可经优化以用于同一节点的连续锁定请求的有效授权。更具体地说,且参 照算法2的锁定实施方案,锁定的每次获取或释放均要求1个广播及N个广播确认。 这是其中甚至同一进程反复请求同一锁定也不会有任何其他进程争夺所述锁定的情 形。在某些情形中,可能需要将网络业务和同一进程重复获取同一资源所产生的延时 成本最优化。例如,在算法2中,资源的每次释放均涉及更新共享的FIFO队列。更 新FIFO队列涉及向FIFO队列的其他复本发送消息,这是可以简化的业务。因此,在 一个实施例中,将本地旗标(例如IsRdeased旗标)添加到尚未被复制的类(且因此 不应在状态机类中)中。在释放时,确定所述FIFO队列中是否存在正等待所述资源 的进程。如果是,则通过更新共享的FIFO队列向所述进程赋予锁定。如果否,则不 更新FIFO队列。而是,将本地旗标设定或另外标记为真(TRUE)。现在,可仅通过 检査这个本地旗标而立即返回来自本地进程的下一Lock()(而不更新FIFO队列)。如果 在OnReceive()调回中从另一进程接到对这个资源的请求,则执行对HFO队列的更新。 随后,如果本地旗标为真,则通过最后更新FIFO队列而放弃所述资源。这种优化的单资源锁定算法的实现提供于先前并入的第60/671,373号美国临时申 请案中(在其附录A的40页上),且还在这里再现(并在本文中称为算法3):《QueueOfProc^sses mj鹏 naloek丄ock();if( IsThisProeessAkead;yliiFrontOfQiieuc()) return;elsemJblsRdeasedBtttStilInQu, = FALSE;mjsni,Clia零'StateRequ(Sst(RLMChange(rim—ADD'g_p'rocessIDLocal); WaitiPorThisRequ.estToReachFrontOfQueue();LocalLock lck(m」ock);m—WsRd標sedBut.St孤tiQueue - TRUE; 〃在每次状态变化时由m—rsm调用。OnStatcOiaoge(aiange eh)LocalLock 1dc(m—lock); m—lodcLockQ;SignalLwalWaiter();》else i《m WsR(2leasedB敏SU!ltoQueue)〃放弃令牌的时间。ra i'sm,ChangeStateR岡uest(RLIVlChaiige(rliii—REMOVE, g_processEDLocal);〃否则,将是某一其他人的锁定请求及授权,且我们保持其以用于容 〃错可用性。》;图5所示LQSM具有6个输入OnEnqueue、OriDequeue、OnEnqueueAndDequeue、 OnLock、 OnReset及OnTransactionComplete。每个事件的语义如下OnEnqueue:这个成员或远程成员先前己发送入队消息(因为所述成员已请求锁 定),且输送装置现在正向LQSM传递所述消息;OnDequeue:这个成员或远程成员先前已发送出队消息(先前拥有锁定的成员已 不再需要所述锁定且释放所述锁定以允许队列上的下一成员使用所述锁定),且输送装 置现在正向LQSM传递所述消息;OnEnq腿eAndDequeue:这个成员或远程成员先前已发送EnqueueAndDequeue 消息(成员仍需要所述锁定但暂时释放所述锁定以允许公平度),且输送装置现在正向 LQSM传递所述消息;OnLock: LMSM经由这个事件向LQSM通知应用程序对锁定的请求;OnReset: LMSM通过这个消息向LQSM通知存在先前故障且系统已从故障中恢 复;及OnTransactionComplete: LMSM通过这个事件向LQSM通知关于应用程序的事务 的完成。参照图5 (以及图6及7),应注意椭圆代表状态机的状态。每个箭头均具有分别 标记为"E"或"A"的事件及动作。事件会触发转换以及箭头中的动作。在本实例性 实施例的图式中未明确描绘的事件是不可能的或被忽略的(例如,既不会导致发生状态转换也不会执行任何动作)。如图5中可见,LQSM算法实施数个性能优化。如果节点"A"在队列顶部且队 列大小为1,则允许同时或连续运行无限量的事务。如果"A"在队列顶部且队列大小 大于1,则允许在其他事务被阻塞时运行及提交预定数量的"n"个未决事务。在提交 这"n"个事务后,释放所述分布式锁定。完成这一步以实现两个特性(1)通过增加 针对每次逐节点的分布式锁定转移而完成的工作量来提高性能,及(2)通过确保极主 动的成员释放所述锁定以便其他节点可使用所述锁定来提高公平度。出于性能的原因, 根据本发明的一个实施例在瞬时存储器中存储/更新所述队列(然而,应注意,假设可 容忍相关联的延时,则可使用持久化数据结构)。出于可靠性的原因,将队列的顶部要 素复制到持久性存储装置处,并在检测到故障或从故障恢复时从持久性存储装置读取。图5所示LQSM的实施例的此瞬时数据结构如下。GrantedTransactions -已授予(当前持有)这个锁定的事务组。这些事务正执行 或等待其他锁定。虔欲..bGrantedTransactions()、 bQuantumTransactionsRunning()。 写 A , ClearTransactionState() 、 ProcessTransactionCompleted() 、 UnblockTransaction()、 UpdateTransactionTLists(tme)。LockQueueQuantumSize -在这个成员处构成量程的事务数。只读。z,耽, bQuantumReached() 、 bQuantumTransactionsRunning()。Queue-持有正等待锁定的成员的队列。这个队列的头部的成员持有锁定。度攻 bMemberWaiting() 、 OnReset()。 写人'OnReset、 ProcessDequeue()、 ProcessEnqueue()。TotalTransactionsGrantedForThisQuantum -在这个量程期间已执行的事务数。如 果存在等待者,且已达到这个量程,则所述成员将释放锁定。變攻:bQuantimiReached()。 写乂 , ResetTotalTransactionsGrantedForThisQuantum() 、 UnblockTransaction()、 UpdateTransactionLists(true)。Waiting Transactions -正等待这个锁定的事务组。z卖欲,UnblockTransactions()、 bWaitingTransactions()。 写/\ ; ClearTransactionState() 、 UnblockTransaction()、 UpdateTransactionLists(false)。图5所示LQSM的实施例的功能定义如下。bCanUnblockTransaction()—如果不满足bQuantumTransactionsRunning()且(不满 足bMemberWaiting()或不满足bQuantumReached()),则返回真。否贝lj,返回假。 ClearTransac;tioriStateO-清除持有等待及授予的事务组的数据结构。 Dispatch()-发送准备调度的入队及出队消息组。bGrantedTransactions()-是否存在任何已授权的事务? 如果是,则返回 GrantedTransactions.size()〉0 。bMemberWaiting()-如果队列大小大于1 ,则存在正等待的成员。返回 Queue.size()〉1 oOnReset(Configuration)-所传递的配置已输入"正向进程",意指LMSM已从配置变化中"恢复"。然而,这个新配置可能不包含所有出现在前一配置中的成员;移除 所述锁定队列中未出现在新配置中的任何成员;从这个进程中排除头部锁定,必须考 虑由消失的成员持有的锁定。新的锁定队列可能己安装;LQSM需要重设。确定在(调 用DetermineState())时重设应以哪种状态开始。随后,假设给出开始状态,则处理重设 (调用ProcessReset(state))。DeteraiineState()-如果这个成员不在队列中,则将状态设为"这个成员不在队列 巾"。否则将状态设为"这个成员在队列中但不持有锁定"。OnLock(XactID, LockSet) -重申所述事务要求的锁定组。针对所述锁定组中的每 个锁定,调用OnLock(XactID, LockID)(这可能使得准备入队消息),且调用Dispatch()(这 将导致发送任何准备好的入队及出队消息)。OnTransactionCompleted(XactID, LockSet)-重申所述事务持有的锁定组。针对锁 定组中的每个锁定,调用OnTransactionCompleted(XactID, LockID)(这可能导致准备入 队及出队消息),及调用Dispatch()(这将导致发送任何准备好的消息)。PrepareDequeueMessage(ThisMcmber, LockID)-例示出队消息,其包含正被释放 的锁定(这个锁定)及请求将所述锁定释放的成员(这个成员)。将这个出队消息添加 到将要调度的消息组。PrepareDequeueAndEnqueueMessage(ThisMember, LockID) —例示出队及入队消 息,其包含被释放及重请求的锁定(这个锁定)及请求所述出队及入队的成员(这个 成员)。将这个出队及入队消息添加到将要调度的消息组。PrepareEnqueueMessage(ThisMember, LockID)-例示入队消息,其包含正请求的 锁定(这个锁定)及正请求所述入队的成员(这个成员)。将这个入队消息添加到将要 调度的消息组。ProcessDequeue(Member)-从队列头部移除所述成员。ProcessEnqueue(Member)—将所述成员添加到队列尾部。ProcessLock(XactID, LockID)-调用UpdateTransactionLists(false)。向锁定管理器 状态机返回假,这将阻塞正调用的线程。ProcessLockWhenInThisMemberHoldsTheLock(XactID, LockID)—如果满足 bCanUnblockTransaction(),则调用UpdateTransactionLists(true)并返回真。否则,调用 UpdateTmnsactionLists(false),并向锁定管理器状态机返回假,这将阻塞正调用的线程。ProcessReset(State)女口下If State = - 'This member加t in queue, IfbWaitin^TrsnsactionsOSend an enq卿e mmage (not a tiatch message)ReturnElse if the state is *TMs member in queue but does not hold lock' If Queue-Top = = TbisMberSet state to 'This Member Holds Lock'ElseReturnElse if the state is 'This Member Holds the Lock' IfbSkmldRdease()Set state to 'Waiting for transactions to complete'ElseReturaElse if the state is 'Waiting for transactions to complete'If NOT bGrantedTran&actionsO AND bWaitingTVansactionsSet state to 'Enqueue and Dequeue message requested'Send an enqueue and dequeue message (not a batch message) If NOT bGrantedTramactionsO AND NOT b^WaitingTrausactwiisSet站ate to Dequeue message requested'Send a d,eue message (加t a batett message)ProcessLockWhenInThisMemberNotlnQueue(XactID, LockID) — 调 用 PrepareEnqueue()以创建这个锁定的入队消息,且将其添加到将要调度的消息组。调用 UpdateTransactionLists(false)。向锁定管理器状态机返回假,这将阻塞正调用的线程。ProcessTransactionCompletedWhenInThisMemberHoldsTheLock(XactID)—如果事 务完成,且不存在正在等待的成员,则另一事务可在量程中代替所述已完成的事务。 ProcessTransactionCompleted(XactID)。如果不满足 bMemberWaiting() 及 bWaitingTmnsactions(), 贝U满足UnblockTransaction()。ProcessTransactionCompleted(XactID)-从所授予的事务组中移除所述事务。bQuantumReached()-如果这个成员已将锁定授予LockQueueQuantumSize事务 贝U为真。返回TotalTransactionsGrantedForThisQuantum >= LockQueueQuantumSize。bQuantumTmnsactionsRunning()-如果存在当前执行的LockQueueQuantumSize事 务则为真。如果满足GrantedTransactions.size()>= LockQueueQuantumSize,则返回真。 否则,返回假。ResetTotalTransactionsGranted() - 4每TotalTransactionsGrantedForThisQuanrum设为0。bShouldRdease()-假设存在等待成员且无运行的事务,则如果不存在等待的事务 或这个成员己开始其事务共享(量程)就应释放。如果不满足bWaitingTransactionsO 或bQuantumReached(),则返回真。否则,返回假。UnblockTransaction()-从正在等待的事务组移除下一事务。将所述事务添加到授 权事务组。TotalTransactionsGrantedForThisQuantum递增。为所述事务消除阻塞。UnblockTransactions()- 重申所述正在等待的事务组。在 (bCanUnblockTransaction())为真时,调用UnblockTransaction()。UpdateTransactionLists(transactionlsGranted)—如果满足transactionlsGranted,贝U将 所述事务添加到授权事务组,且TotalTransactionsGrantedForThisQuantum递增。如果 不满足transactionlsGranted,则将所述事务添加到正在等待的事务组。bWaitingTnmsactions()-如果存在等待的事务,也就是说如果正在等待的事务组 不为空则为真。定额计算状态机(OCSM)图6图解说明根据本发明的一个实施例配置的图4所示定额计算状态机。QCSM 可使用(例如)软件(例如0++)、硬件(例如门级逻辑)或硬件与软件的组合(例如具有 多个用于实施与QCSM相关联的功能的咴入式例程的微控制器)来实施。本实施例的 QCSM保证在面临网络分割及进程故障时的互斥。更详细地说,无论何时出现网络分割,则每个成员处的扩展虚拟同步输送装置(或 其他适合的全序输送装置)均能够确定所述特定成员可达到的远程成员组。这个组称 为当前配置。输送装置经由规则/传统配置消息向QCSM提供这个信息。假设给定当 前配置及总成员关系,则每个成员能够计算当前配置是否构成总成员关系的大部分。 如果是,则当前配置被称为具有定额。具有定额的配置称为基本组件(每标准命名法)。 其他配置称为二级组件。正式地(及可查证地),假设成员关系有任何分割,则可存在 最多一个基本组件。图6所示QCSM的实施例以下列方式将经修改的定额用于更大的容错。每次 QCSM确定本地成员是基本组件的一部分(转换到"在基本组件中"状态),QCSM 就保留基本组件(使用动作PersistPrimaryComponent)。在当前配置主要满足薪一^:才 邀伴时达到定额条件(与在当前配置主要满足^^ ^关系时相反)。这个条件使得达到 定额变得更简单,且继续维持在成员关系的仟一分割中均仅有一个基本组件。QCSM可被理解为想要获得当前成员的逻辑,其以"不在基本组件中"状态开始, 通过广播各种全有序安全消息且通过大量状态进行转换而进入基本组件,如图6中显 示。在QCSM进入"在基本组件中"状态时实现目标。FTDLM使用QCSM计算当前成员是否属于基本组件。经由 ForwardEnteringPrimary通告向锁定管理器状态机(LMSM)通知这个QCSM转换。 LMSM确保仅在当前成员在基本组件中时才允许所述成员在Lock()调用中成功。结合其中一次可仅有一个基本组件的条件,这会确保甚至在出现网络分割时也不会向两个 成员授予同一锁定的所有权。以根据本揭示内容将显而易见的在某些点处保留某些数据结构作为补充,这个锁 定算法还足以用于容忍进程故障。每个成员均具有其成员名称的保留记录(例如不变 的唯一识别符)及成员关系(例如成员名称的不变列表)。恢复-当先前发生故障的成员重新连接到群组时,需要更新所述恢复成员的 FTDLM的内部状态。QCSM实施这个逻辑。更详细地说,这个拓扑变化是由输送装 置检测且经由配置消息(例如,OnRcvRegConf或OnRcvTransConf)报告给QCSM的。 这将最终导致对SendQuorumState的调用。这个信息足以使每个成员确定其是否具有 权威(例如,最新)数据(例如,通过在已接收到所有定额状态消息之后检查其是否 具有最大基本组件数)。如果是,则所述成员使用SendLockMgrState广播其锁定状态 (例如锁定队列)。容忍所有成员同时发生故障-存在两种可能要求额外逻辑的故障情形。两种情形 均涉及基本组件中所有进程的同时故障。出于性能的原因,且在一个特定实施例屮, 仅在无故障正向处理期间在瞬时存储器中更新所复制的锁定队列。如果针对每次锁定 转移更新锁定队列,则这个部分描述的逻辑是多余的。然而,可能需要具有在无故障 处理期问仅在瞬时处理中操作的性能以及容错的能力一者;因此在此处描述所述逻辑。如果-一个成员发生故障且其他成员残存,则所恢复的成员可经由状态交换协议从 残存成员获取最新队列(如图6中显示,所述状态以等待开始以接收所有定额消息)。 在所有成员同时发生故障时,不存在从中获取权威队列的残存成员。这种类型的故障 可被广义划分为两类,因为其要求不同的解决方案所有成员故障情形,及带分割的 所有成员故障情形。在所有成员发生故障的情形中,在所有成员均发生故障时基本组件的成员正处理 事务及在各成员之间交换锁定所有权。不从基本组件中分割任何成员。基本组件中的 成员可能因为已授予锁定而正使用资源(例如,写入共享数据段)。此外,在发生故障 时锁定队列的状态是未知的。从这种类型的故障中恢复的一个实施方案相依于下列观测为正确恢复,QCSM 仅需要确保在发生故障时出现的所有成员在恢复(例如,基本组件的形成)期间必须 出现。具体来说,安装(或恢复)在发生故障时出现的锁定队列不是必需的。这种洞 察允许导出算法,借以使锁定队列在无故障处理期间无需持续更新。在所述成员已恢复时,其可以空锁定队列开始。在恶性故障之前出现的活动可能 尚未完成。在恢复时,如果所有成员同时恢复,则这个FTDLM的客户端实施其中查 看恢复成员的状态且将所述状态同步以便所述状态保持一致的算法。由于先前有效的 所有成员一起恢复,则这个同步所必需的所有信息均可用。假设先前的基本组件中的 成员在这个所有成员发生故障的情形中并未一起恢复,则不保证安全恢复。例如,如 果丢失的成员本来持有锁定且已提交数据更新,则在恢复时,其他成员在没有首先获得所有先前提交的变化时应不能获得那些锁定及提交的变化。为保证所有成员一起恢复,QCSM在严格的时间保留正向处理成员组(FPMS) 且进行检査以在报告其已实现定额(例如,本地成员己加入基本组件)之前确保在进 行恢复时至少这组成员会出现。这个实施例的QCSM在三个明确的时间点处处理 FPMS: (1)在形成基本组件时,(2)在由配置变化结束基本组件时,及(3)在交换 定额状态时。FPMS维持在形成基本组件时的活动在形成新的基本组件时(进入"在基本组 件中"状态),构成基本组件的成员组还界定FPMS。所述FPMS由锁定管理器状态机 中的PersistFPMS动作保留(其将参照图7而更详细描述)。对于有效实例,假设基本 组件由成员A、 B及C形成。在所述基本组件的持久时间内且A、 B及C正向处理时, FPMS由A、 B及C组成。每个基木组件的使用寿命由从输送装置经由OnRcvRegConf 或OnRcvTransConf接收的配置变化消息结束。配置控制消息还从前一配置移除或添 加成员。在上述有效实例中,如果成员B已发生故障或被分割则配置变化消息可(例 如)移除成员B。还可以添加已恢复或再合并的另一成员(例如D)。FPMS维持在接收到配置变化时的活动在接收到配置变化消息时,从FPMS移 除丢失的成员。随后使用PersistFPMS动作再次保留FPMS。在匕述有效实例中,如果 传递新的配置为A、 C、 D,则从FPMS移除成员B。再次保留新的FPMS为A、 C。 在这点未添加成员D。FPMS维持当在QSM状态期间发生交换时的活动最后,QCSM在交换定额状 态消息时处理FPMS。所述配置中的每个QCSM实例包含FPMS作为其定额状态在 SendQuommState动作中的一部分。随后确定新配置的FPMS,借以作为由新配置中的 每个成员发送的FPMS的联合。这显示为图6所示QCSM实施例中的DetermineFPMS 动作。在上述有效实例中,A和C二者均发送FPMS为A、 C。己加入所述配置的D可 发送FPMS为D、 E。如果将D和E分割在一起、二者相继发生故障且仅D恢复,则 这可能发生。则在这种情形中,新配置的FPMS将是A、 C、 D、 E。仅在这个新FPMS 存在且随后实现正向处理(经由基本组件的形成)时需要保留这个新FPMS。在形成 新的基本组件为A、 C、 D时,将需要提供A、 C、 D、 E的FPMS以实现正向处理。 由于这不是实际情况,则在成员E恢复并与基本组件再合并(通过满足上述不变性来 保证正确性)之前不允许发生正向处理。容忍与所有成员故障同时发生的分割故障在一基本组件分割及所产生组件的一 个(或多个)中的所有成员发生故障、恢复、随后再合并时出现其他同时问题。考虑 基本组件为成员A、 B及C。在这个有效实例中,假设将成员B (其持有某些锁定) 与A、 C分割开来。如果不存在进程故障,就不存在出错的风险A及C维持其瞬时 锁定状态且知道B持有锁定。A和C将不能改变由B持有的锁定所提供的数据。在B 再合并时,其可持有在分割之前对其持久存储器做出的变化,但在分割发生之前不将其复制到A及C。在B再合并时,其可将这些变化安全发送到A及C, A及C因为 顾虑到B持有的锁定而不能持有相矛盾的变化。进一步再次考虑基本组件A、B、C,且和前面一样将B和(A,C)分割开来成为(A,C〉 和{8}。现在假设A及C 二者均发生故障。瞬时状态丢失且A及C将不再记得B持 有的锁定。成员A及C处的FPMS是(A,q。假设仅有所述FPMS信息,则所述算法 将允许A和C 一起恢复、进入基本组件、及干扰互斥保证(因为A和C可以获取B 仍持有的锁定)。本论述示范了在存在分割及所有成员故障时上述FPMS设备并不满足需要。因此, 图6所示QCSM的实施例包含分片保留以处理这种情形。通过介绍这种能力(分片保 留),FTDLM能够在面临进程或网络故障的任意组合时维持互斥。片所述片是(锁定名称,锁定所有者)的有序对组,其中锁定所有者是对应于锁 定名称识别的每个锁定的每个队列的顶部要素。在配置变化消息结束基本组件时,保 留所述片。在图6所示QCSM实施例中,这是由PersistSlice动作代表的。一般根据基本组件的版本来自动保留所述片。因此,每个成员持有两个锁定队列 状态实例,其二者的版本分别是(1)保持在瞬时存储器中的锁定状态(称为"瞬时 锁定状态"),及(2)持久锁定状态(称为片)。出于性能的原因,片有时相对于最近 的瞬时锁定状态是过时的。下列算法的目的可用于确保这些矛盾不会产生错误语义(1)在配置变化使基本 组件结束时保留所述片。(2)在先前所述锁定状态交换中仍包含所述片。在接收到所有 定额状态消息时, 一个成员(确定为最新的)经由SendLockMgrStateIfNewest()发送其 锁定状态的最近版本。所发送的锁定状态可以是瞬时或持久锁定状态,无论如何其均 具有最大索引。在正常处理过程中,瞬吋锁定状态将较新。然而,如果进程从故障中 恢复,则其将不具有瞬时锁定状态且因此将替代地发送其片。(3)每个成员使用 OnRcvLockMgrState传递锁定状态消息。如果所接收的锁定状态比当前的瞬时锁定状 态更新,则远程锁定状态覆写所述本地瞬时锁定状态。如果所传递的锁定状态比本地 保留的片更新,则所传递的锁定状态及其索引将作为所述片的新版本而安装。继续先前的有效实例,回顾成员A、 B、及C形成基本组件。B与(A,C)分割开来, 且B持有锁定。这时,A及C将保留其锁定状态作为片。所保留的锁定状态将包含由 B保持的锁定。随后A及C一起发生故障,丢失其瞬时锁定状态。然而,在恢复时, A和C二者将所保留的片安装为其瞬时锁定状态,因此修复由B保持的锁定。在B恢 复时,其将能够安全地与A及C再合并。锁定状态的版本化各成员间的锁定状态交换补充有在每个成员处维持的版本 数。当所述成员处的QCSM进入基本组件且如图6所示QCSM的实施例中所述在各 种时间进行保留时,增加所述数字。故障恢复及锁定状态交换为有效起见,在恢复期间在各成员间转移最小量的锁 定状态信息。利用版本数确定最新成员,且所述成员会广播其状态。实现这种优化(利用扩展虚拟同步的语义)的结果是当前的基本组件中也是先前基本组件的一部分的所 有成员将具有完全一致的锁定状态。因此,仅需这些成员的一个广播其锁定状态。在操作中,当传递新配置后,每个成员发送具有其版本的状态消息。每个成员从 所述配置中的所有其他成员处接收所述消息。每个成员均确定具有最大锁定版本的成 员。如果存在联系,则选择以字典顺序的第一个成员ID来发送其锁定状态。其他与可 变公平度相关联的仲裁技术也可用于此处。下文是图6所示QCSM的这个实施例的持久化数据结构。正向处理成员组-在所述配置中需要出现以实现正向处理的成员组。度攻.-^M5M.DetermineFPMS()、 gSM.SendQuorumStateMessage()。写A ,丄MS7kf.PersistFPMS()、 ZMW.PersistConfigurationAsFPMS()。锁定# -这是锁定组及其所有者,及指派给这组值的版本。 GSM.SendLockMgrStatelfNewestO 。 写 A , gSM.OnRcvLockMgrState()、 ,/.PersistSlice()。锁定^"索引-这是锁定^f的索引或版本。这和其中写入锁定A的基本组件的索 引是匹配的。^攻.'gSM.OnRcvLockMgrState()、 ^SM.SendLockMgrStatelfNewest()、 0SMSendQuommStateMessage() fgSM)。写乂 , ^S"M.OnRcvLockMgrState()、 ^W.PersistSlice()。成员关系-这是作为成员关系的一部分的成员组的持久记录。虔攻.-gSM.IsQuorum()。写A:只读。基本组件-这是这个成员作为其一部分的最近基本组件。这包含配置(一组成 员)及版本,其称为基本组件索引。虔欲GSM.PersistPrimaryComponent()、 g5"M.SendQuorumStateMessage()。写A: g57kf.PersistPrimaryComponent()。权数—在定额计算中为这个成员指派的权数。Z,欲.-g5MSendQuorumStateMessage()。写入'只读。下文是图6所示QCSM的本实施例的瞬时数据结构。配置-这个配置包含所述配置中的成员组,且还包含识别所述配置的ID。与扩 展虚拟同步输送装置发送的消息相反,由状态机发送的消息是在同一配置中发送及传 递以便于应用。如果否,则放弃所述消息。因此,所述配置由状态机的发送及接收功 能定期读取。攻,HasReceivedAllStateMessages() 、 PersistPrimaryComponent()、 SendLockMgrStatelfNewest()。写乂, OnRcvRegConf()。正向处理成员组-需要在所述配置中出现以实现正向处理的成员组。在QCSM 交换定额状态时确定瞬时FPMS,且随后由锁定管理器在其尝试进入"正向处理"时 读取。渎欲-.丄M5M.blsFPMSPresent()。DetermineFPMS()。定额状态消息-在配置改变时,新配置中的每个成员均使用这些消息交换其定 额状态。定额状态消息存储在其中根据发送成员的分类次序将其分类的数据结构中。 達教 ..DetermineFPMS() 、HasReceivedAIlStateMessages() 、IsQuorum()、SendLockMgrStatelfNewest()。写人'OnRcvQuorumStateMessage()、 OnRcvRegConf()。 下文是图6所示QCSM的本实施例的功能定义。DetermineFPMS()—重申定额状态消息组。从每个消息读取FPMS。联合每个 FPMS以便形成包含于定额状态消息中的成员超集。将其存储于瞬时存储器中,锁定 管理器状态机将在其执行bFPMSIsPresent()时读取所述消息。ForwardEnteringPrimary()-向锁定管理器状态机转发OnEnteringQuorum通告。 ForwardRegConf(Configuration) -向锁定管理器状态机转发OnRcvRegConf通告。 ForwardTransConf(Configuration)—向锁定管理器状态机转发OnRcvTransConf通告HasReceivedAllStateMessages() -如果持有定额状态消息的数据结构的大小与配 置的大小相同则为真,否则为假。IsQuomm()-重申定额状态消息。每个定额状态消息均包含发送成员及在定额计 算中赋予所述成员的权数。检索这些值。每个定额状态消息均包含其中发送成员是其 一部分的先前基本组件。使用基本组件索引为这些组件这个基本组件用于确定这个配 置是否可实现定额。如果系统是第一次工作,则可能在任一定额状态消息上均不存在 有效的先前基本组件。如果存在先前基本组件,则新配置必须包含在先前基本组件中 出现的加权多数成员。如果不存在先前基本组件,则从持久存储器读取成员关系。在 这里,新配置必须包含持久成员关系中的加权多数成员以实现定额。OnRcvLockMgrState()-从锁定状态消息读取锁定索引。如果这个索引大于所保 留片上的索引,则将来自锁定状态消息的锁定状态及索引写入持久存储器作为新的保 留锁定片。如果这个索引大于由锁定管理器状态机保持的瞬时锁定状态,则将来自锁 定状态消息的锁定索引及锁定状态安装到锁定管理器状态机上作为新的瞬时锁定状 态。OnRcvQuorumStateMessage()-将定额状态消息存储于瞬时存储器中。 OnRcvRegConf(Configuration)-瞬时存储所传递的配置。起始将保持所传递的定额状态消息的数据结构。调用ForwardRegConf(Configuration)。OnRcvTransConf(Configuration) -调用ForwardTransConf(Configuration)。 PersistPrimaryComponentO -从持久存储器读取基本组件索引的当前值。将这个值递增;结果是基本组件索引的新值。保留这个新值,以及这个配置中的成员组作为新的基本组件。将所述基本组件索引的新值写入锁定管理器状态机作为瞬时锁定状态的新索引。所述瞬时锁定状态的索引反映基本组件索引。PersistSlice()-从锁定管理器状态机的瞬时存储器获得锁定所有者的当前组。从锁定管理器状态机的瞬时存储器获得当前的基本组件索引。持久存储这些索引作为新的锁定片。Sendl.ockMgrStatelfNewest()-如果配置大小大于l,则需要发送锁定状态。如果 所述配置中仅存在一个成员,则无需发送锁定状态。重申定额状态消息组。回顾根据发送消息的成员的分类次序来将定额状态消息分类。找出具有最高锁定索引的定额状 态消息。仅一个成员需要发送锁定状态消息。如果多于一个成员具有带最高索引的锁 定状态,则选择分类次序中的第一成员。如果这个成员是需要发送锁定状态的成员, 则确定应发送锁定管理器状态机的瞬时锁定状态还是持久锁定#。在读取这两个的索 引后,发送最新的锁定状态。如果瞬时锁定状态和持久锁定片二者具有同一索引,则 优选瞬时锁定状态,因为其包含整个锁定队列(包含等待者)而非仅拥有者。SendQuorumStateMessage()-创建新的定额状态消息,同时送所述消息。定额状 态消息中的数据包含下列这个成员所属的最近基本组件(这是从持久存储器读取的, 且包含基本组件中的成员组及基本组件索引);在定额计算中使用的这个成员权数(这是从持久存储器检索的);这个成员属于其最后一部分的正向处理成员组(这是从持久 存储器检索的);及由锁定管理器状态机保持在瞬时存储器中的锁定索引和持久锁定片 上的锁定索引的最大值(这些值的较大者是这个成员已知的最新锁定状态)。 锁定管理器状态机(LMSM)图7图解说明根据本发明的一个实施例配置的图4所示锁定管理器状态机。 LMSM可使用软件(例如C++)、硬件(例如门级逻辑)或硬件与软件的组合(例如具有 多个用于实施与LMSM相关联的功能的嵌入式例程的微控制器)来实施。出于论述的 目的,假设使用FTDLM的在线事务处理(OLTP)型应用程序,其中如果所述事务退 回则所述应用程序再试所述事务。假设使用这个模型,则FTDLM使用LMSM实施具 有故障的语义,这会保证互斥及易于应用程序正确性。更详细地说,图7所示LMSM的实施例会确保在QCSM离开"在基本组件中" 状态时,(l)允许来自未决事务的TransactionCompleted通告无误差地完成,及(2)阻塞 或中止新的锁定请求。这个LMSM还实施FPMS保留及检杳以确定先前所述容错。 LMSM的这个实施例还实施事务性双相锁定语义,以确保执行事务所要求的多个资源 的合式锁定及释放。下文是图7所示LMSM的本实施例的瞬时数据结构。配置-所述配置由规则配置消息或传统配置消息传递且由LMSM高速缓存。 LMSM发送的入队及出队消息需要由同一配置发送及接收,否则将其丢弃。因此,状 态机的发送及接收功能定期读取所述配置。鍵欲blsFPMSPresent()、 LgSM.OnReset(Configuration)、 PersistConfigurationAsFPMS()、发送及接收LMSM消 息的功能。写乂 CacheConfiguration()。InFlightTransactions -当前执行或未决的事务组。7荬欢NotifyThreads()、 ProcessLock() 、 ProcessTransactionCompleted()。 写 乂 CreateXact()、 ProcessTransactionCompleted() 、 RollbackAllXacts()。Locklndex - Locklndex用于解释说明锁定状态。这个索引对应于其中写入这些锁 定队列的基本组件的索引。鍵攻^SM.OnRcvLockMgrState()、 gSMPersistSlice()、 g57l/.SendLockMgrStatelfNewest() 、^S7lf.SendQuorumStateMessage()。写A :25MOnRcvLockMgrState() 、 05MPersistPrimaryComponent()。LockState -瞬时锁定队列。渎教0SMPersistSlice()、 ^W.SendLoc固grStatel飾west()。写人Q嵐OnRcvLockMgrState()。NextTransactionID -用作事务ID的下一个值。单调递增。如果进程故障则可将这 个值重设为0;仅在瞬时存储器中追踪事务。误^砍CreateXact()。 S乂 CreateXact()。下文是图7所示LMSM的本实施例的功能定义。CacheConfiguration(Configuration)-由传统或规则配置消息传递配置并将其写入 瞬时存储器。CreateXact()—每个事务由具有唯一 ID-TransactionID-的事务对象代表。获得下一 TransactionID,用其为这个事务例示一事务对象。将所述新事务添加到持有未决事务 组的瞬时数据结构。TransactionID递增。DetermineFPMS()-已将新配置传递到LMSM。从持久存储器读取当前FPMS。 新的FPMS是当前FPMS和新传递的配置的交集。也就是说,可从所述FPMS移除任 何在所述FPMS中但不在新传递的配置中的成员。如果所述新FPMS不同于先前FPMS 则使用PersistFPMS()保留所述新FPMS。blsFPMSPresent() — QCSM己进入"在基本组件中"状态,且LMSM正尝试进入 正向处理状态。LMSM读取FPMS以在QCSM交换定额状态时以DetermineFPMS() 将QCSM高速缓存。如果整个这个成员组都出现在当前配置中,则LMSM可进入正 向处理状态中。如果否,则LMSM停留在阻塞新事务状态,直到形成在FPMS中包含 所有成员的基本组件。NotifyThreads()-LMSM进入正向处理状态。重申未决事务组。通知基于LMSM 的状态阻塞的任何线程。不通知因为锁定不可用而阻塞的线程。PersistFPMS()-获取DetennineFPMS()的结果并将其写入持久存储器作为 FPMS。PersistConfigurationAsFPMS()-读取所述配置并将其写入持久存储器作为 FPMS。ProcessLock(XactID, LockSet)-从未决事务组检索所述事务。如果所述事务未出 现则表示其已[大l调用线程及返回的异常而退回。如果所述成员正进行正向处理,则针 对锁定组中的每个锁定调用LQSM.OnLock(XactID,LockID)。否则阻塞正调用的线程。ProcessTransactionCompleted(XactID)-从未决事务组中检索所述事务。如果所述 事务未出现则表示其已因正调用的线程及返回的异常而退回。如果所述事务是只读事 务(不保持锁定),则将其从未决事务组中移除并返回。如果所述成员正进行正向处理, 则针对所述事务保持的每个锁定,使用OnTransactionCompleted(XactID)调用锁定队列 状态机。从未决事务组移除所述事务并返回。在所述成员未进行正向处理时阻塞所述 正调用的线程。RollbackAllXacts() -清除未决事务数据结构。调用锁定队列状态机动作Clear TransactionState()。WaitForNotify()-在配置变化期间,且在所请求锁定不可用时,阻塞来自LMST 的线程请求服务。WaifForNotify()阻塞所述正调用的线程。上述对本发明实施例的说明是出于例示及说明的目的而提供的。本文不意欲穷尽 或将本发明限制于所揭示的精确形式。根据本揭示内容还可以做出许多修改及改变。 本发明的范畴并不意欲由这个详细说明限制,而是由随附权利要求书限制。
权利要求
1、一种分布式锁定管理系统,其包含多个分别以通信方式耦合到网络的节点,所述系统包括每个节点处的数据库,其用于存储由在所述节点的一者或多者处操作的应用程序所使用的资源;每个节点处的容错分布式锁定管理器(FTDLM)模块,其用于调节所述应用程序对所述资源的存取,所述FTDLM模块针对每个资源均具有一队列,所述队列识别拥有所述资源的分布式锁定的节点,其中跨越所述节点复制每个队列;及每个节点处的全序输送装置模块,其用于以通信方式将所述节点耦合到所述网络,并对各节点之间的消息接发施加全排序协议。
2、 如权利耍求1所述的系统,其中所述FTDLM模块中的所述队列是FIFO队歹ij, 且每个对应资源的分布式锁定所有权被转移到所述队列中以FIFO次序识别的等待节 点。
3、 如权利要求1所述的系统,其中所述全序输送装置模块被实施为扩展虚拟同 步输送装置。
4、 如权利要求1所述的系统,其中所述全序输送装置模块利用所述网络的多播 能力以确保依序传递消息。
5、 如权利要求1所述的系统,其中如果节点拥有资源的分布式锁定,且无其他 节点正等待所述资源,则所述FTDLM模块允许所述资源上无限制数量的事务同时或 连续运行。
6、 如权利要求l所述的系统,其中如果节点X拥有资源的分布式锁定,且其他 节点正等待所述资源,则所述FTDLM模块允许所述资源上的预定数量的未决事务运 行及提交,且随后释放对所述分布式锁定的所有权。
7、 如权利要求6所述的系统,其中一旦所述FTDLM模块释放对所述分布式锁 定的所有权,则将所述节点X放置在所述队列中,且在其他节点完成对所述资源的使 用后,节点X重新获取对所述分布式锁定的所有权。
8、 如权利要求l所述的系统,其中在资源的分布式锁定所有权被转移到节点时, 所述FTDLM模块允许所有等待所述资源的事务同时执行。
9、 如权利要求l所述的系统,其中将所述全序输送装置模块集成到所述FTDLM 模块中。
10、 如权利要求l所述的系统,其中在正使用分布式锁定的节点处提交所有事务 后,所述FTDLM模块将对所述锁定的所有权保持在所述节点处,直到或除非另一节 点请求所述分布式锁定。
11、 如权利要求l所述的系统,其中所述FTDLM模块使用调度以确保以一定的公平度将资源存取分布在所述节点之间。
12、 如权利要求l所述的系统,其中所述FTDLM模块允许N个事务在释放分布式锁定之前运行。
13、 如权利要求l所述的系统,其中在正常的正向处理期间在瞬时存储器中更新 所述队列。
14、 如权利要求13所述的系统,其中所述队列是FIFO队列,且当检测到故障或 从故障中恢复时,每个队列的顶部要素被复制到持久性存储装置中及从所述持久性存 储装置中读取。
15、 如权利要求l所述的系统,其中所述FTDLM模块能够通过单个多播消息中 数个分布式锁定的分批入队及出队而在一个安全的全有序广播中跨越节点获取及释放 多个分布式锁定。
16、 如权利要求15所述的系统,其中所述单个多播消息用于分级锁定所有权转移。
17、 如权利要求l所述的系统,其中存储于任何一个数据库中的资源可由操作于 不同节点上的应用程序同吋存取,且甚至在面临进程故障或网络分割时仍维持数据一 致性。
18、 如权利要求1所述的系统,其中所述系统利用所述全序输送装置的扩展虚拟 同步语义以实施基于成员关系定额的故障恢复系统,其中达成一致的成员关系被本地 保留于每个节点处。
19、 如权利要求l所述的系统,其中所述FTDLM模块进一步包括-定额计算状态机,其耦合到所述全序输送装置模块,用于基于本地保留的成员关系在甚至面临网络分割及进程故障时仍保证互斥;n个锁定队列状态机,其中n是资源数量,每个锁定队列状态机用于维持所述队 列并起始分布式锁定的所有权转移;及锁定管理器状态机,其用于为请求存取所述资源的一者或多者的应用程序获取分 布式锁定,及通知适当的锁定队列状态机处理所述请求。
20、 一种分布式锁定管理器模块,其用于调节包含多个节点的系统中的应用程序 对资源的存取,所述多个节点分别以通信方式耦合到网络,所述模块包括针对每个资源的队列,所述队列识别拥有所述资源的分布式锁定的节点,其中跨 越所述节点复制每个队列;及全序输送装置模块,其用于以通信方式将其节点耦合到所述网络,且对各节点之 间的消息接发施加全排序协议。
21、 如权利要求20所述的模块,其进一步包括-定额计算状态机,其耦合到所述全序输送装置模块,用于基于本地保留的成员关 系在甚至向临网络分割及进程故障时仍保证互斥;n个锁定队列状态机,其中n是资源数量,每个锁定队列状态机用于维持所述队列及起始分布式锁定的所有权转移;及锁定管理器状态机,其用于为请求存取所述资源的一者或多者的应用程序获取分 布式锁定,及通知适当的锁定队列状态机处理所述请求。
22、 如权利要求20所述的模块,其进一步包括持久性存储装置,其用于存储在检测到故障或从故障中恢复时指示当前锁定所有 权的队列要素。
23、 如权利要求22所述的模块,其中在所有节点同时失效的情况下,所述模块 进步配置有FPMS (正向处理成员组)能力,借此每个节点在进入及退出定额状态 时保留一组可达到的节点,因此尽管完全丢失瞬时状态仍能实现故障恢复。
24、 如权利要求23所述的模块,其中初始的先前定额是完全成员关系,且如果 在当前的可达到节点组中检测到大部分先前定额,则建立定额状态。
25、 如权利要求20所述的模块,其中在发生故障的节点恢复并再附着到操作群 组的情况下,所述模块通过使最新节点发送所述恢复节点必需的数据来更新所述恢复 节点的数据。
26、 如权利要求20所述的模块,其中所述队列是FIFO队列,且每个对应资源的 分布式锁定所有权被转移到在所述队列中以FIFO次序识别的等待节点。
27、 如权利要求20所述的模块,其中所述全序输送装置模块被实施为扩展虚拟 同步输送装置。
28、 如权利要求20所述的模块,其中所述全序输送装置模块利用所述网络的多 播能力以确保依序传递消息。
29、 如权利要求20所述的模块,其中如果其节点拥有资源的分布式锁定,且无 其他节点正等待所述资源,则所述模块允许所述资源上的无限制数量的事务冋时或连 续运行。
30、 如权利要求20所述的模块,其中如果其节点拥有资源的分布式锁定,且其 他节点正等待所述资源,则所述模块允许所述资源上的预定数量的未决事务运行及提 交,且随后释放对所述分布式锁定的所有权。
31、 如权利要求30所述的模块,其中一旦其释放所述分布式锁定的所有权,则 将其节点放置在所述队列中,且在其他节点完成对所述资源的使用后,其节点重新获取所述分布式锁定的所有权。
32、 如权利要求20所述的模块,其中在将资源的分布式锁定所有权转移到其节 点时,所述模块允许所有等待所述资源的事务同时执行。
33、 如权利要求20所述的模块,其中在提交正使用分布式锁定的节点处的所有 事务后,所述模块将对所述锁定的所有权保持在所述节点处,直到或除非另一节点请 求所述分布式锁定。
34、 如权利要求20所述的模块,其中所述模块允许N个事务在释放分布式锁定 之前运行。
35、 如权利要求20所述的模块,其中在正常的正向处理期间,于瞬时存储器中 更新所述队列。
36、 如权利要求20所述的模块,其中所述模块能够通过单个多播消息中数个分 布式锁定的分批入队及出队而在一个安全的全有序广播中跨越各节点获取及释放多个 分布式锁定。
37、 如权利要求36所述的模块,其中所述单个多播消息用于分级锁定所有权转移。
38、 如权利要求20所述的模块,其中所述模块利用所述全序输送装置的扩展虚拟同步语义以实施基于成员关系定额的故障恢复系统,其中将达成一致的成员关系本 地保留于每个节点处。
39、 一种用于调节系统中应用程序对资源的存取的分布式锁定管理器方法,所述 系统包含多个节点,所述多个节点分别以通信方式耦合到网络,所述方法包括针对每个资源提供一队列;基于队列内容识别拥有对应于所述队列的所述资源的分布式锁定的节点; 跨越所述节点复制每个队列;及 对各节点之间的消息接发施加全排序协议。
40、 如权利要求39所述的方法,其进一步包括基于本地保留的成员关系,甚至在面临网络分割和进程故障时仍保证互斥 维持所述队列且起始分布式锁定的所有权转移;及为请求存取所述资源的一者或多者的应用程序获取分布式锁定,并处理所述请求。
全文摘要
本文揭示管理及调节对分布式数据的存取的分布式事务与锁定管理技术。提供一种锁定管理器模块以调节具有多个节点的系统中的应用程序对资源的存取,所述多个节点分别以通信方式耦合到网络。所述模块可被配置成容错式。在一个实施例中,模块使用全有序输送装置对各节点之间的消息接发施加全排序协议。所述模块可利用所述网络的多播能力(例如实现多播的以太网或其他网络特性)。所述模块针对每个资源均包含一队列,所述队列识别拥有所述资源的分布式锁定的节点。可跨越分布式配置中的所述节点复制每个队列。
文档编号G06F9/46GK101273333SQ200680018705
公开日2008年9月24日 申请日期2006年4月12日 优先权日2005年4月13日
发明者卡尔·胡, 弗雷德里克·A·小汤普金斯, 迈克尔·泰克塞拉 申请人:普罗格雷斯软件公司