分布式共享磁盘系统中的磁盘写操作的制作方法

文档序号:6355017阅读:216来源:国知局
专利名称:分布式共享磁盘系统中的磁盘写操作的制作方法
技术领域
本发明涉及执行磁盘写操作,尤其涉及在允许将数据项的脏版本保留在多节点的缓存中的系统中整理脏数据项的写操作。
背景技术
一种用来增强数据库系统的可伸缩性的方法是允许多个节点同时读取和修改共享存储器中的数据。每个节点都具有缓存,从而在易失性主存储器中保持数据,并在非易失性共享磁盘存储器中进行数据备份。全局式锁定管理器(global lock manager,GLM)和分布式锁定管理器(distributed lock manager,DLM)被用来维持节点之间的缓存的一致性。为了从删除了主存储器中的内容的节点故障中恢复,通常使用预写式日志(Write-Ahead-Logging,WAL)协议。为了性能的原因,每个节点都有专用的重置日志,在其中可记录改变。为了减少节点出现故障后需要扫描的重置日志中的改变的量,通常建立增量或定期校验点,以保证在校验点之前的数据项的所有改变不必被再应用到非易失性存储器中的数据项。
并发控制通过全局事务页面级锁定或行级锁定来实施运行在相同节点或不同节点上的事务(transaction)之间的并发控制。该事务系统可使用强制政策或非强制政策,使用强制政策时,由事务改变的数据项(例如,页面/块)在事务提交期间被写入稳定的存储器,而使用非强制政策时,在事务提交时,仅有重置日志的事务改变被强制。具有页面级锁定的强制政策的使用意味着块仅被一个节点(事实上,仅被一个事务)改变,和仅在任意点的一个系统缓存中变脏(dirty)。在所有其它组合中(即使用强制政策的行级锁、使用非强制政策的页面级锁、以及使用非强制措施的行级锁),可在多个系统中改变数据项,需要缓存一致性机制。
最常见的情况是使用非强制数据项管理政策的行级锁。出于解释目的,此处给出的例子将在使用具有非强制数据项管理政策的行级锁的系统的背景下给出。然而,此处描述的技术并不局限于该背景。
校验点队列当事务提交时,反映该事务做出的改变的数据将被储存到永久存储器中。在一些系统中,表示事务做出的改变的重置记录在提交时不得不被永久地储存,但是更改的数据项本身的实际写操作可被延迟。数据项((1)包含改变,且(2)仍然没有被永久地储存)被称之为“脏数据项(dirty data item)”。通常,保留在节点的脏数据项越多,如果节点故障,恢复时间就越长。因此,为了保证恢复时间不是不可接受的长,节点可维持一校验点(检查点)队列(checkpoint queue)。
校验点队列包括识别脏数据项的条目。基于永久储存重置日志中的相应重置记录的次序对该队列中的条目进行排序。在故障的情况下,重置日志必须从重置记录开始进行,该重置记录与位于校验点队列的顶部的条目对应。
当脏数据项被写入永久存储器时,用于该数据项的条目被从校验点队列去除。当位于校验点队列的顶部的条目被从校验点队列去除时,在进行恢复的重置日志中的点必须开始改变,导致校验点的“提前(advance)”。故障时,校验点在重置日志中提前的越多,从故障中恢复需要做的工作就越少。所以,节点通常试图将脏数据项写入永久存储器,该脏数据项由位于它们的校验点队列的条目进行识别。然而,正如此后需要更详细描述的,当相同数据项的脏版本有可能保留在多个节点的缓存中时,协调脏数据项的写操作是特别重要的。
通过共享的永久存储器的数据项转移当多个系统同时修改数据项时,需要一种机制来协调修改数据项到稳定的共享永久存储器的写入。在一些系统中,这个问题通过使用稳定的共享永久存储器简单化,该稳定的共享永久存储器作为用于将修改的数据项从一个节点传输至另一节点的介质。当在一个节点变脏的数据项需要在不同的节点修改时,在将页面锁授权给需要修改脏数据项的节点之前,该数据项首先被写入共享的永久存储器。当不同的节点需要读取修改的数据项的当前版本时,使用相同的写入永久存储器队列和从永久存储器读取队列。
通过相互连接的数据项转移在使用非易失性存储器作为在节点之间传输数据项的介质的系统中,没有必要协调不同的节点之间的脏数据项写入。每个节点都可将常规机制用于写出脏数据项和执行校验点。
在一些系统中,当该请求节点仅需要与修改的数据项一致的快照版本(snapshot version)时,修改的数据项被发送给请求节点,而不将数据项写入永久存储器。因此,使用这些一致性控制机制,尽管在不同节点的多个事务在事务提交之前,可使用行级锁修改相同的数据项,但是,任何数据库的数据项仅在一个节点的缓存中变脏。因此,当一个节点故障时,仅需要从该节点的校验点记录到其重置日志的末端对该节点的重置日志进行扫描,以恢复数据库。此外,当多个节点故障时,每个节点的重置日志均可被按次序扫描并应用,以恢复数据库,即,不需要合并来自多个重置日志的改变。
但是,为了改进数据项的传输等待时间,从具有专用锁并已经潜在地修改了数据项的节点到请求相同数据项以专用或请求当前版本以读取的节点,理想的是,将数据项直接从一个节点的主存储器传送到另一节点的主存储器,而不首先将数据项写入永久存储器。当脏数据项被从一个节点传送到另一节点时,该数据项的副本(称之为过去镜像(past image,PI))可以保留在发送节点,也可以不保留在发送节点。
当节点被允许传输脏数据项而不用将它们储存到永久存储器上时,在不同的节点之间必须协调脏数据项的写操作。如果不进行协调,已经传输了脏数据项的节点需要通过将脏数据项写入永久存储器来提前其校验点。然而,如果某些其它节点已经准备好将数据项的更多近期版本写入永久存储器,那么,将脏数据项写入永久存储器可能会破坏数据的完整性。
另外,除非将脏数据项写入磁盘,否则校验点不能被提前。如果节点不能保留该节点发送给其它节点的数据项的脏版本,那么该节点必须以某种方式与其它节点协调写入磁盘操作。
而且,对于可伸缩的系统而言,可被系统执行的写入磁盘操作的数量不应该是系统中的节点数量的函数。相反,可被系统执行的写入磁盘操作的数量仅反映了系统中的数据项实际做出的改变的数量。
根据以上所述,清楚地需要提供用于协调系统中的脏数据项的写操作的技术,在该系统中相同数据的脏版本可能需要保留在多于一个的易失性存储器中。

发明内容
本发明提供了用于管理具有多个缓存的系统中的缓存的技术,多个缓存包含相同数据项的不同版本。具体地,提供了用于协调在这样的数据项上执行的写入磁盘操作,以保证数据项的旧版本不会被新版本覆盖掉,并减少故障需要进行恢复的处理量的技术。本发明提供了多种方法,其中主控制器(master)被用来与多个缓存进行协调,以使数据项被写入永久存储器。这样的方法包括但不限于直接写入法、间接写入法、基于拥有者的方法(ower-basedapproaches)、基于角色的方法。还提供了用于管理与存储器相关的校验点的技术,其中校验点被用来确定在故障的情况下开始处理恢复日志的位置。
附图简要说明下面将通过附图中的例子来说明本发明,而非对本发明进行限定,在附图中,相同的参考标号指示相同的部件,其中

图1是示出根据本发明的一个实施例的在直接写入法中协调写入磁盘操作的框图;图2是示出根据本发明的一个实施例的在间接写入法中协调写入磁盘操作的框图;图3a是示出根据本发明的一个实施例的当全局变脏标记(global dirty flag)是假时,在基于拥有者的方法中如何协调写入磁盘操作的框图;图3b是示出根据本发明的一个实施例的当全局变脏标记是真时,在基于拥有者的方法中如何协调写入磁盘操作的框图;图3c是示出根据本发明的一个实施例的当写入请求不是来自拥有者时,在基于拥有者的方法中如何协调写入磁盘操作的框图;图4a是示出根据本发明的一个实施例的当模式是局部时,在基于角色的方法中如何协调写入磁盘操作的框图;图4b是示出根据本发明的一个实施例的当模式是全局时,在基于角色的方法中如何协调写入磁盘操作的框图;图4c是示出根据本发明的一个实施例的当请求不是来自专用锁持有者时,在基于角色的方法中如何协调写入磁盘操作的框图;
图4d是示出根据本发明的一个实施例的当在写操作期间执行传输时,在基于角色的方法中如何协调写入磁盘操作的框图;图5是示出校验点队列的框图;图6是示出校验点队列的框图;图7是示出带有合并的条目(entry)的校验点队列的框图;图8是示出条目被批处理进二进制文件(bin)的校验点队列的框图;以及图9是示出可以实施本发明的实施例的计算机系统的框图。
本发明的详细描述本文描述了一种用来协调脏数据项的写操作的方法和装置。在以下描述中,出于解释的目的,阐明了许多特定细节,以便提供对本发明的透彻理解。然而,应当理解,既使没有这些特定细节,本发明也可实施。在另外的例子中,众所周知的结构和装置以框图形式示出,以避免对本发明造成不必要的模糊。
优化将永久存储器用作介质以便转移的系统在将永久存储器用作用于在节点之间传输数据项的介质的系统中,可通过修改数据库缓存的写入子系统以将较高的优先权赋予其它节点正在等待读取或写入的写入数据项,从而减少将数据项从一个节点传输到另一个节点所需要的等待时间。可通过为那些需要被写入的脏数据项提供单独队列(“检测(ping)队列”)来完成上述操作,因为其它节点正在等待读取或修改这些脏数据项。当锁定管理器(可以是分布式锁定管理器DLM或全局式锁定管理器GLM)发送信息给该保持节点(holding node)以请求该保持节点释放对数据项的锁定时,一经请求,该脏数据项就被发送给检测队列。
根据另一方法,还可通过在每个数据项头端器(header)或数据项控制块中维持“强制写入(forced-write)”计数,从而减少将数据从一个节点传输到另一节点的等待时间。只要执行写入以传输数据项给另一节点,强制写入计数就递增。永久存储器的写入子系统维持脏数据项的高优先权队列,这些脏数据项强制写入计数高于某一阈值。这一队列被用来允许比在节点之间不被频繁共享的其它脏数据项更加频繁地写入那些数据项。另外,由于数据库缓存写入子系统预期到需要释放对这些数据项的锁定,已经急切地写出(write out)了脏数据项,从而改善了节点之间的锁定传输等待时间。
然而,即使以这种方式做了优化,将共享的永久存储器用作用于在节点之间传输数据项的介质的系统承受了和将数据项写入永久存储器相关的开销。此后描述的技术涉及可在节点之间传输数据项(包括脏数据项)而不用将其首先写入永久存储器的系统。
正确性和可伸缩性在允许在缓存之间传输脏数据项而不用将其首先写入永久存储器的系统中,出于正确性和可伸缩性的考虑,需要对不同的每个节点存储器的脏数据项的写入进行协调。正确性要求当节点完成校验点时(即,记录故障后改变需要从其重置日志中应用的起始点),包含改变的每个数据项的版本已经被写入非易失性存储器,所述改变先于校验点被提交。而且,不允许两个节点同时将数据项写入永久存储器(因为它们将搞乱彼此的改变)且不允许一个节点将数据项的旧版本覆盖较新的版本。
可伸缩性要求将数据项写入永久存储器覆盖尽可能多的改变,即使这些改变由不同节点做出。基于实用性原因,数据库系统可能希望限制在节点故障后需要被扫描并可能重新应用的重置日志的量。因此,数据库写入数量应当与对数据库做出的改变数量成比例,但是不与做出这些改变的节点的数目成比例。
功能综述本发明提供了多种技术,用于协调将脏数据项写入系统中的永久存储器,该系统允许同一数据项的脏版本保留在多个缓存中。根据一种技术,使用被指派给该数据项的主控制器(master)来执行这种协调。根据一个实施例,用来协调数据项的脏版本写入的主控制器与指派为管理锁定的实体是相同实体,其中该锁定控制对数据项的访问。在这样的实施例中,该主控制器通常是锁定管理系统的一个组件,例如属于分布式或全局式锁定管理系统的锁定管理器。
在一个实施例中,想要将脏数据项写入永久存储器的节点发送写入永久存储器的请求到分配给该数据项的主控制器。该主控制器可以(1)准许该请求节点执行写操作,或(2)通知该请求节点另一节点已经将至少和在该请求节点存储的脏数据一样新的版本写入永久存储器。
在另一实施例中,主控制器还通过发送“写入执行(write-perform)”信息进行响应,以请求和该请求节点不同的节点将至少和在该请求节点存储的脏版本一样新的数据项版本写入永久存储器。在另一节点将写操作已经执行的“写入确认(write-confirm)”信息发送给该主控制器后,该主控制器发送“写入通知(write-notification)”消息,以通知该请求节点其它节点已经将至少和在该请求节点存储的脏版本一样新的数据版本写入永久存储器。
一旦数据项的特定版本已经被写进永久存储器,和该特定版本相同或更旧的数据项的脏版本被特定版本覆盖掉。数据项的覆盖版本不再需要被(并且不应当被)写入永久存储器。包含覆盖版本的节点在此处被称之为“感兴趣的(interested)”节点。
除了通知请求节点数据项已经被写入永久存储器外,该主控制器还可发送写入通知消息以通知所有感兴趣的节点该数据项已经被写进永久存储器。在确认接收数据项已经写入永久存储器后,给其它感兴趣的节点的写入通知消息被立即发送,或被延迟至一些其它事件发生后再发送。
在另一实施例中,每当节点想要将脏数据项写入永久存储器时,每个节点都需要请求主控制器,为了避免这种情况,该主控制器可将数据项的“所有权权限(ownership permission)”授权给节点。当该节点拥有数据项的所有权权限时,该节点可自由地将数据项写入永久存储器,而不用发送写入请求消息给数据项的主控制器。所有权权限被隐含地授予专用锁的所有权,或其可被分别地授予,而不依赖于专用锁的授权。
根据一个实施例,为数据项维持了“全局变脏(global dirty)”标志。如果一个节点将数据项的脏版本转移给另一节点,则该全局变脏标志被设置为真(TURE)。如果当拥有者将数据项写入永久存储器时全局变脏标志被设置为真,那么该拥有者发送写入确认消息给主控制器。接着,该主控制器可发送写入通知消息给感兴趣的节点。另一方面,如果全局变脏标志被设置为假(FALSE),接着,当该拥有者写入数据项时,该拥有者不需要发送写入确认消息给主控制器。
直接写入法根据直接写入法,使用分配给数据项的主控制器来协调将该脏数据项写入永久存储器。特别地,希望将脏数据项写入永久存储器的节点发送写入请求消息给指派给该数据项的主控制器。该主控制器可以(1)准许该请求节点执行写操作,或(2)通知该请求节点另一节点已经将至少和在该请求节点存储的脏数据一样新的版本写入永久存储器。
更特别地,当脏数据项从节点的缓存中“检测(ping)出(pingedout)”时,即,另一节点请求对相同的数据项的当前版本进行读(S锁)或写(X锁)时,在发送节点的缓存中的数据项的状态被改变为PI。该数据项仍保留在脏队列或校验点队列中。当干净数据项被检测出时,该数据项可以被标记为自由或保留在缓存中以确保一致性快照读取。
当该数据项被检测出时,该数据项的主控制器记录了该数据项的版本号。通常,该版本号是日志序列号(log sequence number,LSN)、系统提交号(system commit number,SCN)或全局唯一时间戳,这些可被用来使数据项的版本与重置日志中的改变相互关联。由于该数据项仍然在脏队列或校验点队列中,所以该校验点或缓存的写入子系统最终将需要写出PI(或它的一些后继者)。
根据直接写入法,消息被发送给主控制器,该主控制器将返回数据项的更新的版本已经被写入,或将写入权限授予该请求节点。来自其它节点的对相同数据项的进一步的写入请求被排队,直到该写入节点用写入完成状态来响应锁定管理器。PI被写入永久存储器后,数据项的主控制器将PI的版本号记录为当前在永久存储器上的版本。
参看图1,其是示出采用直接写入法的系统的框图。节点1、2、和3已经分别将特定数据项的版本V1、V2、和V3储存到它们的缓存中。假设V3>V2>V1,其中A>B意味着A是比B更新的数据项版本。
主控制器100是指派给数据项的主控制器。在图1所示的情形下,节点1和3发送写入请求给主控制器100。为了防止多个节点同时写入相同的数据项,例如,主控制器100可包括用于每一数据项的写入请求队列。为数据项而接收的写入请求被储存在写入请求队列中,并由主控制器依次进行处理。在示意性实施例中,当来自节点1的写入请求保留在写入请求队列中时,主控制器100首先处理来自节点3的写入请求。主控制器100通过将授权节点3将V3写入永久存储器的写入执行消息发送给节点3来响应节点3的写入请求。
当写入请求已经被授权给节点3时,主控制器100没有将写入永久存储器的权限授予任何其它节点。因此,来自节点1的写入请求在写入请求队列中保持未决状态。
在节点3已经将V3写入永久存储器后,节点3将一个写入确认消息发送给主控制器100,该消息指示写入永久存储器的操作已经完成,且节点3已经放开写入永久存储器的权限。因为V3比V1和V2更新,V1和V2将被V3的写入覆盖。
接着,主控制器100进行处理队列中的下一写入请求。在本例中,主控制器100处理来自节点1的写入请求。节点1的写入请求是写入V1的请求。因为V1已经被V3的写入覆盖,主控制器100发送写入通知消息给节点1指示V1已经被覆盖。作为对写入通知消息的回应,节点1将用于V1的条目从其校验点队列移去,而不将V1写入永久存储器。因为节点1现在知道V1已经被覆盖,所以节点1不需要在存储器中保留V1的副本。
根据一个实施例,包括已经被V3的写入覆盖掉的V2的节点2不会发送写入通知消息,直到节点2向主控制器100发送用于V2的写入请求。
间接写入法利用直接写入法,每个节点为节点校验点队列的每个条目发送写入请求消息。在某些情况下,该节点将接收响应于该写入请求的写入执行消息。当接收到写入执行消息时,该请求节点必须执行写入操作。在其他情况下,该请求节点将接收响应于写入请求的写入通知。当接收到写入通知消息时,该请求节点不需要执行写入操作。
该间接写入法试图增加使用写入通知消息回应的写入请求的百分比。为实现这一目的,相对于被要求执行写入操作的节点而言,主控制器100是有选择的。特别地,主控制器100可通过发送写入执行消息给其它节点来响应来自一个节点的写入请求消息。可基于多种因素来选择写入执行消息发送到的节点,这些因素包括储存在缓存中的数据项版本的最新状态。根据一个实施例,主控制器100总是发送写入执行消息给包含数据项当前版本的节点,而不考虑发送写入请求消息的节点。
更特别地,根据一个实施例,主控制器将写入请求传送给具有过去镜像中的最高版本的节点,或优选专用锁(X)持有者(其具有数据项的当前版本)。发送写入请求给最高的PI,而不给专用锁持有者,这允许对当前数据项进行持续地修改。
当数据项被写入永久存储器时,其不能被修改;因此,写入可被进一步修改的当前数据项,有必要将其锁定以防止其被修改,或将其“克隆(clone)”,从而对不同的版本进行修改。锁定是令人讨厌的,如果可以进行克隆,则优选将写入请求指引给具有当前数据项(即,X锁或S锁)的节点。
使数据的当前版本写入永久存储器,以允许永久存储器进行写入,从而覆盖尽可能多的变化。当写入永久存储器完成时,带有写入完成状态和已经被写入的数据项的版本号的消息被发送给主控制器。主控制器记录永久存储器上的版本号,并发送写入通知消息给具有数据项的PI版本的所有节点,其中该数据项现在已经被永久存储器的写入覆盖掉。当节点接收写入通知时,如果其脏数据队列或校验点队列上的所有数据项在该校验点记录之前已经写入永久存储器,或由于相同数据项写入其它节点而收到来自主控制器的写入通知,则该节点可正确地将其校验点记录提前并释放PI数据项。当数据项正在被写入时,主控制器逻辑上维持写入请求队列,但仅需要记录其已接收到的最高写入请求的版本号。
例如,在图2中示出的情形中,节点3未将关于V3的写入请求消息发送给主控制器100。然而,响应于来自节点1的要求将写入数据项版本V1的写入请求消息,主控制器100选择节点3作为写入数据项的节点。节点3通过写入数据项的V3并发送写入确认消息到主控制器100来进行响应。然后,主控制器100发送写入通知消息到节点1。
由于选择节点3用于将V3写入永久存储器,所以,V1和V2都被覆盖。与此相反,如果(根据直接的写入法)主控制器100已允许节点1写入V1,则V2和V3将不被覆盖。当将V2和V3写入永久存储器时,必须执行分离的写入操作。
通过优选发送写入通知消息到未发送写入请求消息的以及已发送写入请求消息的感兴趣的(interested)节点,间接写入法还试图减少必须发送给主控制器100的写入请求消息的数量。例如,在图2中示出的情况中,使用间接写入法,即使节点2未发送用于V2的写入请求,主控制器100还将发送写入通知到节点2。根据一个实施例,主控制器100发送写入通知消息给所有感兴趣的节点。
当感兴趣的节点接收到写入通知时,该节点从其校验点队列移去相应的数据项的版本的条目(entry)。在使用间接写入法的情况下,为校验点队列中的许多条目发送写入请求之前,校验点队列中的许多条目可以此方式被移去。因此,通过节点发送的写入请求消息的数量可能明显少于被放在其校验点队列中的条目的数量。
基于拥有者的写入在间接写入法和直接写入法中,即使当数据项仅在一个节点的缓存中变脏时,写入请求消息也会被发送到数据项的主控制器。在许多数据库系统中,通过对节点之间的内部永久存储器结构(例如为每个节点分开数据项的自由列表)进行分区,或通过将事务路由到节点的应用级,数据库工作集(working set)的大部分可在节点之间划分。在这样的系统中,数据项将仅在一个节点的缓存中频繁变脏。基于拥有者的写入法避免了在这些情况下发送写入请求的需要。
基于拥有者的写入法使得被当前指定为数据项的“拥有者”的节点进行数据项的所有写入。与直接写入法和间接写入法相反,当数据项的拥有者希望数据项的版本被写入时,允许拥有者将数据项写入永久存储器而不发送写入请求消息给数据项的主控制器。
可使用多种因素来选择作为数据项的拥有者的节点。根据一个实施例,数据项的拥有者基于以下规则被选择(1)如果向节点授予了关于数据项的专用锁,则该节点被认为是数据项的拥有者;(2)如果不存在专用锁持有者,即,存在多个共用锁(S)持有者,则具有数据项的最近专用锁的节点被选择为数据项的拥有者;以及
(3)如果数据项未被任何节点变脏,则不存在用于该数据项的拥有者。
在是数据项的拥有者的节点中,即使当数据项不会在该节点中变脏时,该数据项也被链接到节点的脏数据队列或校验点队列。在数据项的拥有者将数据项写入永久存储器后,该拥有者确定该数据项是否是“全局变脏”。如果由该拥有者之外的任何节点作出的任何修改未被该节点保存到永久存储器,则数据项是全局变脏的。如果该数据项是全局变脏的,则该拥有者发送写入确认消息给主控制器。然后该主控制器可发送写入通知给感兴趣的节点。如果该数据项不是全局变脏的,则该拥有者不需要发送写入确认消息给该主控制器。
可以使用不同的技术以允许数据项的拥有者确定该数据项是否是全局变脏的。根据一个实施例,全局变脏标记与该数据项相关。当节点发送数据项的脏版本给另一节点而不将该数据项写入永久存储器时,该发送节点将数据项的全局变脏标记设定为真。为了确定数据项是否是全局变脏的,该拥有者仅需检查那些与该数据项相关的全局变脏标记。如果写入永久存储器的数据项版本是(1)数据项的当前版本或(2)最近的PI版本,则在将该数据项写入永久存储器后,该拥有者将全局变脏标记设定为假。
可以用多种方式储存数据项的全局变脏标记。例如,当数据项是数据库系统中的数据项时,该全局变脏标记可储存在(1)储存该数据项块的块报头、(2)数据项的数据项控制块、(3)当许可为数据项的新拥有者进行锁定时,局部锁管理器中的锁结构等。
参看图3a,其示出其中数据项的拥有者(节点3)想要将数据项写入永久存储器的情况,其中全局变脏标记被设定为假。如可在图3a中看到的,在这些情况下,节点3不需要从主控制器100要求权限。此外,节点3不需要通知主控制器100已经执行写入永久存储器。
参看图3b,其示出其中数据项的拥有者(节点3)想要将数据项写入永久存储器的情况,其中全局变脏标记被设定为真。在所示的情况中,节点1和2具有比储存在节点3中的版本V3老的数据项的脏版本V1和V2。与图3a所示的情况类似,在此情况中,节点3不需要请求权限以便将V3写入永久存储器。然而,因为全局变脏标记为真,所以在将V3写入永久存储器后,节点3会发送写入确认消息给主控制器100。接着,主控制器100发送写入通知消息给节点1和2。在将V3写入永久存储器之后,节点3将该全局变脏标记设定为假。
参看图3c,其示出其中非数据项拥有者(节点1)想要将数据项写入永久存储器的情况。在此情况中,节点1发送写入请求消息给主控制器100。接着,主控制器100发送写入执行消息给数据项拥有者(节点3)。节点3将V3写入永久存储器,并将全局变脏标记设定为假,还发送写入确认消息给主控制器100。然后,主控制器100发送写入通知消息给感兴趣的节点(节点1和2)。
基于角色的方法基于拥有者的写入法避免了数据项拥有者在将数据项写入永久存储器之前要从数据项主控制器获得权限的需要。然而,为了清除两个节点试图在同一时间将数据项写入永久存储器的可能性,当数据项的当前拥有者正在将数据项写入永久存储器时,数据项所有权不允许被改变。因此,在那些将专用锁的持有者当作拥有者的系统中,当数据项的当前拥有者正在将数据项写入永久存储器时,该专用锁不能被传递到另一节点。结果,修改权限到想要修改数据项的并发节点而进行的转移将会延迟,直到数据项被写入永久存储器。这样的延迟降低了系统的整体性能。此外,即使该拥有者可能没有弄脏该数据项,数据项拥有者必须在其脏队列中链接数据项,这也是不合乎需要的。
基于角色的方法从(2)将数据项写入永久存储器而不发送写入请求的权限中分离出(1)数据项中专用锁的所有权。由于数据项中专用锁的所有权与将数据项写入永久存储器而不发送写入请求的权限相分离,所以,即使在进行写入永久存储器操作时,数据项的专用锁所有权也可在节点之前转移。
根据基于角色的方法,为每个锁都分配了锁角色。如果数据项可仅在一个节点的缓存中潜在地变脏,则该锁角色是“局部的(local)”。因此,在整个系统中,当首次将数据项上的锁授予节点时,该锁被给予局部角色。在具有局部角色的锁下的数据项可被写入永久存储器,也可以由持有该锁的节点从永久存储器读取而无主控制器干涉。
当数据项由于来自不同节点的锁定请求而被从节点的缓存检测出时,如果该数据项在保持节点的缓存中是脏的,则锁的角色将转换为“全局”。否则,与数据项一起转移的锁仍保持为局部角色。因此,只有在多节点系统中存在至少一个数据项的PI时,数据项需要在全局角色之下。
当全局角色中的PI数据项或当前数据项被写入永久存储器时,其保持节点发送具有需要被写入的数据项版本号的写入请求消息给主控制器。主控制器可将写入请求转发给当前数据项(X锁持有者)或版本号大于或等于需要被写入的PI的版本号的任何PI。当写入完成时,主控制器将写入通知发送给具有PI的所有节点,该PI被写入永久存储器的数据项版本覆盖。
由于具有全局角色中的专用锁的节点还需要将其写入永久存储器操作与主控制器协调,即使当专用锁锁定的数据项正在被写入时,专用锁也可被转移到另一节点。出于同样原因,节点不会把数据项链接到其校验点或脏队列,除非其在该节点中变脏。当脏数据项受到局部角色锁定而被写入同时,在检测出脏数据项时,锁角色被切换到全局,且正在进行的写入也会被传递给主控制器。
参看图4a,其示出其中局部模式锁的持有者(节点3)想要将数据项版本写入永久存储器的情况。由于节点3持有的锁处于局部模式,所以节点3会将数据项写入永久存储器,而不从主控制器100请求许可。节点3还不需通知主控制器100数据项已经被写入永久存储器。
参看图4b,其示出其中全局模式锁的持有者(节点3)想要将数据项的版本V3写入永久存储器的情况。因为锁模式是全局的,所以另一节点有可能正在写入该数据项。因此,节点3发送写入请求消息给主控制器100。响应于写入请求消息,主控制器100选择节点写出该数据项。优选地,主控制器100选择具有至少与V3一样新的数据项版本的节点。在本示例中,V3是数据项的当前版本。因此,主控制器100将写入执行消息发送回节点3。
响应于写入执行消息,节点3将V3写入永久存储器,且将写入确认消息发送回主控制器100。主控制器100接着发送写入通知消息给感兴趣的节点(节点1和2)。
如果写入永久存储器的数据项版本是当前版本,则将数据项写入永久存储器的节点还将锁从全局模式转换为局部模式。当前版本被写入永久存储器时,可执行这一转换。基于节点在数据项上保持专用锁这一事实,将当前版本写入永久存储器的节点能够确定该节点正在写入当前版本。在本示例中,V3是当前版本,所以,在将V3写入永久存储器后,节点3将模式从全局转换为局部。
参看图4c,其示出其中未保持数据项的当前版本的节点(节点1)请求将数据项写入永久存储器的情况。除了写入请求消息来自于节点1而不是来源于节点3之外,图4c中示出的事件顺序与图4b中的相同。
如图4b所示,与基于拥有者的方法相比,在基于角色的方法中,当锁出于全局模式时,数据项上的专用锁的拥有者仍须从主存储器100寻求写入数据项的许可。然而,与基于拥有者的方法不同,数据项(和其专用锁)可从一个节点传递到另一节点,而不等待写入永久存储器操作完成。
例如,除了节点(节点4)已请求数据项的专用拥有权之外,图4d示出了与图4c相同的情况。即使当响应于写入执行消息节点3在将V3写入永久存储器的过程中时,节点3也能将数据项传递到节点4。在具有专用写入锁的情况下,节点4可继续修改数据项以创建版本V4。然而,因为模式是全局的,所以节点4不能将V4写入永久存储器。
在图4c中,在收到来自节点3的写入确认消息后,主控制器100发送转换到局部的消息给节点4。响应于转换到局部消息的接收,节点4将模式从全局转换为局部。在该模式已改变回局部之后,不用从主控制器100获得任何许可,节点4就可以将数据项写入永久存储器,并从永久存储器读取数据项。
在可选实施例中,响应于写入确认消息,主控制器100不发送转换到局部的消息。在没有转换到局部的消息的情况下,在节点4,专用锁模式将保持为全局。因为该模式是全局的,所以,如果节点4希望将V4写入永久存储器,则节点4将发送写入请求给主控制器100。响应于写入请求消息,主控制器100可发送转换到局部消息给节点4。在该节点转换到局部的之后,不需进一步的许可,节点4就可以将V4写入。
延迟的写入通知在上述示出的情况中,提到将写入通知消息发送到所有的感兴趣的节点可被立即执行,或者,该发送可服从于某些或全部感兴趣的节点。根据一个实施例,当写入永久存储器操作被执行时,写入通知消息仅立即发送到那些已经请求用于PI的写入的节点,该PI被已被执行的写入覆盖。例如,在图1中,主控制器100立即发送写入通知消息给节点1,但是不发送给节点2。
可以使用多种技术中的任何一种,在永久存储器上的数据项的版本号随后可从主控制器传送到其它感兴趣的节点。例如,当数据项的当前版本需要被发送给另一节点时,在永久存储器上的数据项的版本号可作为(1)用于新的锁请求的锁许可消息或(2)检测消息的一部分。因此,当其它感兴趣的节点需要写入或替换其PI时,它们可通过仅与局部锁管理器通信而丢弃其PI。
分批处理的消息另一用于减少在主控制器和感兴趣的节点之间通信的消息数目的技术包括为了减少消息数目将来自或到主控制器的写入请求消息和写入通知消息分批成几个较大的消息。例如,如果节点1想要将其校验点队列提前三个条目,则节点1可发送单个的写入请求消息给主控制器100,该消息识别的是必须被写入永久存储器的所有的三个数据项(以及其相应的版本)。同样,如果节点1对已完成的三个写入永久存储器操作感兴趣,主控制器100可发送单个的写入确认消息给节点1,该消息识别的是已经写入永久存储器的三个数据项(以及其相应的版本)。
校验点队列管理相同数据项的多个过去的镜像在上面示出的情况中,假定每个节点的缓存都具有用于每个数据项的最多一个PI。事实上,在将数据项的某个版本写入永久存储器之前,数据项可经由多个节点循环数次。正确的是在每次把脏数据项检测到另一节点时产生一个PI,并且在节点缓存中的脏数据队列或校验点队列中的不同位置具有用于若干PI的条目。
例如,图5示出其中节点中的校验点队列500具有用于特定数据项(数据项5)的三个条目的情况。具体地,校验点队列500具有报头502和尾部504和与数据项5的版本V1、V6、和V8相应的三个条目506、508、和510。同样,图6示出其中另一节点的校验点队列600具有用于数据项5的两个条目的情况。具体地,条目606和608对应于数据项5的版本V3和V7。
出于说明目的,假定校验点队列500是用于节点A(未示出)的校验点队列,并且校验点队列600是用于节点B(未示出)的校验点队列。
数据项的主控制器与最新的PI的版本号一起更新,其中该PI是在脏数据项传递到另一节点后创建的。因此,当节点A创建数据项5的V1并传递数据项5到另一节点时,数据项5的主控制器被更新,以指示该节点A具有V1。当节点A随后创建数据项5的V6并将数据项5传递到另一节点时,数据项5的主控制器被更新以指示该节点A具有V6。同样,当节点A随后创建数据项5的V8并将数据项5传递到另一节点时,数据项5的主控制器被更新以指示该节点A具有V8。
然而,PI占用缓存中的内存,并且直到其或更新的版本被写入永久存储器时,其才能被替换。因此,当脏数据项从缓存中移出时,如果存在一个PI,则新创建的PI可与先前的PI合并(替换先前的PI)。然而,因为直到当产生第一PI时,对数据项作出的改变反映在数据项的永久存储版本上,校验点才被认为完成,与合并的PI相关的校验点队列必须在脏数据队列或校验点队列中保持在与包含在合并中的最早版本的条目相同的位置上。而且,直到合并中的最新版本由写入磁盘操作覆盖,合并的条目才从校验点队列移去。
例如,图7示出了校验点500,其中用于数据项5的版本V1、V6、和V8的条目506、508、和510,条目506、508、和510被合并为单个条目702。因为条目506是包含在合并中的最早条目,单个条目702位于被条目506占用的位置处。
部分覆盖的合并条目当数据项的PI被合并时,当数据项的版本被写入不同节点上的永久存储器时,该版本有可能覆盖反映在合并的PI中的某些而不是所有变化。例如,如果节点B将数据项5的V7写入永久存储器,则仅有与合并的条目702的V1和V6相关的变化被覆盖。与V8相关的改变则不会被覆盖。
当永久存储器版本完全覆盖了所合并PI中包含的变化时,用于PI的条目可被丢弃,且校验点可超过PI中作出的最早变化而得以提前。例如,如果数据项5的V9已被写入永久存储器,则可丢弃合并的条目702。
另一方面,如果永久存储器写入仅覆盖合并的PI的某些变化时,则用于合并的PI的条目不能被丢弃。例如,即使V7写入永久存储器允许从校验点队列500移去没有经过合并的条目506和508,但是其不允许从校验点队列500移去合并的条目702。
虽然不能丢弃用于部分覆盖的合并PI的条目,可在脏数据队列或校验点队列中将该条目移动到对应于某个版本的条目的位置处,其中该版本位于写入到永久存储器的版本之后。例如,在数据项5的V7被写入永久存储器之后,在校验点队列500中,条目702可移动到与数据项5的V8相对应的条目(即条目510)放置的位置处。这允许校验点继续直到第一条目被写入磁盘版本覆盖,而不会受到用于合并PI的条目的阻拦。
避免创建部分覆盖的合并条目在某些系统中,脏队列或校验点队列作被为链接列表来执行。就CPU的使用来说,扫描链接列表并将合并的条目插入队列中正确的位置中的操作可能是昂贵的。可执行内存储索引来便于该操作,但是当将数据项链接到校验点队列时这将导致过载(extraoverload)。
根据一个实施例,通过避免创建部分覆盖的已移动的条目,可以避免那些受到部分覆盖的合并条目进行移动所涉及的开销。具体地,当合并操作可能创建将被部分覆盖的合并条目时,该合并操作不被执行。
根据一个实施例,当(1)数据项版本正在被写入永久存储器,且(2)数据项在节点之间传递时,主控制器传送当前正在被写入永久存储器的数据项版本号(“正在被写入的”版本)到数据项正在被传递至的节点(“接收”节点)。接收节点从而知道不用将比正在被写入的版本晚的任何数据项版本与正在被写入的版本相同或早于正在被写入的版本的任何数据项版本进行合并。
再次参看图5和图6,假定节点A处于将数据项5的V6写入的过程中。在写入操作完成之前,节点A发送数据项5到节点B,且节点B修改接收到的数据项5的版本,以创建数据项5的V7。当主控制器发送检测到节点B时,主控制器通知节点B数据项5的V6被写入永久存储器。因此,由于所形成的合并的数据项仅被V6的写入部分覆盖,节点B不将数据项5的V7与数据项5的V3合并。由于V6的写入完全覆盖V3,在V6的写入完成后,节点B可丢弃V3,并从队列600移去条目606。
因此,当写入永久存储器操作在进行中时,与至少与正被写入的版本一样旧的版本相关的PI和条目可相互合并。然而,与至少与正被写入版本一样旧的版本相关的PI不应与比正被写入版本新的版本相关的PI进行合并。
在最近版本持有者总是执行写入永久存储器操作的系统中,通过使用这种技术,确保不会有合并的PI被写入永久存储器操作的部分覆盖。具体地,当节点被检测以发送正在经历写入永久存储器操作的数据项时,其将不会将数据项的新版本与较旧的版本合并。如果该数据项不在经历写入永久存储器操作的数据项,则接收到的数据项将是最新的版本,且此后将不要求其它节点将该数据项的较早版本写入永久存储器。
一种避免写入对局部变化造成覆盖的可选方案是启发式地确定何时创建新的校验点队列条目,而不是与现有校验点队列条目合并。例如,假定存在用于数据项3的版本V7的校验点队列条目。确定是否为数据项3的新版本创建新条目或将新版本与现有条目合并可能是必要的。例如,基于对现有条目作出的第一变化相对于(1)存在于重置日志(redo log)中的最新变化和(2)在脏队列或校验点队列开头(head)对数据项所作出的最早变化有多大,可启发式地确定是否合并的决定。这种启发式方法估计了与现有条目相关的PI不久将被写入(或通过写入覆盖)的可能性,且能使该节点扩展校验点,使之超过PI中的首次变化。
例如,如果重置日志中的最新变化相应于比V7晚得多的时间,且在校验点队列开头的数据项与接近于V7的时间相关,则与现有条目相关的PI将立即写入(或通过写入覆盖)存在较高的可能性,且因此应为新版本作出单独的(separate)条目。另一方面,如果重置日志中的最新变化相应于接近于V7的时间,且在校验点队列开头的数据项相应于比V7早得多的时间,则与现有条目相关的PI将立即写入(或通过写入覆盖)存在较低的可能性。因此,新版本应合并到现有条目中。
单个节点故障的校验点队列如上所述,在重置日志中,位于校验点队列开头的条目确定故障后必须开始恢复处理的位置。对于精确恢复来说,从相应于校验点队列开头的条目的位置开始处理重置日志是可靠的,而不考虑在群集(cluster)中有多少节点与故障有关。
根据一个实施例,提供了一种校验点机制来为每个节点追踪两个校验点多故障校验点和单故障校验点。该多故障校验点指示了在包括该节点的多节点故障后开始处理该节点重置的位置。该单故障校验点指示了在单节点故障后开始处理该节点重置日志的位置。
如在下文将要描述的,在不允许从多故障校验点队列删除条目的情况下,可从单故障校验点队列删除条目。因此,单故障校验点通常要比多故障校验点提前很多。由于单故障校验点被提前很多,因此保持单故障校验点导致从单节点故障进行恢复而必须执行的较少工作。
相对于使校验点提前,当节点将脏数据项传递到另一节点时,该节点的多节点故障校验点不会改变。由于数据项是脏的,因此在多故障校验点队列中存在关于该数据项的条目。在脏数据项被传递后,该条目保持在多故障校验点队列中。
与此相反,当把脏数据项传递到另一节点时,与脏数据项相关的条目被从单故障校验点队列删除。因为如果仅传递节点出现故障,则对脏数据项作出的改变就不会丢失,故从单故障校验点队列删除被传递的脏数据项的条目是可靠的。仅响应传递节点的故障,由传递节点作出的改变反映在发送给接收节点的数据项版本中。在这些情况下,确保变化被保存到永久存储器的义务和数据项一起传递。因此,即使接收节点并没有对数据项进行任何进一步的修改,接收节点也必须(1)确保由传递节点作出的变化(或关于这些变化的重置)被写入永久存储器、或(2)将脏数据项(以及义务)传递到又一节点。
将脏数据项传递到另一节点,这使得传递节点能够从其单节点故障校验点队列删除关于所传递数据项的条目。因此,想要使其单节点故障校验点队列提前的节点只须将与在其单节点故障校验点队列开头的条目相对应的脏数据项传递给另一节点。即使接收该脏数据项的节点从不请求该数据项,也可为此目的而执行脏数据项的传递。
这两个校验点可以多种方式被实施,且本发明并不限于任何特定实施。例如,单故障校验点队列和多故障校验点队列可作为两个完全独立的队列来保持。可选地,单个条目“合并”队列可被保持以充当单故障校验点队列和多故障校验点队列。在从多故障校验点队列中删除条目时,这些条目是从合并队列中删除的。在从单故障校验点队列中删除条目时,它们被相应地作标记,但并没有从合并队列中删除。
基于二进制文件的分批处理根据基于二进制文件的分批处理方法,在节点中保持了两个独立的校验点队列全局变脏校验点队列和局部变脏校验点队列。节点的局部变脏校验点队列包括仅在该节点中变脏的数据项条目。节点的全局变脏校验点队列包括在其它节点中也已变脏的数据项条目。
根据一个实施例,在全局变脏校验点队列中的条目被分组为“二进制文件(bin)”。每个二进制文件都与一定的时间范围(a rangeof time)相关,且含有那些关于数据项版本的条目,其中该数据项首先在该时间范围内变脏。因此,如果合并的条目相应于数据项在时间T7、T9、和T12变脏时创建的数据项版本,则合并条目将会落入相应于包含T7的时间范围的二进制文件中,这是因为T7是被该条目覆盖的“首次变脏时间”。
例如,图8示出节点X的全局的脏校验点队列800,该队列已被分成二进制文件812、814、以及816。二进制文件812与时间范围T15至T25相关,且包含了与在T15和T25之间具有首次变脏时间的全局变脏数据项相对应的条目。二进制文件814与时间范围T16至T35相关,且包含了与在T16和T35之间具有首次变脏时间的全局变脏数据项相对应的条目。二进制文件816与时间范围T36至T45相关,且包含了与在T36和T45之间具有首次变脏时间的全局变脏数据项的条目。
根据一个实施例,每个二进制文件被指派了一个版本号。二进制文件的版本号可以是,例如,在该二进制文件中任何条目的首次变脏时间值。例如,二进制文件812包括条目805、806、以及807,这三个条目分别与数据项1的V1、数据项5的V1、以及数据项8的V3相关。假定数据项1的V1、数据项5的V1、和数据项8的V3分别在时间T17、T19、和T23首次变脏。在这种情况中,T23是二进制文件812中任何PI的最高的首次变脏时间。因此,将会把版本号T23指派给二进制文件812。
根据一个实施例,通过让永久存储器的写入子系统以逐个二进制文件为基础而不是以逐个条目为基础发送写入请求给主控制器,减少写入请求消息数。例如,为了使校验点队列800提前,节点X将一个单独的写入请求发送给主控制器,以便写入与二进制文件812中的所有条目相对应的数据项。写入请求消息只须通过版本号T23识别二进制文件812(而不是二进制文件内的特殊条目)。响应写入请求,主控制器发送写执行消息给全部数据项的当前锁持有者,其中该数据项具有PI,它们的首次变脏时间小于或等于T23。
当每个节点完成将最早变化在T23时或在T23之前的所有脏数据项写入磁盘时,节点发送写入确认消息给主控制器。当主控制器从写入执行消息发送至的所有节点接收到写入确认消息时,该主控制器发送写入通知消息给所有节点,通知它们所请求的写入已经完成。作为响应,每个节点可清空相应的二进制文件。例如,如果节点X被通知,在T23时或T23之前具有首次变脏时间的所有数据项已被写入磁盘,则节点X可清空二进制文件812。可通过(1)丢弃所有没有覆盖在T23之后所作改变的条目,和(2)将没有覆盖T23之后所作改变的二进制文件812内的那些条目移动到其它二进制文件。例如,如果条目806是覆盖了T19和T40时作出改变的合并条目,则当清空二进制文件812时,条目806移动到了二进制文件814。
根据一个实施例,主控制器追踪(1)PI的首次变脏时间和(2)与至PI的最后变化(“最后变脏时间”)相关的版本号。例如,对于合并条目702,主控制器将知道合并条目是对应于版本V8(合并条目中的最新版本)和版本V1(合并条目中的最早版本)。在这样的实施例中,当节点从主控制器接收到具有二进制文件版本号的写入通知时,其通过(1)丢弃最后变脏时间小于或等于二进制文件版本号的二进制文件中的所有条目,以及(2)将最后变脏时间大于该二进制文件版本号的二进制文件中的所有条目移动到队列中的下一个二进制文件中,由此清空该二进制文件。在这个方案中,当存在部分覆盖包含在PI中的变化的写入时,由于与最终得到的合并PI相对应的条目可接着容易地移动到其适当的二进制文件,在较旧的PI二进制文件中,如果存在的话,当由于脏数据项传递到另一节点而创建新PI时,新PI的条目总是可以代替较旧PI的条目。
基于二进制文件的分批处理通常更适于使用全局主控制器而不是分布式锁管理器的多节点系统。发送到当前锁持有者的消息易于进行分批处理,因为它们是同时产生的。实质上,该主控制器还为所有全局变脏数据项追踪永久存储器的版本号,而不是追踪永久存储器上的数据项版本号以及处于写入过程中的数据项版本号,这非常类似于校验点记录跟踪节点中所有脏数据项的变化一样。
恢复追踪在多节点系统中执行的写入磁盘操作是重要的。例如,对于确定数据项过去的镜像是否可被写入磁盘和/或从缓存解除分配(“转储清除”)来说,这样的信息是关键的。具体地,如果数据项的新近版本已被写入磁盘,则数据项版本应从来不被写入磁盘。而且,当数据项的更近版本已被写入磁盘时,可从缓存冲刷数据项的PI版本。
在某些情况下,是否成功地执行了写入磁盘操作是不清楚的。例如,如果将数据项写入磁盘的节点在写入操作过程中发生了故障,则该故障是在该写入操作成功完成之前还是在该写入操作成功完成之后发生的是不清楚的。类似地,如果在特定数据项的主控制器所在的节点发生故障,则该故障可能会导致与数据项有关的信息损失。这样的信息可包括用于指示数据项的最近版本被写入磁盘的信息。
当不清楚是否成功执行了写入磁盘操作的情况出现时,可通过扫描磁盘上的数据项以确定其版本,从而解决该问题。然而,作为恢复操作的一部分的扫描磁盘将消耗大量的时间和资源,并且可过度地延迟数据的有效性。
根据本发明的一方面,可以通过以下手段来免除扫描磁盘上的数据项的需要(1)如果不清楚是否已经将数据项的特定版本写入磁盘,并且且恢复信息(例如重置日志)标记已经将特定版本写入磁盘,则使恢复过程假设特定数据项已经被成功写入磁盘,和(2)将该数据项的较早缓存的所有版本标记为“可疑”。在恢复操作后,系统接着可以借助相反的假设继续进行。具体地,该系统在数据项的特定版本没有写入磁盘的这个假设下继续进行的。然而,在将数据项的任何可疑版本写入磁盘之前,该系统将读取磁盘上保存的数据项版本。如果数据项在磁盘上的版本更接近,则不执行写入磁盘操作,并且该主控制器被告知哪个版本在磁盘上。可选地,主控制器接着发送写入通知消息给保持了由磁盘上的版本所覆盖的版本的所有节点。另一方面,该数据项被恢复。
同样,当节点请求数据项的当前版本时,因为该磁盘可能包含了该数据项的更近版本,所以不能将该数据项的可疑版本提供给该请求节点。相反,从磁盘读取该数据项在磁盘上的版本。如果从磁盘读取的数据项版本是最近版本,则该版本被提供给请求节点。如果该数据项在磁盘上的版本不是最近版本,则基于保留在已出现故障的节点的重置日志中的恢复信息来创建最近版本。
对校验点进行管理而不保留过去的镜像在上面给出的许多情况中,假定每个节点被配置为保留PI,直到该PI被写入磁盘操作覆盖。然而,根据本发明的一个实施例,并不保留这样的PI。
具体地,每个节点保留全局变脏校验点队列和局部变脏校验点队列。与局部变脏校验点队列中的条目相关的脏数据项将被保留,直到被写入磁盘操作覆盖。然而,与全局变脏校验点队列中的条目相关的PI不需要以此方式进行保留。
在该实施例中,如上所述,执行写入磁盘操作的权限受到数据项上保持的锁定模式约束。具体地,如果(1)节点拥有用于该数据项的专用锁,或(2)不存在拥有用于该数据项的专用锁的节点,并且该节点是保持该专用锁的最近节点,则该节点有权为数据项执行写入磁盘操作。
由于节点将具有用于局部变脏的所有数据项的专用锁,该节点将能够将与局部变脏队列相关的数据项写入磁盘而不需要主控制器干涉。该节点还可具有专用锁,或已持有的最近的专用锁,用于与全局变脏队列中的条目相关的数据项,从而能够将该数据项写入磁盘,而不需要主控制器干涉。
因为当脏数据项从缓存中检测出时,该节点并不保留PI,因此需要特定的恢复处理。具体地,当数据项的当前版本在数据项传递过程中或由于节点出现故障而丢失时,该系统将来自所有节点的经过合并的重置日志的变化应用于永久存储器上的数据项,以便重建该数据项的当前版本。在每个重置日志内部,开始恢复日志的位置由与该节点相关的校验点确定。直到数据项版本中包含了永久存储器的校验点之前在节点中进行的变化,节点中的校验点才被认为完成。因此,当将脏数据项用检测队列发送到(ping out to)另一节点,而不是在任何校验点队列中都保留该数据项的过去的镜像的时后,该数据项自身可被丢弃,且该数据项报头或控制块被链接到全局变脏队列中。
该全局变脏队列由与条目相关的第一变脏时间进行排序,并且,其与全局变脏队列相似,只不过不存在为每个条目保持相关的真实数据项(即,在该节点的缓存中不存在该数据项的内容)。节点中的校验点将是在局部变脏队列的开头的条目的首次变脏时间和在全局变脏队列的开头的条目的首次变脏时间中较低的。
当节点想要将其校验点提前时,其可将局部变脏队列中的数据项写入,而无主控制器干涉(因为从来不存在两个节点在相同时间将相同数据项写入的可能性),或发送写入请求给主控制器,以便写出在拥有者节点处的数据项,其中该数据项相应于全局变脏队列中数据项报头的更近版本。
根据可选实施例,在每个节点中储存了两个校验点记录(每个队列一个)。第一校验点记录将标记时间TX,其中在节点缓存中,在TX之前对当前变脏的数据项所作出的所有变化都记录在位于永久存储器上的数据项版本上。第二校验点记录包括数据项列表和在该节点中作出的首次变化的版本号,在该节点中,该版本号曾经变脏,但后来被检测出,并且未写入永久存储器。一旦脏数据项已经被检测出,则缓存就无法对脏数据项进行追踪,但是仍在该主控制器中使锁开启(即,在出现写入通知之前,锁不会被关闭)。
在节点出现故障后,通过确定(1)当被第一校验点记录确定的日志中的位置(称其为局部校验点记录),以及(2)当被对第二校验点记录中的数据项列表所作出的最早变化所确定的日志中的位置(其可被认为全局校验点记录的特定节点部分)中较少的一方,以计算用于扫描出现故障的节点上的重置日志的起始位置。
在恢复的过程中,对于全局校验点记录到节点的局部校验点记录之间的日志部分的潜在重置而言(假设全局校验点记录是在局部校验点记录之后),只有那些对应于全局校验点记录中的数据项的日志记录需要被考虑。一旦得到局部的校验点记录,需要为潜在的重置而考虑所有的日志记录,直到到达日志末端。
这个方案优于现有方法,因为其将第二校验点记录中的数据项列表限制到先前已在该节点中变脏的数据项(与整个系统中所有脏数据项相反)。其次,可独立于其它节点写入每个节点的全局校验点记录(即不需要协调全局主控制器或GLM校验点)。最后,因为不需要从整个系统中最早的未写入的变化扫描每个节点的重置日志,在恢复期间需要扫描的每个节点的重置日志部分总是比较短的。
而且,在具有全局缓存区的情况下,现有永久性存储器写入协议假设对一个同步的全局时钟进行访问,其中将来自时钟的数值用作日志序列码(LSN)。在此处给出的技术不需要存取同步全局时钟。而且,现有技术要求全局主控制器(GLM),其保存锁附着(lockcoherency)以及群集中脏数据项的恢复序列号。此外,现有技术不能容易地延伸到那些主控制器分布在几个节点的系统(DLM)。
硬件综述图9是示出执行本发明的实施例的计算机系统900的数据项框图。计算机系统900包括总线902或其它用于传送信息的通信结构,还包括与总线902连接并用于处理信息的处理器904。计算机系统900还包括主存储器906,例如随机存取存储器(RAM)或其它动态存储装置,该主存储器906与总线902相连,用于储存信息和处理器904所要执行的指令。在执行处理器904所要执行的指令的过程中,主存储器906还可被用于储存临时变量或其它中间信息。计算机系统900还包括只读存储器(ROM)908或其它静态存储装置,被连接到总线902,用于储存静态信息和用于处理器904的指令。还提供了诸如磁性永久存储器或光学永久存储器等的存储装置910,与总线902相连,用于储存信息和指令。
计算机系统900可经由总线902连接至显示器912(诸如阴极射线管(CRT)),用于将信息显示给计算机用户。包括字母数字键和其它按键的输入装置914与总线902相连,用于将信息和命令选择传送给处理器904。另一中用户输入装置是光标控制器916,例如鼠标、轨迹球、或光标方向键,用于将指示信息和命令选择传送给处理器904,并用于控制在显示器912上的光标移动。这种输入装置通常在第一轴(例如x)和第二轴(例如y)这两个轴上具有二维自由度,由此允许该装置确定平面上的位置。
本发明涉及使用计算机系统900来实施本文中所述的技术。根据本发明的一个实施例,处理器904执行主存储器906中所包含的一个或多个指令的一个或多个序列,该计算机系统900对此作出响应,从而执行那些技术。这样的指令可从例如存储装置910等的另一计算机可读介质读入主存储器906。通过执行包含在主存储器906中的指令序列,使处理器904执行此处所述的处理步骤。在可选实施例中,硬布线(hard-wired)电路可被用于代替软件指令或与软件指令一起使用,以实施本发明。因此,本发明的实施例不限于硬件电路和软件的任何特定组合。
本文中所用的术语“计算机可读介质”是指参与提供指令给处理器904以供执行的任何介质。这样的介质可采用许多形式,包括但不限于,非易失介质、易失介质、和传输介质。例如,非易失介质包括光学或磁性永久存储器,例如存储装置910等。易失介质包括动态存储器,例如主存储器906等。传输介质包括同轴电缆、铜线和光纤,其中包括构成了总线902的线路。传输介质还可采用声波或光波的形式,例如那些在无线电波和红外线数据通信中产生的信号。
计算机可读介质的普通形式包括,例如,软盘(floppy disk)、软磁盘(flexible disk)、硬盘、磁带、或任何其它磁性介质、CD-ROM、任何其它光学介质、穿孔卡、纸带纸条、具有孔洞图案的任何其它物理介质、RAM、PROM、和EPROM、FLASH-EPROM、任何其它的记忆芯片或盒式磁盘、下文中将描述的载波、或计算机可从其读取的任何其它介质。
不同形式的计算机可读介质可以涉及向处理器904传送用于执行的一个或多个指令的一个或多个序列。例如,最初可在远程计算机的磁盘上承载该指令。该远程计算机可将该指令载入其动态存储器,并通过使用调制解调器的电话线路来发送指令。计算机系统900本地的调制解调器可通过电话线路接收数据,并使用红外线发送器(infra-red transmitter)使该数据转变为红外线信号。红外线监测器可接收在红外线信号中传送的数据,而适当的电路可将该数据放置到总线902上。总线902将该数据传送给主存储器906,处理器904从该主存储器906取回(retrieve)并执行该指令。在通过处理器904执行之前或之后,主存储器906执行的指令可随意地储存在存储装置910上。
计算机系统900还包括与总线902相连的通信接口918。通信接口918提供了与网络链路920相连的双向数据通信,该网络链路920连接至本地网络922。例如,通信接口918可是综合业务数字网(ISDN)网卡或调制解调器,以提供到相应类型的电话线路的数据通信连接。作为另一示例,通信接口918可是局域网(LAN)网卡,以提供到兼容的LAN的数据通信连接。也可实施无线链路。在任何这样的实施中,通信接口918发送和接收电、电磁、或光信号,这些信号承载那些表示各种类型信息的数字数据流。
网络链路920通常通过一个或多个网络向其它数据装置提供数据通信。例如,网络链路920可提供通过本地网络922到主机924或到互联网服务提供商(ISP)926运作的数据设备的连接。ISP926反过来提供通过万维分组数据通信网络(现在通常称之为“互联网”)928的数据通信服务。本地网络922和互联网928都使用承载数字数据流的电、电磁、或光信号。经由不同网络的信号和在网络链路920上经由通信接口918的信号传送的是传送至计算机系统900和从计算机系统900传送的数字数据,这些信号是传输该信息的载波的示范性形式。
计算机系统900可通过网络、网络链路920、和通信接口918发送消息和接收数据,包括程序代码。在互联网示例中,服务器930可以通过网络928、ISP926、本地网络922、和通信接口918来传输用于应用程序的被请求代码。
当所接收的代码被接收、和/或储存在存储装置910或其它非易失存储器中用于随后执行时,其可被处理器904执行。以此方式,计算机系统900可获得载波形式的应用代码。在上述的说明中,已参考特定实施例对本发明进行了描述。然而,显而易见的是,可对本发明作出各种修改和变化,而不偏离本发明的较广的精神和范围。因此,该说明书和图被认为是示范性的,而没有限制意义。
权利要求
1.一种用于在具有多个缓存的系统中管理缓存的方法,所述多个缓存包含有数据项的不同副本,所述方法包括以下步骤修改所述多个缓存的第一节点中的所述数据项,从而创建修改的数据项;将来自所述第一节点的所述修改的数据项发送给所述多个缓存的第二节点,而不用将来自所述第一节点的所述修改的数据项持久地储存到永久存储器;在已经将所述修改的数据项从所述第一节点发送给所述第二节点之后,所述第一节点发送请求给所述数据项的主控制器(master),用于将所述数据项写入永久存储器;以及响应于所述请求,所述主控制器与所述多个缓存进行协调,从而将所述数据项写入永久存储器。
2.根据权利要求1所述的方法,其中所述方法包括在一有序系列二进制文件(bin)中保存用于数据项的过去镜像版本(past-image version)的条目(entry)的步骤;在所述有序系列中的每个二进制文件都相应于时间范围;特定的二进制文件相应于所述时间范围,所述时间范围包括所述数据项在所述第一节点中被修改的时间;以及通过发送用于将所述有序序列二进制文件中的特定二进制文件写入永久存储器的请求,从而执行所述发送请求的步骤。
3.根据权利要求2所述的方法,其中所述主控制器与所述多个缓存进行协调,从而将所述数据项写入永久存储器的步骤包括所述主控制器使所述多个缓存将数据项写入永久存储器,从而覆盖在所述特定二进制文件的所述时间范围内被修改的数据项的所有的过去镜像版本。
4.根据权利要求3所述的方法,还包括在所述多个缓存将数据项写入永久存储器,以覆盖在所述特定二进制文件的所述时间范围内被修改的数据项的所有的过去镜像版本之后,清空所述特定二进制文件的步骤。
5.根据权利要求4所述的方法,其中所述清空特定二进制文件的步骤包括以下步骤丢弃所述特定二进制文件中与过去镜像相关的条目,所述过去镜像具有在所述特定二进制文件的所述时间范围内的最后变脏的时间;以及将所述特定二进制文件中与过去镜像相关的条目移动到一个或多个其它二进制文件中,所述过去镜像具有比所述特定二进制文件的所述时间范围更晚的最后变脏的时间。
6.根据权利要求1所述的方法,其中通过发送所述请求给全局锁管理器来执行所述发送请求给主控制器的步骤。
7.根据权利要求1所述的方法,其中通过发送所述请求给锁管理器来执行所述发送请求给主控制器的步骤,所述锁控制器是分布式锁管理系统中的多个锁管理器的一个。
8.根据权利要求1所述的方法,还包括响应于正在被写入永久存储器的所述数据项,从所述主控制器发送写入通知消息给感兴趣的节点(interested node)的步骤,所述写入通知消息指示所述数据项已被写入永久存储器。
9.根据权利要求8所述的方法,其中所述发送写入通知消息的步骤包括所述主控制器发送单个消息给至少一个感兴趣的节点,所述单个消息向所述至少一个感兴趣的节点通报多个数据项已被写入永久存储器。
10.根据权利要求1所述的方法,其中所述第一节点发送请求给所述数据项的主控制器,用于将所述数据项写入永久存储器的步骤包括所述第一节点发送单个消息给所述主控制器,所述单个消息请求将多个数据项写入永久存储器,其中所述多个数据项包括所述数据项。
11.根据权利要求10所述的方法,其中所述发送单个消息的步骤包括发送识别二进制文件以请求将属于所述二进制文件的所有数据项写入永久存储器的消息。
12.根据权利要求11所述的方法,其中所述二进制文件与时间范围相关,所述二进制文件包括在所述时间范围内被所述第一节点首先变脏的数据项,以及随后传递给其它节点而没有首先写入永久存储器的数据项。
13.根据权利要求8所述的方法,其中所述从所述主控制器发送写入通知消息给感兴趣的节点的步骤包括以下步骤立即发送写入通知消息给第一组感兴趣的节点,其中所述第一组感兴趣的节点包括已请求将所述数据项写入永久存储器的所述感兴趣的节点;以及延迟发送写入通知消息到第二组节点,其中所述第二组节点包括不属于所述第一组感兴趣的节点的感兴趣的节点。
14.根据权利要求8所述的方法,其中从所述主控制器发送给感兴趣的节点的步骤包括延迟发送写入通知消息到至少一个感兴趣的节点。
15.根据权利要求14所述的方法,其中响应于由所述至少一个感兴趣的节点作出的锁定请求,发送写入通知消息给所述至少一个感兴趣的节点。
16.根据权利要求14所述的方法,其中响应于所述至少一个感兴趣的节点将所述数据项写入永久存储器的请求,发送写入通知消息给所述至少一个感兴趣的节点。
17.根据权利要求14所述的方法,其中在检测请求中,发送写入通知消息给至少一个感兴趣的节点,所述主控制器为了所述至少一个节点将所述检测请求发送给所述至少一个感兴趣的节点,以将另一数据项传递给另一节点。
18.根据权利要求1所述的方法,其中所述协调步骤包括以下步骤确定是否已经将至少与所述修改的版本一样新的所述数据项版本写入永久存储器;以及如果已经将至少与所述修改的版本一样新的所述数据项版本写入永久存储器,则从所述主控制器发送写入通知消息,以通知所述第一节点,已经将至少与所述修改的版本一样新的所述数据项版本写入永久存储器。
19.根据权利要求18所述的方法,其中所述协调步骤包括如果至少与所述修改的版本一样新的所述数据项版本还没有被写入永久存储器,则发送来自所述主控制器的写入执行消息以准许将所述修改的版本写入永久存储器。
20.根据权利要求1所述的方法,其中所述协调步骤包括以下步骤选择具有所述数据项特定版本的所述多个缓存的特定节点,其中所述特定版本至少与所述第一节点中所述修改的数据项一样新;以及使所述数据项的所述特定版本从所述特定节点写入永久存储器。
21.根据权利要求20所述的方法,其中所述选择特定节点的步骤包括选择具有所述数据项最新修改版本的所述多个缓存的所述节点。
22.根据权利要求20所述的方法,还包括响应于所述主控制器接收已经将所述数据项的所述特定版本写入永久存储器的确认,所述主控制器通知所述第一节点所述数据项已被写入永久存储器的步骤。
23.根据权利要求20所述的方法,还包括响应于所述主控制器接收已经将所述数据项的所述特定版本写入永久存储器的确认,所述主控制器通知一组缓存,所述数据项已被写入永久存储器的步骤,其中所述组缓存包括不同于所述特定节点的缓存,所述缓存含有所述数据项的修改版本,其不比所述特定版本更新。
24.一种用于在具有多个缓存的系统中管理缓存的方法,所述多个缓存可包含数据项的不同副本,包括以下步骤在第一缓存中修改所述数据项以创建修改的数据项;响应于将所述修改的数据项写入永久存储器,执行以下步骤与所述第一缓存相关的节点确定所述多个缓存中的任何其它缓存是否已经创建所述数据项的脏版本;如果所述多个缓存中的任何其它缓存已经创建所述数据项的脏版本,则与所述第一缓存相关的所述节点通知所述数据项的主控制器所述修改的数据项已被写入永久存储器;以及如果所述多个缓存中的其它缓存没有创建所述数据项的脏版本,则执行将所述修改的数据项写入的步骤,而不通知所述主控制器所述修改的数据项已被写入永久存储器。
25.根据权利要求24所述的方法,其中所述确定所述多个缓存中的任何其它缓存是否已创建所述数据项的脏版本的步骤包括检查与所述数据项相关的全局变脏标记。
26.根据权利要求25所述的方法,其中在所述第一缓存中修改所述数据项之前,所述数据项已在第二缓存中被修改;在所述第二缓存中被修改和在所述第一缓存中被修改之间,没有持久地储存所述数据项;以及与所述第二缓存相关的节点使所述全局变脏标记被设定以表示所述数据项是全局变脏的。
27.根据权利要求26所述的方法,其中响应于将所述数据项从所述第二缓存传递到所述多个缓存的另一缓存,与所述第二缓存相关的所述节点使所述全局变脏标记被设定。
28.一种用于在具有多个缓存的系统中管理缓存的方法,所述多个缓存可包含数据项的不同副本,包括以下步骤在第一缓存中修改所述数据项以创建修改的数据项;当与所述第一节点相关的节点想要将所述修改的数据项写入永久存储器时,执行以下步骤如果与所述第一缓存相关的节点当前不具有对所述数据项的所有权,则与所述第一缓存相关的所述节点发送将所述数据项写入永久存储器的请求给所述数据项的主控制器;以及如果与所述第一缓存相关的所述节点当前具有对所述数据项的所有权,则所述第一节点将所述数据项写入永久存储器而不发送将所述数据项写入永久存储器的请求给所述主控制器。
29.根据权利要求28所述的方法,还包括将数据项中专用锁的持有者指定为所述数据项的拥有者的步骤。
30.一种用于管理数据项的方法,所述方法包括以下步骤当在数据项上有专用锁的节点想要将所述数据项写入永久存储器时,执行以下步骤确定与所述数据项相关的模式是局部的还是全局的;如果与所述数据项相关的模式是局部的,则所述节点将所述数据项写入永久存储器而不与所述数据项的主控制器通信;以及如果与所述数据项相关的模式是全局的,则所述节点发送消息给所述数据项的主控制器,以请求将所述数据写入永久存储器。
31.根据权利要求30所述的方法,其中与所述数据项相关的所述模式是全局的;以及所述方法还包括所述节点接收来自所述主控制器的许可以将所述数据项写入永久存储器;以及在将所述数据项写入永久存储器后,将所述模式从全局改变为局部。
32.根据权利要求30所述的方法,其中与所述数据项相关的所述模式是局部的;以及在所述节点已完成将所述数据项写入永久存储器之前,所述节点将所述数据项上的专用锁传递给另一节点。
33.根据权利要求32所述的方法,其中在将所述数据项上的专用锁传递给另一节点之前,所述节点将所述模式从局部改变为全局。
34.根据权利要求32所述的方法,其中当所述节点已完成将所述数据项写入永久存储器时,所述节点通知所述主控制器。
35.根据权利要求32所述的方法,其中响应于所述节点使所述主控制器被通知所述节点已完成将所述数据项写入永久存储器,所述主控制器使另一节点被通知所述节点已完成将所述数据项写入永久存储器。
36.根据权利要求33所述的方法,其中在所述节点已通知所述主控制器所述节点已完成将所述数据项写入永久存储器之后,响应于来自所述主控制器的消息,所述另一节点将所述模式从全局转换为局部。
37.一种用于管理数据项的方法,所述方法包括以下步骤当数据项从一个节点传递到另一节点时,执行以下步骤如果所述数据项已被所述节点弄脏且与所述数据项相关的模式是局部的,则在发送所述数据项给另一节点之前所述模式从局部转换为全局;如果所述数据项未被所述节点弄脏且与所述数据项相关的模式是局部的,则发送所述数据项给所述另一节点,而不改变所述模式;如果所述模式是局部的,则允许所述另一节点将所述数据项写入永久存储器,而不请求许可;以及如果所述模式是全局的,则要求所述另一节点获得许可,从而将所述数据项写入永久存储器。
38.根据权利要求37所述的方法,其中,在完成所述节点将所述数据项写入永久存储器之前,所述节点传递所述数据项给所述另一节点。
39.根据权利要求38所述的方法,其中,在完成所述节点将所述数据项写入永久存储器之后,所述节点发送消息给所述数据项的主控制器,以表示已经将所述数据项写入永久存储器。
40.根据权利要求39所述的方法,其中所述另一节点以全局模式接收所述数据项;所述另一节点发送请求给所述节点的所述主控制器,以请求允许写入所述数据项;以及通过通知所述另一节点以将所述模式从全局改变为局部,所述主控制器响应所述请求。
41.一种管理数据项版本的方法,所述方法包括以下步骤当数据项的脏版本从第一节点传递到第二节点,同时所述数据项的正在被写入的版本正在被写入永久存储器时,执行以下步骤将关于所述正在被写入的版本的版本信息传送给所述第二节点;以及基于所述版本信息,所述第二节点防止属于第一组版本的所述数据项的任何版本与属于第二组版本的所述数据项的任何版本合并;其中所述第一组版本包括在所述第二节点内至少与所述正在被写入的版本一样旧的所述数据项的所有版本;以及其中所述第二组版本包括在所述第二节点内比所述正在被写入的版本更新的所述数据项版本。
42.根据权利要求41所述的方法,其中所述传送步骤通过指派给所述数据项的主控制器来执行。
43.根据权利要求41所述的方法,其中所述第二节点包括在所述第一组中的多个版本;以及所述第二节点合并所述多个版本。
44.根据权利要求41所述的方法,还包括以下步骤当所述正在被写入的版本已被成功地写入永久存储器时,通知所述第二节点;以及在所述第二节点已被通知所述正在被写入的版本已被成功地写入永久存储器后,允许所述第二节点丢弃所述第一组版本中的所有版本。
45.根据权利要求43所述的方法,还包括以下步骤当所述正在被写入的版本已被成功地写入永久存储器时,通知所述第二节点;以及在所述第二节点已被通知所述正在被写入的版本已被成功地写入永久存储器后,允许所述第二节点丢弃通过合并所述多个版本而创建的合并版本。
46.一种用于管理数据项的过去镜像的方法,所述方法包括以下步骤估计数据项的第一过去版本不久将被写入永久存储器或通过写入永久存储器进行覆盖的可能性;如果所估计的可能性超过特定阈值,则储存与所述数据项的第一过去版本分开的所述数据项的第二过去版本;以及如果所估计的可能性低于特定阈值,则将所述数据项的第二过去版本与所述数据项的第一过去版本合并。
47.根据权利要求46所述的方法,其中所述估计步骤基于与所述数据项的第一过去版本相关的时间和与重置日志文件中的新近的条目相关的时间之间的比较。
48.根据权利要求46所述的方法,其中所述估计步骤基于与所述数据项的第一过去版本相关的时间和与在校验点队列的开头的条目相关的时间之间的比较。
49.一种计算机可读介质,承载用于在具有多个缓存的系统中管理缓存的指令,所述缓存可含有数据项的不同副本,所述指令包括用于执行以下步骤的指令修改所述多个缓存的第一节点中的所述数据项,以创建修改的数据项;从所述第一节点发送所述修改的数据项给所述多个缓存的第二节点,而不将来自所述第一节点的所述修改的数据项持久地储存到永久存储器;在所述修改的数据项已被从所述第一节点发送给所述第二节点后,所述第一节点发送请求给所述数据项的主控制器,用于将所述数据项写入永久存储器;以及响应所述请求,所述主控制器与所述多个缓存进行协调,从而将所述数据项写入永久存储器。
50.根据权利要求49所述的计算机可读介质,其中所述计算机可读介质包括指令,用于在有序序列的二进制文件中执行保存用于数据项的过去镜像的条目的步骤;所述有序序列中的每个二进制文件相应于时间范围;特定二进制文件相应于所述时间范围,所述时间范围包括所述数据项在所述第一节点中被修改的时间;以及通过发送用于将所述有序序列二进制文件中的特定二进制文件写入永久存储器的请求,来执行所述发送请求的步骤。
51.根据权利要求50所述的计算机可读介质,其中所述主控制器与所述多个缓存进行协调以使所述数据项被写入永久存储器的步骤包括所述主控制器使所述多个缓存将数据项写入永久存储器,以覆盖在所述特定二进制文件的所述时间范围内被修改的数据项的所有的过去镜像版本。
52.根据权利要求51所述的计算机可读介质,还包括指令,用于在所述多个缓存将数据项写入永久存储器,以覆盖在所述特定二进制文件的所述时间范围内被修改的数据项的所有过去的镜像版本之后,执行清空所述特定二进制文件的步骤。
53.根据权利要求52所述的计算机可读介质,其中所述清空所述特定二进制文件的步骤包括以下步骤丢弃在所述特定二进制文件内与过去镜像相关的条目,所述过去镜像在所述特定二进制文件的所述时间范围内具有最后变脏的时间;以及将所述特定二进制文件中与过去镜像相关的条目移动到一个或多个其它二进制文件,所述过去镜像具有比所述特定二进制文件的所述时间范围更晚的最后变脏的时间。
54.根据权利要求49所述的计算机可读介质,其中所述发送请求给主控制器的步骤通过发送所述请求给全局锁管理器来执行。
55.根据权利要求49所述的计算机可读介质,其中所述发送请求给主控制器的步骤通过发送所述请求给锁管理器来执行,所述锁控制器是分布式锁管理系统中多个锁管理器的一个。
56.根据权利要求49所述的计算机可读介质,还包括指令,用于执行响应正在被写入永久存储器的所述数据项,从所述主控制器发送写入通知消息给感兴趣的节点的步骤,所述写入通知消息表示所述数据项已被写入永久存储器。
57.根据权利要求56所述的计算机可读介质,其中所述发送写入通知消息的步骤包括所述主控制器发送单个消息给至少一个感兴趣的节点,所述单个消息通知所述至少一个感兴趣的节点,多个数据项已被写入永久存储器。
58.根据权利要求49所述的计算机可读介质,其中所述第一节点发送请求给所述数据项的主控制器以将所述数据项写入永久存储器的步骤包括所述第一节点发送单个消息给所述主控制器,所述单个消息请求将多个数据项写入永久存储器,其中所述多个数据项包括所述数据项。
59.根据权利要求58所述的计算机可读介质,其中所述发送单个消息的步骤包括发送识别二进制文件以请求将属于所述二进制文件的所有数据项被写入永久存储器的消息。
60.根据权利要求59所述的计算机可读介质,其中所述二进制文件与时间范围相关,并且包括数据项,所述数据项在所述时间范围期间首先由所述第一节点变脏,并随后传递至其它节点,而不用首先写入永久存储器。
61.根据权利要求56所述的计算机可读介质,其中从所述主控制器发送写入通知消息给感兴趣的节点的步骤包括以下步骤立即发送写入通知消息给第一组感兴趣的节点,其中所述第一组感兴趣的节点包括已请求将所述数据项写入永久存储器的所述感兴趣的节点;以及延迟将写入通知消息发送给第二组节点,其中所述第二组节点包括不属于所述第一组感兴趣的节点的感兴趣的节点。
62.根据权利要求56所述的计算机可读介质,其中从所述主控制器发送给感兴趣的节点的步骤包括延迟将写入通知消息发送给至少一个感兴趣的节点。
63.根据权利要求62所述的计算机可读介质,其中响应于由所述至少一个感兴趣的节点作出的锁请求,将写入通知消息发送给所述至少一个感兴趣的节点。
64.根据权利要求62所述的计算机可读介质,其中响应于所述至少一个感兴趣的节点请求将所述数据项写入永久存储器,将写入通知消息发送给所述至少一个感兴趣的节点。
65.根据权利要求62所述的计算机可读介质,其中在所述检测请求中发送写入通知消息给所述至少一个感兴趣的节点,所述主控制器将所述检测请求发送给所述至少一个感兴趣的节点,以使所述至少一个感兴趣的节点传递另一数据项给另一节点。
66.根据权利要求49所述的计算机可读介质,其中所述协调步骤包括以下步骤确定至少与所述修改的版本一样新的所述数据项版本是否已经被写入永久存储器;以及如果至少与所述修改的版本一样新的所述数据项版本已经被写入永久存储器,则从所述主控制器发送写入通知消息以通知所述第一节点,至少与所述修改的版本一样新的所述数据项版本已经被写入永久存储器。
67.根据权利要求66所述的计算机可读介质,其中所述协调步骤包括,如果至少与所述修改的版本一样新的所述数据项版本还没有被写入永久存储器,则从所述主控制器发送写入执行消息,以许可将所述修改的版本写入永久存储器。
68.根据权利要求49所述的计算机可读介质,其中所述协调步骤包括以下步骤选择具有所述数据项的特定版本的所述多个缓存的特定节点,其中所述特定版本至少与所述第一节点中所述修改的数据项一样新;以及使所述数据项的所述特定版本从所述特定节点写入永久存储器。
69.根据权利要求68所述的计算机可读介质,其中所述选择特定节点的步骤包括选择所述多个缓存的所述节点,所述节点具有所述数据项的最新修改的版本。
70.根据权利要求68所述的计算机可读介质,还包括指令,用于响应所述主控制器接收确认,所述数据项的所述特定版本已被写入永久存储器,执行所述主控制器通知所述第一节点所述数据项已被写入永久存储器的步骤。
71.根据权利要求68所述的计算机可读介质,还包括指令,用于响应所述主控制器接收确认所述数据项的所述特定版本已被写入永久存储器,执行所述主控制器通知一组缓存所述数据项已被写入永久存储器的步骤,其中所述组缓存包括不同于所述特定节点的缓存,所述缓存含有所述数据项的修改版本,其不比所述特定版本更新。
72.一种用于在具有多个缓存的系统中管理缓存的方法,所述多个缓存可包含数据项的不同副本,所述指令包含用于执行以下步骤的指令在第一缓存中修改所述数据项以创建修改的数据项;响应于将所述修改的数据项写入永久存储器,执行以下步骤与所述第一缓存相关的节点确定在所述多个缓存中的任何其它缓存是否已创建所述数据项的脏版本;如果在所述多个缓存中的任何其它缓存已创建所述数据项的脏版本,则与所述第一缓存相关的所述节点通知所述数据项的主控制器,所述修改的数据项已被写入永久存储器;以及如果在所述多个缓存中的没有其它缓存已创建所述数据项的脏版本,则执行将所述修改的数据项写入的步骤,而不通知所述主控制器所述修改的数据项已被写入永久存储器。
73.根据权利要求72所述的计算机可读介质,其中确定所述多个缓存中的任何其它缓存是否已创建所述数据项的脏版本的步骤包括检查与所述数据项相关的全局变脏标记。
74.根据权利要求73所述的计算机可读介质,其中在所述第一缓存中修改所述数据项之前,所述数据项已在第二缓存中被修改;在所述第二缓存中被修改和在所述第一缓存中被修改之间,所述数据项未被持久地储存;以及与所述第二缓存相关的节点使所述全局变脏标记被设定以表示所述数据项是全局变脏的。
75.根据权利要求74所述的计算机可读介质,其中响应于将所述数据项从所述第二缓存传递到所述多个缓存的另一缓存,与所述第二缓存相关的所述节点使所述全局变脏标记被设定。
76.一种计算机可读介质,用于承载用于在具有多个缓存的系统中管理缓存的指令,所述多个缓存可包含数据项的不同副本,所述指令包含用于执行以下步骤的指令在第一缓存中修改所述数据项以创建修改的数据项;当与所述第一节点相关的节点想要将所述修改的数据项写入永久存储器时,执行以下步骤如果与所述第一缓存相关的节点当前不具有对所述数据项的所有权,则与所述第一缓存相关的所述节点发送将所述数据项写入永久存储器的请求给所述数据项的主控制器;以及如果与所述第一缓存相关的所述节点当前具有对所述数据项的所有权,则所述第一节点将所述数据项写入永久存储器,而不发送将所述数据项写入永久存储器的请求给所述主控制器。
77.根据权利要求76所述的计算机可读介质,还包括用于执行将数据项中专用锁的持有者指定为所述数据项的拥有者的步骤。
78.一种计算机可读介质,用于承载用于管理数据项的指令,所述指令包括用于执行以下步骤的指令当在数据项上具有专用锁的节点想要将所述数据项写入永久存储器时,执行以下步骤确定与所述数据项相关的模式是局部的还是全局的;如果所述与所述数据项相关的模式是局部的,则所述节点将所述数据项写入永久存储器,而不与所述数据项的主控制器通信;以及如果所述与所述数据项相关的模式是全局的,则所述节点发送消息给所述数据项的所述主控制器,以请求将所述数据写入永久存储器。
79.根据权利要求78所述的计算机可读介质,其中所述与所述数据项相关的模式是全局的;以及所述计算机可读介质还包括指令,用于所述节点从所述主控制器收到许可以将所述数据项写入永久存储器;以及在将所述数据项写入永久存储器后,将所述模式从全局改变为局部。
80.根据权利要求78所述的计算机可读介质,其中所述与所述数据项相关的模式是局部的;以及在所述节点已完成将所述数据项写入永久存储器之前,所述节点将所述数据项上的所述专用锁传递给另一节点。
81.根据权利要求80所述的计算机可读介质,其中在将所述数据项上的所述专用锁传递给另一节点之前,所述节点将所述模式从局部改变为全局。
82.根据权利要求80所述的计算机可读介质,其中当所述节点已完成将所述数据项写入永久存储器时,所述节点通知所述主控制器。
83.根据权利要求80所述的计算机可读介质,其中响应于所述节点通知所述主控制器,所述节点已完成将所述数据项写入永久存储器,所述主控制器通知所述另一节点,所述节点已完成将所述数据项写入永久存储器。
84.根据权利要求81所述的计算机可读介质,其中在所述节点已通知所述主控制器,所述节点已完成将所述数据项写入永久存储器后,响应来自所述主控制器的消息,所述另一节点将所述模式从全局转换为局部。
85.一种计算机可读介质,用于承载用于管理数据项的指令,所述指令包括用于执行以下步骤的指令当数据项从一个节点传递到另一节点时,执行以下步骤如果所述数据项已被所述节点弄脏,并且与所述数据项相关的模式是局部的,则在发送所述数据项给另一节点之前,将所述模式从局部改变为全局;如果所述数据项未被所述节点弄脏,并且与所述数据项相关的所述模式是局部的,则发送所述数据项给所述另一节点,而不改变所述模式;如果所述模式是局部的,则允许所述另一节点将所述数据项写入永久存储器,而不请求许可;以及如果所述模式是全局的,则要求所述另一节点获得许可,从而将所述数据项写入永久存储器。
86.根据权利要求85所述的计算机可读介质,其中在完成所述节点将所述数据项写入永久存储器之前,所述节点将所述数据项传递给所述另一节点。
87.根据权利要求86所述的计算机可读介质,其中,在所述节点将所述数据项写入永久存储器完成之后,所述节点发送消息给所述数据项的主控制器,以表示所述数据项已被写入永久存储器。
88.根据权利要求87所述的计算机可读介质,其中所述另一节点以全局模式接收所述数据项;所述另一节点发送请求给所述节点的所述主控制器,以允许将所述数据项写入;以及通过通知所述另一节点将所述模式从全局改变为局部,所述主控制器响应所述请求。
89.一种计算机可读介质,用于承载用于管理数据项版本的指令,所述指令包括用于执行以下步骤的指令当数据项的脏版本从第一节点传递到第二节点,同时所述数据项正在被写入的版本正在被写入永久存储器时,执行以下步骤将关于所述正在被写入的版本的版本信息传送给所述第二节点;以及基于所述版本信息,所述第二节点防止属于第一组版本的所述数据项的任何版本与属于第二组版本的所述数据项的任何版本合并;其中所述第一组版本包括在所述第二节点内至少与所述正在被写入的版本一样旧的所述数据项的所有版本;以及其中所述第二组版本包括在所述第二节点内比所述正在被写入的版本更新的所述数据项版本。
90.根据权利要求89所述的计算机可读介质,其中由指派给所述数据项的主控制器执行所述传送步骤。
91.根据权利要求89所述的计算机可读介质,其中所述第二节点包括在所述第一组中的多个版本;以及所述第二节点合并所述多个版本。
92.根据权利要89所述的计算机可读介质,还包括用于执行以下步骤的指令当所述正在被写入的版本已被成功地写入永久存储器时,通知所述第二节点;以及在所述第二节点已被通知所述正在被写入的版本已被成功地写入永久存储器后,允许所述第二节点丢弃在所述第一组版本中的所有版本。
93.根据权利要求91所述的计算机可读介质,还包括用于执行以下步骤的指令当所述正在被写入的版本已被成功地写入永久存储器时通知所述第二节点;以及在所述第二节点已被通知所述正在被写入的版本已被成功地写入永久存储器后,允许所述第二节点丢弃通过合并所述多个版本创建的合并版本。
94.一种计算机可读介质,用于承载用于管理数据项的过去镜像的指令,所述指令包括用于执行以下步骤的指令估计数据项的第一过去版本不久将被写入永久存储器或被到永久存储器的写入覆盖的可能性;如果所估计的可能性超过特定阈值,则储存与所述数据项的所述第一过去版本分开的所述数据项的第二过去版本;以及如果所估计的可能性低于特定阈值,则将所述数据项的所述第二过去版本与所述数据项的所述第一过去版本合并。
95.根据权利要求94所述的计算机可读介质,其中所述估计步骤基于与所述数据项的所述第一过去版本相关的时间和与重置日志文件中的新近条目相关的时间之间的比较。
96.根据权利要求94所述的计算机可读介质,其中所述估计步骤基于与所述数据项的所述第一过去版本相关的时间和与在校验点队列开头的条目相关的时间之间的比较。
全文摘要
本发明提供了一种用于管理系统中的缓存的技术,该系统具有多个缓存,其可含有相同数据项的不同副本。具体地,提供了一种用于对在这样的数据项上执行的写入磁盘操作进行协调的技术,以确保该数据项的较旧版本不会改写较新版本,并且减少了出现故障后进行恢复所需要的处理量。还提供了各种方法,其中使用主控制器与多个缓存进行协调,以将数据项写入永久存储器。还提供了一种用于管理与缓存相关的校验点的技术,其中该校验点被用于确定在出现故障时开始处理恢复日志的位置。
文档编号G06F11/14GK1496510SQ02806162
公开日2004年5月12日 申请日期2002年3月6日 优先权日2001年3月7日
发明者萨什坎斯·钱德拉塞克拉恩, 萨什坎斯 钱德拉塞克拉恩, 班福德, 罗杰·班福德, 威廉·布里奇, 布里奇, 大卫·布劳尔, 布劳尔, 尼尔·麦克诺顿, 麦克诺顿, 尚, 威尔逊·尚, 斯瑞哈瑞, 维纳伊·斯瑞哈瑞 申请人:甲骨文国际公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1