專利名稱:對多節(jié)點系統(tǒng)中的檢查點隊列進行管理的制作方法
技術領域:
本發(fā)明涉及磁盤寫入操作的執(zhí)行,尤其涉及對多個系統(tǒng)中的臟數(shù)據(jù)項的寫入進行協(xié)調,其中這些系統(tǒng)允許一個數(shù)據(jù)項的臟數(shù)據(jù)版本駐留在多個節(jié)點的緩存區(qū)中。
背景技術:
一種改進數(shù)據(jù)庫系統(tǒng)中的可擴展性的方法是允許多個節(jié)點同時讀取和修改共享存儲器中的數(shù)據(jù)。每個節(jié)點都具有一個緩存區(qū),以便將數(shù)據(jù)保持在易失主存儲器中,并且使用非易失共享磁盤存儲器來進行備份。一個全局鎖管理器(GLM)或一個分布式鎖管理器(DLM)用來維持節(jié)點之間的緩存區(qū)相關性。為了提供從清除主存儲器內容的節(jié)點故障中進行的恢復,使用了通用的預寫式日志(WAL)協(xié)議。出于性能原因,每個節(jié)點都具有一個記錄各種改變的私有重做日志。而為了減少節(jié)點故障之后需要在重做日志中被掃描的改變的數(shù)量,通常會采用遞增或周期性的檢查點,由此確保不必將檢查點之前對數(shù)據(jù)項所做的全部改變重新應用于非易失存儲器中的數(shù)據(jù)項。
并發(fā)控制在運行于相同或不同節(jié)點的事務之間執(zhí)行的并發(fā)控制是借助于全局事務頁級鎖或行級鎖來實施的。事務系統(tǒng)可以使用強制策略或非強制性策略,在強制策略中,經(jīng)過事務修改的數(shù)據(jù)項(例如頁面/數(shù)據(jù)塊)在提交事務的過程中寫入到穩(wěn)定存儲器中,而在非強制策略中,只有重做日志中的事務變化是在提交事務時強制執(zhí)行的。將強制策略與頁級鎖一起使用,這意味著數(shù)據(jù)塊僅僅由一個節(jié)點(實際上僅僅由一個事務)進行修改,并且在任何時刻都只能在一個系統(tǒng)緩存區(qū)中變臟。在所有其他組合中(也就是行級鎖與強制策略一起,頁級鎖與非強制策略一起,以及行級鎖與非強制策略一起),可以在多個系統(tǒng)中修改這些數(shù)據(jù)項并且還需要一種緩存區(qū)一致機制。
最普通的范例是具有非強制數(shù)據(jù)項管理策略的行級鎖。出于說明目的,以下給出的例子是在使用了具有非強制數(shù)據(jù)項管理策略的行級鎖的系統(tǒng)環(huán)境中提供的。然而,這里描述的技術并不局限于這種環(huán)境。
檢查點隊列在提交事務時,反映事務所進行的改變的數(shù)據(jù)必須保存在永久性存儲器中。在某些系統(tǒng)中,在提交的時候必須持續(xù)保存那些指示事務所進行的改變的重做記錄,但是可以延遲那些經(jīng)過修改的數(shù)據(jù)項自身的實際寫入。那些(1)包含變化和(2)沒有持續(xù)保存的數(shù)據(jù)項稱為“臟數(shù)據(jù)項”。通常,節(jié)點中的臟數(shù)據(jù)項越多,如果節(jié)點出現(xiàn)故障,則恢復時間也就越長。因此,為了確?;謴蜁r間不會長到難以接受,節(jié)點可以保持一個檢查點隊列。
檢查點隊列包含了標識臟數(shù)據(jù)項的條目。隊列中的條目是根據(jù)持續(xù)保存的重做日志中的相應重做記錄順序來排列的。如果發(fā)生故障,則必須從一條重做記錄開始而對重做日志進行處理,其中該記錄與位于檢查點隊列頭部的條目相對應。
在把一個臟數(shù)據(jù)項寫入永久性存儲器時,對應于這個數(shù)據(jù)項的條目將從檢查點隊列中刪除。在從檢查點隊列中刪除位于檢查點隊列頭部的條目時,在重做日志內部,恢復處理開始的位置必須開始改變而導致檢查點“提前”。檢查點在重做日志中提前的越多,在出現(xiàn)故障時,從故障中恢復所要完成的工作也就越少。因此,節(jié)點通常會嘗試將那些由位于檢查點隊列頭部的條目所標識的臟數(shù)據(jù)項寫入永久性存儲器。然而,如在下文更詳細描述的那樣,在多個節(jié)點的緩存區(qū)中有可能存在同一數(shù)據(jù)項的多個臟數(shù)據(jù)版本,這時,協(xié)調臟數(shù)據(jù)項的寫入尤為重要。
經(jīng)由共享的永久性存儲器的數(shù)據(jù)項轉移在多個系統(tǒng)同時修改數(shù)據(jù)項時,需要一種機制來協(xié)調已修改數(shù)據(jù)項關于穩(wěn)定的共享永久性存儲器寫入。在某些系統(tǒng)中使用了穩(wěn)定的共享永久性存儲器作為介質,以便將經(jīng)過修改的數(shù)據(jù)項從一個節(jié)點轉移到另一個節(jié)點,由此簡化這個問題。當節(jié)點中一個臟數(shù)據(jù)項需要在一個不同節(jié)點加以修改的時候,在將頁面鎖授予這個希望修改臟數(shù)據(jù)項的節(jié)點之前,數(shù)據(jù)項首先寫入到共享的永久存儲器中。當一個不同節(jié)點需要讀取所修改數(shù)據(jù)項的當前版本時,相同的寫入永久性存儲器和讀取永久性存儲器的序列將會得到使用。
經(jīng)由互連的數(shù)據(jù)項轉移在使用非易失存儲器作為介質,由此在節(jié)點之間轉移數(shù)據(jù)項的系統(tǒng)中,沒有必要協(xié)調不同節(jié)點之間的臟數(shù)據(jù)項寫入。每個節(jié)點可以使用常規(guī)機制來寫出臟數(shù)據(jù)項及執(zhí)行檢查點。
在某些系統(tǒng)中,當請求節(jié)點僅僅需要所修改數(shù)據(jù)項的一個一致性快照版本時,經(jīng)過修改的數(shù)據(jù)項將會發(fā)送到請求節(jié)點,而不會將該數(shù)據(jù)項寫入永久性存儲器。因此,通過這種一致性控制機制,盡管不同節(jié)點中的多個事務可以在提交事務之前使用行級鎖來修改同一數(shù)據(jù)項,但是任何數(shù)據(jù)庫的數(shù)據(jù)項都只在一個節(jié)點緩存區(qū)中是臟的。因此,在節(jié)點出現(xiàn)故障時,只需要從節(jié)點的檢驗點記錄開始掃描該節(jié)點的重做日志,一直掃描到其重做日志末端,由此即可恢復數(shù)據(jù)庫。此外,當多個節(jié)點發(fā)生故障時,可以掃描每個節(jié)點的重做日志并且按序應用這些重做日志,由此恢復數(shù)據(jù)庫,也就是說,不需要合并來源于多個重做日志的改變。
然而,為了提高從一個具有排他鎖并且有可能修改了數(shù)據(jù)項的節(jié)點向一個請求相同數(shù)據(jù)項以供排他使用或是請求現(xiàn)有版本以供讀取的節(jié)點進行數(shù)據(jù)項轉移的等待時間,較為理想的是把數(shù)據(jù)項從一個節(jié)點的主存儲器直接轉移到另一個節(jié)點的主存儲器,而不先將數(shù)據(jù)項寫入永久性存儲器。當把臟數(shù)據(jù)項從一個節(jié)點轉移到另一個節(jié)點時,稱為過去鏡像(past image)(PI)的數(shù)據(jù)項的一個拷貝既可保留在發(fā)送節(jié)點中,也可以不在發(fā)送節(jié)點中保留。
當節(jié)點準許轉移臟數(shù)據(jù)項而不需要將其存入永久存儲器時,必須在不同節(jié)點之間對臟數(shù)據(jù)項的寫入進行協(xié)調。如果沒有進行協(xié)調,則轉移了臟數(shù)據(jù)項的節(jié)點可能希望通過把臟數(shù)據(jù)項寫入永久存儲器來使其檢查點提前。然而,如果其他某些節(jié)點已經(jīng)將數(shù)據(jù)項的更新版本寫入了永久存儲器,則將臟數(shù)據(jù)項寫入永久存儲器有可能會破壞數(shù)據(jù)完整性。
此外,除非把臟數(shù)據(jù)項寫入磁盤,否則檢查點不能提前。如果一個節(jié)點并未保持那些由該節(jié)點發(fā)送到其他節(jié)點的數(shù)據(jù)項的臟數(shù)據(jù)版本,則這個節(jié)點必須以某種方式來與另一個節(jié)點協(xié)調寫入操作。
此外,對于一個可擴縮的系統(tǒng)來說,由系統(tǒng)執(zhí)行的寫入磁盤操作的數(shù)目不應該是系統(tǒng)節(jié)點數(shù)目的一個函數(shù)。相反,寫入磁盤操作的數(shù)目應該只反映了對系統(tǒng)內部數(shù)據(jù)項的實際改變。
基于上文,較為理想的是提供那些對系統(tǒng)中的臟數(shù)據(jù)項寫入進行協(xié)調的技術方法,在這些系統(tǒng)中,同一數(shù)據(jù)項的臟數(shù)據(jù)版本有可能位于一個以上的易失存儲器之中。
發(fā)明內容
由此提供了用于管理一個系統(tǒng)中的緩存區(qū)的技術方法,該系統(tǒng)具有多個緩存區(qū),這些緩存區(qū)可以包含同一數(shù)據(jù)項的不同拷貝。具體的說,提供了技術方法,用于協(xié)調在這種數(shù)據(jù)項上執(zhí)行的磁盤寫入操作,由此確保數(shù)據(jù)項的舊版本不會改寫新版本,并且減少故障之后進行恢復所需要的處理量。并且提供了各種方法,其中使用了一個主管(master)來與多個緩存區(qū)器進行協(xié)調,以便將數(shù)據(jù)項寫入永久性存儲器。這種方法包括但不局限于直接寫入方法、間接寫入方法、基于擁有者的方法以及基于角色的方法。此外還提供了技術方法來管理那些與緩存區(qū)相關聯(lián)的檢查點,其中使用檢查點來確定發(fā)生故障時開始處理恢復日志的位置。
本發(fā)明是借助實例來描述的,但這并不作為限制,在附圖的圖形中,相同的參考數(shù)字代表相同的部件,其中圖1是描述如何根據(jù)本發(fā)明一個實施例而在直接寫入方法中協(xié)調磁盤寫入操作的框圖;圖2是描述如何根據(jù)本發(fā)明一個實施例而在間接寫入方法中協(xié)調磁盤寫入操作的框圖;圖3a是描述根據(jù)本發(fā)明的一個實施例,當全局變臟標記為假時,如何在基于擁有者的寫入方法中協(xié)調磁盤寫入操作的框圖;圖3b是描述根據(jù)本發(fā)明的一個實施例,當全局變臟標記為真時,如何在基于擁有者的寫入方法中協(xié)調磁盤寫入操作的框圖;圖3c是描述根據(jù)本發(fā)明的一個實施例,當寫入請求并非來自擁有者時,如何在基于擁有者的寫入方法中協(xié)調磁盤寫入操作的框圖;圖4a是描述根據(jù)本發(fā)明一個實施例,當模式為本地的時候,如何在基于角色的寫入方法中協(xié)調磁盤寫入操作的框圖;圖4b是描述根據(jù)本發(fā)明的一個實施例,當模式為全局的時候,如何在基于角色的寫入方法中協(xié)調磁盤寫入操作的框圖;圖4c是描述根據(jù)本發(fā)明的一個實施例,當請求并非來自排他鎖持有者的時候,如何在基于角色的寫入方法中協(xié)調磁盤寫入操作的框圖;
圖4d是描述根據(jù)本發(fā)明一個實施例,當轉移是在寫入操作過程中執(zhí)行的時候,如何在基于角色的寫入方法中協(xié)調磁盤寫入操作的框圖;圖5是一個描述檢查點隊列的框圖;圖6是一個描述檢查點隊列的框圖;圖7是一個對具有合并條目的檢查點隊列進行描述的框圖;圖8是一個描述檢查點隊列的框圖,其中條目分批處理到二進制文件中;以及圖9是一個描述可以實施本發(fā)明實施例的計算機系統(tǒng)的框圖;具體實施方式
以下描述一種用于協(xié)調數(shù)據(jù)項寫入的方法和設備。在以下描述中,基于說明的目的而對許多細節(jié)進行了闡述,以便提供關于本發(fā)明的全面理解。然而很明顯,本發(fā)明可以在不具備這些特定細節(jié)的情況下實施。在其他情況下,為了避免不必要地造成本發(fā)明不清楚,眾所周知的結構和設備將以框圖形式顯示。
對使用一個永久性存儲器作為介質用于轉移的系統(tǒng)進行優(yōu)化在使用永久性存儲器作為介質而在兩個節(jié)點之間轉移數(shù)據(jù)的系統(tǒng)中,可以修改數(shù)據(jù)庫緩存區(qū)的寫入子系統(tǒng)而將更高優(yōu)先級提供給其他節(jié)點正在等待讀寫的寫入數(shù)據(jù)項,由此減少數(shù)據(jù)項從一個節(jié)點轉移到另一個節(jié)點所需要的等待時間。這個操作可以通過為那些需要寫入的臟數(shù)據(jù)項提供一個單獨隊列(一個“偵測(ping)隊列”)而得以實現(xiàn),因為其他節(jié)點正在等待讀取或修改這些臟數(shù)據(jù)項。當鎖管理器(這個鎖管理器可以是分布式鎖管理器DLM或是全局鎖管理器GLM)向保持節(jié)點發(fā)送一個消息來請求保持節(jié)點釋放它對數(shù)據(jù)項的封鎖時,臟數(shù)據(jù)項可以根據(jù)要求而被移動到偵測隊列。
根據(jù)另一種方法,可以在每個數(shù)據(jù)項頭部或是數(shù)據(jù)項控制塊中保持一個“強制寫入”計數(shù),由此減少數(shù)據(jù)項從一個節(jié)點轉移到另一個節(jié)點所需要的等待時間。只要執(zhí)行寫入而把數(shù)據(jù)項轉移到另一個節(jié)點,強制寫入計數(shù)就會遞增。永久性存儲器的寫入子系統(tǒng)保持了臟數(shù)據(jù)項的一個高優(yōu)先級隊列,其中這些臟數(shù)據(jù)項的強制寫入計數(shù)要高于某個閾值。這個隊列則用于使那些數(shù)據(jù)項的寫入比節(jié)點間未曾經(jīng)常共享的其他臟數(shù)據(jù)項更為頻繁。此外,在預期到這些數(shù)據(jù)項上的封鎖需要釋放的情況下,由于數(shù)據(jù)庫緩存區(qū)的寫入子系統(tǒng)急切寫出了臟數(shù)據(jù)項,因此這將會改善節(jié)點之間轉移封鎖的等待時間。
然而,即使在以這種方式進行優(yōu)化時,那些使用共享的永久性存儲器作為介質而在節(jié)點之間轉移數(shù)據(jù)項的系統(tǒng)也要遭受到與把數(shù)據(jù)項寫入永久性存儲器相關聯(lián)的開銷。以下描述的技術涉及這種系統(tǒng),其中包括臟數(shù)據(jù)項在內的數(shù)據(jù)項可以在節(jié)點之間轉移,而不需要首先寫入永久性存儲器。
正確性和可擴縮性在那些允許在緩存區(qū)之間轉移臟數(shù)據(jù)項,而不需要首先將其存入永久性存儲器的系統(tǒng)中,出于正確性和可擴縮性的考慮,需要對各個不同節(jié)點的緩存區(qū)中的臟數(shù)據(jù)項寫入進行協(xié)調。正確性需要在節(jié)點完成一個檢查點(也就是記錄一個起始點,從這個起始點開始,在出現(xiàn)故障之后,有可能應用那些來自其重做日志的變化)的時候,包含那些在檢查點之前提交的改變的每個數(shù)據(jù)項的一個版本都已寫入了非易失永久性存儲器。此外,兩個節(jié)點不能同時將一個數(shù)據(jù)項寫入永久性存儲器(因為它們可能會攻擊相互的變化),并且節(jié)點不準使用數(shù)據(jù)項的一個較舊版本來改寫一個較新版本。
可擴縮性需要將數(shù)據(jù)項寫入永久性存儲器的操作覆蓋盡可能多的改變,即使這些改變是由不同節(jié)點造成的?;谟行栽颍瑪?shù)據(jù)庫系統(tǒng)有可能希望限制那些需要掃描并有可能在節(jié)點故障之后重新使用的重做日志數(shù)量。因此數(shù)據(jù)庫寫入數(shù)量可以與對數(shù)據(jù)項做出的改變數(shù)量成正比,但是不和做出這些改變的節(jié)點的數(shù)目成正比。
功能概述由此提供了不同的技術方法來協(xié)調臟數(shù)據(jù)項相對于系統(tǒng)永久性存儲器的寫入,其中這些系統(tǒng)允許同一數(shù)據(jù)項的臟數(shù)據(jù)版本保留在多個緩存區(qū)中。根據(jù)一種技術,這種協(xié)調是使用一個指派給該數(shù)據(jù)項的主管來完成的。根據(jù)一個實施例,用于協(xié)調數(shù)據(jù)項臟數(shù)據(jù)版本寫入的主管與指派為管理封鎖的實體是相同實體,其中所述封鎖是對數(shù)據(jù)項訪問加以控制。在這個實施例中,主管通常是鎖管理系統(tǒng)的一個組件,例如歸屬于分布式鎖管理系統(tǒng)或全局鎖管理系統(tǒng)的一個鎖管理器。
在一個實施例中,一個想要把臟數(shù)據(jù)項寫入永久性存儲器的節(jié)點會將一個寫入永久性存儲器的請求發(fā)送到分配給該數(shù)據(jù)項的主管。主管可以(1)授予請求節(jié)點執(zhí)行寫入的權限,或者(2)向請求節(jié)點告知另一個節(jié)點已經(jīng)向永久性存儲器中寫入了一個至少與請求節(jié)點所保存臟數(shù)據(jù)版本一樣新的版本。
在另一個實施例中,作為響應,主管也可以發(fā)送一個“執(zhí)行寫入”的消息,以便要求請求節(jié)點之外的一個節(jié)點將至少與請求節(jié)點中保存的臟數(shù)據(jù)版本一樣新的數(shù)據(jù)項版本寫入永久性存儲器。當另一個節(jié)點向主管發(fā)送了一個“確認寫入”的消息來指示已經(jīng)執(zhí)行了寫入之后,主管會發(fā)送一個“寫入通知”消息,以便向請求節(jié)點告知另一個節(jié)點已經(jīng)把至少與請求節(jié)點所保存臟數(shù)據(jù)版本一樣新的一個數(shù)據(jù)項版本寫入了永久性存儲器。
一旦將數(shù)據(jù)項的某個特定版本寫入了永久性存儲器,那么與這個特定版本相同或是比它舊的數(shù)據(jù)項的臟數(shù)據(jù)版本將會因為寫入了這個特定版本而遭到覆蓋。所覆蓋的數(shù)據(jù)項版本不再需要(并且不應該)寫入永久性存儲器。在這里提到的包含所覆蓋版本的節(jié)點稱為“感興趣的”節(jié)點。
除了向請求節(jié)點告知已經(jīng)把數(shù)據(jù)項寫入永久性存儲器之外,主管還可以發(fā)送寫入通知消息來向所有的感興趣的節(jié)點告知已經(jīng)將數(shù)據(jù)項寫入了永久性存儲器。在接收到已經(jīng)將數(shù)據(jù)項寫入永久性存儲器的確認時,其他感興趣的節(jié)點的寫入通知消息可以立即發(fā)送,也可以延遲到某些其他事件之前再進行發(fā)送。
在另一個實施例中,每當各個節(jié)點想要把臟數(shù)據(jù)項寫入永久性存儲器的時候,這些節(jié)點都需要對主管進行詢問,為了避免這種情況,主管可以向一個節(jié)點授權數(shù)據(jù)項的“所有權權限”。當一個節(jié)點擁有數(shù)據(jù)項所有權權限的時候,該節(jié)點可以隨意將數(shù)據(jù)項寫入永久性存儲器,而不需要向數(shù)據(jù)項主管發(fā)送寫入請求消息。所有權權限可以隱含地與排他鎖的所有權一起授予,也可以從排他鎖的授予中分離并且獨立于排他鎖的授予。
根據(jù)一個實施例,為數(shù)據(jù)項保持了一個“全局變臟”的標志。如果一個節(jié)點將數(shù)據(jù)項的臟數(shù)據(jù)版本轉移到另一個節(jié)點,則將會把全局變臟的標志設定為“真”。當擁有者將一個數(shù)據(jù)項寫入永久性存儲器時,如果全局變臟的標志設定為“真”,則擁有者會向主管發(fā)送一個寫入確認消息。然后,主管可以向感興趣的節(jié)點發(fā)送寫入通知消息。另一方面,如果將全局變臟的標志設定為“假”,則當擁有者寫入數(shù)據(jù)項時,該擁有者無需向主管發(fā)送一個寫入確認消息。
直接寫入方法根據(jù)直接寫入的方法,把臟數(shù)據(jù)項寫入永久性存儲器的操作是使用一個指派給該數(shù)據(jù)項的主管來協(xié)調的。特別地,一個想要把臟數(shù)據(jù)項寫入永久性存儲器的節(jié)點會向指派給該數(shù)據(jù)項的主管發(fā)送一個寫入請求消息。而這個主管可以(1)授予請求節(jié)點執(zhí)行寫入的權限,或者(2)向請求節(jié)點告知另一個節(jié)點已將一個至少與請求節(jié)點保存的臟數(shù)據(jù)版本一樣新的數(shù)據(jù)版本寫入了永久性存儲器。
更具體地說,當從一個節(jié)點緩存區(qū)中偵測出一個臟數(shù)據(jù)項時,也就是說,當另一個節(jié)點需要相同數(shù)據(jù)項的一個當前版本,以便進行讀取(S鎖)或寫入(X鎖)時,發(fā)送節(jié)點緩存區(qū)中的數(shù)據(jù)項狀態(tài)將會改變?yōu)镻I。而數(shù)據(jù)項仍舊保留在臟數(shù)據(jù)隊列或檢查點隊列中。在偵測出一個干凈的數(shù)據(jù)項時,該數(shù)據(jù)項既可標記為自由,也可以保留在緩存區(qū)中,從而滿足一致性快照的讀取。
在偵測出數(shù)據(jù)項時,數(shù)據(jù)項主管記錄了數(shù)據(jù)項版本號。通常,這個版本號是一個日志序列號(LSN),一個系統(tǒng)提交號(SCN)或一個全局性唯一時戳,該時戳可用于與重做日志中發(fā)生了變化的數(shù)據(jù)項的版本相關聯(lián)。由于數(shù)據(jù)項仍處于臟數(shù)據(jù)隊列或檢查點隊列之中,因此檢查點或緩存區(qū)的寫入子系統(tǒng)最終需要寫出PI(或是它的某些后繼者)。
根據(jù)直接寫入方法,一個消息發(fā)送到主管,該主管返回數(shù)據(jù)項較新版本的一個狀態(tài)已經(jīng)寫入或者向請求節(jié)點授予寫入權限。來自其它節(jié)點的同一數(shù)據(jù)項的其他寫入請求將會排隊,直到寫入節(jié)點用一個寫入完成狀態(tài)來響應鎖管理器。在將一個PI寫入永久性存儲器之后,數(shù)據(jù)項主管會把PI版本號記錄為當前在永久性存儲器上的版本。
參考圖1,該圖是描述一個使用了直接寫入方法的系統(tǒng)的框圖。節(jié)點1、2和3在其緩存區(qū)中分別保存了某個特定數(shù)據(jù)項的版本V1、V2及V3。假設V3>V2>V1,其中A>B意味著A是一個比B新的數(shù)據(jù)項版本。
主管100即為指派給數(shù)據(jù)項的主管。在圖1描述的方案中,節(jié)點1和3向主管100發(fā)送寫入請求。為了防止多個節(jié)點同時寫入相同數(shù)據(jù)項,舉例來說,主管100可以為每個數(shù)據(jù)項包含一個寫入請求隊列。為數(shù)據(jù)項接收的寫入請求保存在寫入請求隊列中,并且這些寫入請求依次由主管進行處理。在所述實例中,主管100首先對來自節(jié)點3的寫入請求進行處理,而來自節(jié)點1的寫入請求則保持在寫入請求隊列中。主管100向節(jié)點3發(fā)送一個準許節(jié)點3把V3寫入永久性存儲器的寫入執(zhí)行消息,由此對節(jié)點3的寫入請求做出響應。
在同意節(jié)點3的寫入請求的同時,主管100不會向任何其他節(jié)點授予寫入永久性存儲器的權限。因此,來自節(jié)點1的寫入請求會在寫入請求隊列中保持掛起。
在節(jié)點3已將V3寫入永久性存儲器之后,節(jié)點3會向主管100發(fā)送一個寫入確認消息,該消息指示寫入永久性存儲器的操作已經(jīng)完成,并且節(jié)點3已經(jīng)釋放了寫入永久性存儲器的權限。由于V3比V1和V2更新,因此V1和V2將會因為V3的寫入而被覆蓋。
然后,主管100繼續(xù)處理隊列中的下一個寫入請求。在本實例中,主管100對來自節(jié)點1的寫入請求進行處理。節(jié)點1的寫入請求是一個要求寫入V1的請求。由于V1已經(jīng)由V3的寫入所覆蓋,因此,主管100向節(jié)點1發(fā)送一個指示V1已被覆蓋的寫入通知消息。響應于這個寫入通知消息,節(jié)點1從它的檢查點隊列中刪除關于V1的條目,而不會將V1寫入永久性存儲器。由于節(jié)點1現(xiàn)在知道V1已被覆蓋,因此節(jié)點1不需要在存儲器中保持V1的一個拷貝。
根據(jù)一個實施例,節(jié)點2包含了由于寫入V3而被覆蓋的V2,在節(jié)點2向主管100發(fā)送一個關于V2的寫入請求之前,不會向該節(jié)點發(fā)送一個寫入通知消息。
間接寫入方法在使用直接寫入方法的情況下,每個節(jié)點為節(jié)點檢查點隊列中的每個條目發(fā)送一個寫入請求消息。在某些情況下,節(jié)點會接收一個響應于這個寫入請求的寫入執(zhí)行消息。當接收到一個寫入執(zhí)行消息時,請求節(jié)點必須執(zhí)行一個寫入操作。在其他情況下,請求節(jié)點會接收一個響應于寫入請求的寫入通知。當接收到一個寫入通知消息時,請求節(jié)點不需要執(zhí)行寫入操作。
間接寫入方法嘗試提高與寫入通知消息一起應答的寫入請求所占有的百分比。為此目的,相對于要求執(zhí)行寫入操作的節(jié)點而言,主管100是有選擇的。特別地,主管100可以通過向一個節(jié)點發(fā)送一個寫入執(zhí)行消息而對來自另一個節(jié)點的寫入請求消息做出響應。可以基于多種因素來選擇寫入執(zhí)行消息所發(fā)至的節(jié)點,其中包括緩存區(qū)中保存的數(shù)據(jù)項版本的新近狀態(tài)。根據(jù)一個實施例,主管100總是將寫入執(zhí)行消息發(fā)送到包含數(shù)據(jù)項當前版本的節(jié)點,而不會考慮發(fā)送寫入請求的節(jié)點。
更具體的說,根據(jù)一個實施例,主管將寫入請求轉發(fā)到具有過去鏡像中的最高版本的節(jié)點,或者優(yōu)選將其轉發(fā)到排他鎖(X)的持有者(該持有者具有數(shù)據(jù)項的當前版本)。將寫入請求轉發(fā)到最高PI,而不是排他鎖持有者,這就允許對當前數(shù)據(jù)項不斷進行修改。
在將一個數(shù)據(jù)項寫入永久性存儲器的時候,該數(shù)據(jù)項是不能修改的;因此,為了寫入一個有可能會受到進一步修改的當前數(shù)據(jù)項,有必要將其封鎖來防止修改,或者對其進行“克隆”,從而對一個不同的拷貝進行修改。封鎖通常不合乎需要;如果克隆是可行的,則較為優(yōu)選的是把寫入請求指引到具有當前數(shù)據(jù)項(也就是X鎖或S鎖)的節(jié)點。
通過將數(shù)據(jù)的當前版本寫入永久性存儲器,這使得永久性存儲器能夠進行寫入,以便覆蓋盡可能多的變化。在完成了永久性存儲器寫入的時候,具有寫入完成狀態(tài)以及所寫入數(shù)據(jù)項版本號的一個消息將會發(fā)送到主管。主管記錄永久性存儲器上的版本號,并將寫入通知消息發(fā)送到具有數(shù)據(jù)項PI版本的所有節(jié)點,其中該數(shù)據(jù)項現(xiàn)在將因為永久性存儲器的寫入而受到覆蓋。當一個節(jié)點接收到一個寫入通知時,如果其臟數(shù)據(jù)隊列或檢查點隊列上的所有數(shù)據(jù)項在檢驗點記錄之前已經(jīng)寫入了永久性存儲器,或是由于寫入了其他節(jié)點中的相同數(shù)據(jù)項而從主管那里接收到寫入通知,則該節(jié)點可以使其檢驗點記錄恰當提前并且釋放PI數(shù)據(jù)項。在寫入一個數(shù)據(jù)項的時候,主管在邏輯上保持一個寫入請求隊列,但是只需要記錄所接收的最高寫入請求的版本號。
例如,在圖2描述的方案中,節(jié)點3并未將一個關于V3的寫入請求消息發(fā)送到主管100。然而,響應于來自節(jié)點1并要求寫入數(shù)據(jù)項版本V1的寫入請求消息,主管100選擇節(jié)點3作為寫入數(shù)據(jù)項的節(jié)點。節(jié)點3通過寫入數(shù)據(jù)項版本V3并將一個寫入確認消息發(fā)送到主管100來做出響應。然后,主管100把一個寫入通知消息發(fā)送到節(jié)點1。
由于選擇節(jié)點3來將V3寫入永久性存儲器,因此V1和V2都會被覆蓋。與之相反,如果(根據(jù)直接寫入方法)主管100已經(jīng)授權節(jié)點1寫入V1,則V2和V3不會受到覆蓋。在將V2、V3寫入永久性存儲器的時候,必須執(zhí)行分離的寫入操作。
間接寫入方法還向那些未曾發(fā)送寫入請求消息的節(jié)點以及發(fā)送了寫入請求消息的節(jié)點優(yōu)先發(fā)送寫入通知消息,由此嘗試減少必需發(fā)送到主管100的寫入請求消息的數(shù)目。舉例來說,在圖2描述的方案中,在使用間接寫入方法的情況下,即使節(jié)點2并未發(fā)送一個關于V2的寫入請求,主管100還是會將一個寫入通知消息發(fā)送到節(jié)點2。根據(jù)一個實施例,主管100會把寫入通知消息發(fā)送到所有的感興趣的節(jié)點。
當一個感興趣的節(jié)點收到一個寫入通知時,該節(jié)點從它的檢查點隊列中刪除關于該數(shù)據(jù)項相應版本的條目。在使用間接寫入方法的情況下,在為檢查點隊列中的很多條目發(fā)送寫入請求之前,很多條目都可以借助這種方式而被刪除。因此,節(jié)點發(fā)送的寫入請求消息數(shù)量明顯少于其位于檢查點隊列中的條目數(shù)量。
基于擁有者的寫入在間接寫入方法和直接寫入方法中,即使數(shù)據(jù)項僅僅在一個節(jié)點緩存區(qū)中變臟,寫入請求消息也會發(fā)送到數(shù)據(jù)項主管。在許多數(shù)據(jù)庫系統(tǒng)中,可以通過在節(jié)點之間對內部永久性存儲器進行分區(qū)(例如為每個節(jié)點分離數(shù)據(jù)項的自由列表)或者借助于把事務路由到節(jié)點的應用等級而在節(jié)點之間劃分數(shù)據(jù)庫工作集的一個顯著部分。在這種系統(tǒng)中,數(shù)據(jù)項只在一個節(jié)點緩存區(qū)中頻繁變臟?;趽碛姓叩膶懭敕椒獬嗽谶@些情況下發(fā)送寫入請求的需要。
基于擁有者的寫入方法導致了由當前指定為數(shù)據(jù)項“擁有者”的節(jié)點所進行的數(shù)據(jù)項的所有寫入。與直接寫入或間接寫入的方法相反,當數(shù)據(jù)項擁有者希望得到將要寫入的數(shù)據(jù)項的一個版本時,該擁有者允許將這個數(shù)據(jù)項寫入永久性存儲器,而不會將寫入請求消息發(fā)送到數(shù)據(jù)項主管。此外還可以使用不同因素來選擇充當數(shù)據(jù)項擁有者的節(jié)點。根據(jù)一個實施例,數(shù)據(jù)項擁有者是基于以下規(guī)則來選擇的(1)如果向節(jié)點授予了關于數(shù)據(jù)項的排他鎖,則認為該節(jié)點即為數(shù)據(jù)項持有者;(2)如果不存在排他鎖擁有者,也就是說,存在多個共享鎖(S)的持有者,則具有數(shù)據(jù)項的最近排他鎖的節(jié)點將會選為數(shù)據(jù)項擁有者;以及(3)如果數(shù)據(jù)項未曾由任何節(jié)點變臟,則該數(shù)據(jù)項的擁有者是不存在的。
在一個作為數(shù)據(jù)項擁有者的節(jié)點中,即使數(shù)據(jù)項不會在該節(jié)點變臟,該數(shù)據(jù)項也會鏈接到節(jié)點的臟數(shù)據(jù)隊列或是檢查點隊列。
在數(shù)據(jù)項擁有者把數(shù)據(jù)項寫入永久性存儲器之后,該擁有者確定數(shù)據(jù)項是否“全局變臟”。如果由擁有者之外的任何節(jié)點所進行的任何修改都沒有被該節(jié)點存入永久性存儲器,則這個數(shù)據(jù)項是全局變臟的。如果數(shù)據(jù)項是全局變臟的,則擁有者會把一個寫入確認消息發(fā)送到主管。然后主管可以向感興趣的節(jié)點發(fā)送寫入通知。如果數(shù)據(jù)項不是全局變臟的,則擁有者不需要向主管發(fā)送一個寫入確認消息。
可以使用不同的技術方法來使數(shù)據(jù)項擁有者能夠確定是否數(shù)據(jù)項是全局變臟的。根據(jù)一個實施例,一個全局變臟的標志與數(shù)據(jù)項相關聯(lián)。當節(jié)點把數(shù)據(jù)項的一個臟數(shù)據(jù)版本發(fā)送到永久性存儲器而不是寫入永久性存儲器的時候,發(fā)送節(jié)點會把這個數(shù)據(jù)項的全局變臟標志設定為“真”。為了確定數(shù)據(jù)項是否是全局變臟的,所述擁有者只需要調查那些與這個數(shù)據(jù)項相關聯(lián)的全局變臟標志。如果寫入永久性存儲器的數(shù)據(jù)項的版本是(1)數(shù)據(jù)項的當前版本或者(2)最新的PI版本,則在將數(shù)據(jù)項寫入永久性存儲器之后,擁有者會把全局變臟標志設定為“假”。
可以使用多種方式來保存一個數(shù)據(jù)項的全局變臟標志。例如,當數(shù)據(jù)項是數(shù)據(jù)庫系統(tǒng)中的一個數(shù)據(jù)項時,全局變臟標志可以存入(1)保存數(shù)據(jù)項的數(shù)據(jù)塊的數(shù)據(jù)塊頭部,(2)數(shù)據(jù)項的數(shù)據(jù)項控制塊,(3)當授予數(shù)據(jù)項的新?lián)碛姓叩鹊冗M行封鎖時,在一個本地鎖管理器中的鎖結構。
參考圖3a,該圖描述了一種方案,在這個方案中,數(shù)據(jù)項擁有者(節(jié)點3)希望將一個數(shù)據(jù)項寫入永久性存儲器,其中全局變臟標志設定為“假”。在圖3a中可以看出,在這些情況下,節(jié)點3不需要從主管100那里索要權限。另外,節(jié)點3無需向主管100告知已經(jīng)執(zhí)行了寫入永久性存儲器的操作。
參考圖3b,該圖描述了一種方案,在這個方案中,數(shù)據(jù)項擁有者(節(jié)點3)想要把一個數(shù)據(jù)項寫入永久性存儲器,其中全局變臟標志設定為“真”。在所述方案中,節(jié)點1和2具有數(shù)據(jù)項的臟數(shù)據(jù)版本V1和V2,這兩個版本比節(jié)點3中保存的版本V3舊。與圖3a所示方案相似,在這種方案中,節(jié)點3無需請求權限以便將V3寫入永久性存儲器。然而,由于全局變臟標志是“真”,因此在將V3寫入永久性存儲器之后,節(jié)點3會把一個寫入確認消息發(fā)送到主管100。然后,主管100把寫入通知消息發(fā)送到節(jié)點1和2。在將V3寫入永久性存儲器之后,節(jié)點3把全局變臟標志設定為“假”。
參考圖3c,該圖描述了一種方案,其中一個并非數(shù)據(jù)項擁有者的實體(節(jié)點1)想要將數(shù)據(jù)項寫入永久性存儲器。在這個方案中,節(jié)點1把一個寫入請求消息發(fā)送到主管100。然后,主管100把一個寫入執(zhí)行消息發(fā)送到數(shù)據(jù)項擁有者(節(jié)點3)。節(jié)點3把V3寫入永久性存儲器,并將全局變臟標志設置為“假”,此外該節(jié)點還向主管100發(fā)送一個寫入確認消息。然后,主管100向感興趣的節(jié)點(節(jié)點1和2)發(fā)送寫入通知消息。
基于角色的方法基于擁有者的方法免除了在將數(shù)據(jù)項寫入永久性存儲器之前由數(shù)據(jù)項擁有者從數(shù)據(jù)項主管那里獲取權限的需要。然而,為了消除兩個節(jié)點同時嘗試將數(shù)據(jù)項寫入永久性存儲器的可能性,在數(shù)據(jù)項當前擁有者將數(shù)據(jù)項寫入永久性存儲器的時候,數(shù)據(jù)項所有權是不準改變的。因此,在那些把排他鎖持有者當作擁有者的系統(tǒng)中,在數(shù)據(jù)項的當前擁有者將數(shù)據(jù)項寫入永久性存儲器的時候,排他鎖是不能傳遞到另一個節(jié)點的。結果,在將數(shù)據(jù)項寫入永久性存儲器之前,為將權限修改到一個希望修改數(shù)據(jù)項的并發(fā)節(jié)點而進行的轉移將會延遲。這種延遲降低了系統(tǒng)的整體性能。另外,對于數(shù)據(jù)項擁有者而言,即使擁有者沒有弄臟數(shù)據(jù)項,但是擁有者仍需在其臟隊列中鏈接該數(shù)據(jù)項,這也是不合乎需要的。
基于角色的方法從(2)將數(shù)據(jù)項寫入永久性存儲器而不發(fā)送寫入請求的權限中分離了(1)數(shù)據(jù)項中的排他鎖的所有權。由于一個數(shù)據(jù)項中的排他鎖的所有權與把數(shù)據(jù)寫入永久性存儲器而不發(fā)送寫入請求的權限相分離,因此,即使在進行寫入永久性存儲器操作的時候,數(shù)據(jù)項排他鎖的所有權也可以在節(jié)點之間轉移。
根據(jù)基于角色的方法,為每個鎖都指派了一個鎖角色。如果數(shù)據(jù)項僅僅有可能會在一個節(jié)點緩存區(qū)中變臟,則這個鎖角色是“本地的”。因此在整個系統(tǒng)中,當首次將數(shù)據(jù)項的一個封鎖授予一個節(jié)點時,這個封鎖是與本地角色一起授予的。由具有本地角色的一個鎖進行封鎖的數(shù)據(jù)項既可以由保持封鎖不受主管干涉的節(jié)點寫入永久性存儲器,也可以由該節(jié)點從永久性存儲器中讀取。
當一個數(shù)據(jù)項因為一個來自不同節(jié)點的封鎖請求而被從節(jié)點緩存區(qū)中偵測出時,如果數(shù)據(jù)項在保持節(jié)點緩存區(qū)中是臟的,則關于該封鎖的角色將會轉換成“全局”。否則,與數(shù)據(jù)項一起轉移的鎖將會仍由本地角色封鎖。因此,只有在多節(jié)點系統(tǒng)中存在至少一個關于數(shù)據(jù)項的PI時,一個數(shù)據(jù)項才需要受到全局角色封鎖。
當一個PI數(shù)據(jù)項或全局角色中的一個當前數(shù)據(jù)項需要寫入永久性存儲器時,其保持節(jié)點會把一個具有所要寫入數(shù)據(jù)項的版本號的寫入請求消息發(fā)送到主管。主管可以將寫入請求轉發(fā)到具有當前數(shù)據(jù)項的節(jié)點(X鎖的持有者)或是版本號大于或等于所要寫入PI的版本號的任何PI。在完成寫入的時候,主管會把寫入通知發(fā)送到所有節(jié)點,其中所述節(jié)點具有由寫入永久性存儲器的數(shù)據(jù)項版本所覆蓋的PI。
由于在全局角色中具有排他鎖的節(jié)點還需要將它的寫入永久性存儲器操作與主管進行協(xié)調,因此,即使由排他鎖封鎖的數(shù)據(jù)項正被寫入,也可以將所述排他鎖轉移到另一個節(jié)點。出于同樣理由,除非節(jié)點上的數(shù)據(jù)項變臟,否則節(jié)點不會把數(shù)據(jù)項鏈接到它的檢查點隊列或是臟隊列。在臟數(shù)據(jù)項受到本地角色封鎖而被寫入的同時,在偵測出一個臟數(shù)據(jù)項時,鎖角色將會切換成全局,正在進行的寫入也會傳遞到主管。
參考圖4a,該圖描述了一種方案,其中本地模式鎖的持有者(節(jié)點3)希望將數(shù)據(jù)項的一個版本寫入永久性存儲器。由于節(jié)點3擁有的鎖處于本地模式,因此節(jié)點3會把數(shù)據(jù)項寫入永久性存儲器,而不會從主管100那里索取許可。并且節(jié)點3還不需要向主管100告知已經(jīng)將該數(shù)據(jù)項寫入了永久性存儲器。
參考圖4b,該圖描述了一種方案,其中全局模式鎖的持有者(節(jié)點3)希望將數(shù)據(jù)項的一個版本V3寫入永久性存儲器。由于封鎖模式是全局性的,因此另一個節(jié)點有可能正在寫入數(shù)據(jù)項。
因此,節(jié)點3將一個寫入請求消息發(fā)送到主管100。響應于這個寫入請求消息,主管100選擇一個節(jié)點來寫出數(shù)據(jù)項。優(yōu)選地,主管100選擇具有至少與版本V3一樣新的數(shù)據(jù)項版本的一個節(jié)點。在當前實例中,V3即為數(shù)據(jù)項的當前版本。因此,主管100向節(jié)點3回送一個寫入執(zhí)行消息。
響應于寫入執(zhí)行消息,節(jié)點3將V3寫入永久性存儲器,并且將一個寫入確認信息回送到主管100。然后,主管100將一個寫入通知消息發(fā)送到感興趣的節(jié)點(節(jié)點1和2)。
如果寫入永久性存儲器的數(shù)據(jù)項版本即為當前版本,則將數(shù)據(jù)項寫入永久性存儲器的節(jié)點還把封鎖從全局模式轉換成本地模式。這個轉換可以在將當前版本寫入永久性存儲器的時候執(zhí)行。根據(jù)節(jié)點在數(shù)據(jù)項上保持一個排他鎖這一事實,將當前版本寫入永久性存儲器的節(jié)點能夠確定節(jié)點正在寫入當前版本。在當前實例中,V3即為當前版本,因此,在將V3寫入永久性存儲器之后,節(jié)點3會把模式從全局轉換成本地。
參考圖4c,該圖描述了一種方案,其中,未曾保持數(shù)據(jù)項當前版本的節(jié)點(節(jié)點1)請求將數(shù)據(jù)項寫入永久性存儲器。圖4c顯示的事件順序與圖4b的那些相同,只不過寫入請求消息來源于節(jié)點1而不是節(jié)點3。
如圖4b所示,與基于擁有者的方法相比,在基于角色的方法中,數(shù)據(jù)項排他鎖的擁有者仍須尋求授權而在封鎖處于全局模式時寫入來源于主管100的數(shù)據(jù)項。然而,與基于擁有者的方法不同,一個數(shù)據(jù)項(及其排他鎖)可以從一個節(jié)點轉移到另一個節(jié)點,而不需要等待寫入永久性存儲器的操作結束。
舉例來說,圖4d描述了與圖4c相同的方案,只不過一個節(jié)點(節(jié)點4)已經(jīng)請求了該數(shù)據(jù)項的排他所有權。即使節(jié)點3響應于寫入執(zhí)行消息而正將V3寫入永久性存儲器,節(jié)點3也能將數(shù)據(jù)項轉移到節(jié)點4。在具有排他性寫入封鎖的情況下,節(jié)點4可以繼續(xù)修改數(shù)據(jù)項來創(chuàng)建版本V4。然而,由于模式是全局的,因此節(jié)點4無法將V4寫入永久性存儲器。
在圖4c中,一旦從節(jié)點3接收到寫入確認信息,那么主管100會向節(jié)點4發(fā)送一個轉換到本地的消息。響應于轉換到本地的消息的接收,節(jié)點4將模式從全局轉換成本地。當把模式轉回本地之后,在沒有主管100的任何許可的情況下,節(jié)點4可以將數(shù)據(jù)項寫入永久性存儲器并從永久性存儲器中讀取數(shù)據(jù)項。
在一個替換實施例中,響應于寫入確認消息,主管100并不發(fā)送一個轉換到本地的消息。在沒有轉換到本地的消息的情況下,在節(jié)點4,排他鎖模式保持為全局。由于模式是全局,因此,如果節(jié)點4希望將V4寫入永久性存儲器,則節(jié)點4會將一個寫入請求發(fā)送到主管100。響應于寫入請求消息,主管100可以將一個轉換到本地的消息發(fā)送到節(jié)點4。在將模式轉換成本地之后,節(jié)點4在沒有得到進一步許可的情況下寫入V4。
延遲的寫入通知在以上給出的情況中已經(jīng)提及將寫入通知消息發(fā)送到感興趣的節(jié)點是可以立即執(zhí)行的,該發(fā)送也可服從于某些或全部感興趣的節(jié)點。根據(jù)一個實施例,在執(zhí)行寫入永久性存儲器操作的時候,一個寫入通知消息僅僅立即發(fā)送到那些已經(jīng)請求寫入一個PI的節(jié)點,其中所述PI由已執(zhí)行的寫入所覆蓋。舉例來說,在圖1中,主管100立即將一個寫入通知消息發(fā)送到節(jié)點1,而不是節(jié)點2。
永久性存儲器上的數(shù)據(jù)項版本號稍后可以使用各種技術中的任何一種而從主管那里發(fā)送到其他感興趣的節(jié)點。舉例來說,位于永久性存儲器的數(shù)據(jù)項的版本號可以作為(1)新的封鎖請求的封鎖許可消息,或者(2)當數(shù)據(jù)項當前版本需要發(fā)送到另一個節(jié)點時的偵測(ping)消息的一部分而被傳達。因此,當另一個感興趣的節(jié)點需要寫入或替換其PI時,它們只與本地鎖管理器進行通信即可丟棄它們的PI。
分批處理的消息用于減少主管與所關注節(jié)點之間所傳遞消息數(shù)目的另一種技術包括將往返于主管的寫入請求消息以及寫入通知消息分批處理成較少的更大消息,從而減少消息數(shù)量。舉例來說,如果節(jié)點1希望將其檢查點隊列提前三個條目,則節(jié)點1可以將一個單獨的寫入請求消息發(fā)送到主管100,該消息標識的是必須寫入永久性存儲器的所有三個數(shù)據(jù)(及其相應的版本)。同樣,如果節(jié)點1關注到已經(jīng)完成的三個寫入永久性存儲器的操作,則主管100可以將一個單獨的寫入確認消息發(fā)送到節(jié)點1,該消息識別的是已經(jīng)寫入永久性存儲器的三個數(shù)據(jù)項(及其相應的版本)。
檢查點隊列管理相同數(shù)據(jù)項的多個過去鏡像在以上給出的方案中,假設每個節(jié)點的緩存區(qū)都具有每個數(shù)據(jù)項的最多一個PI。實際上,在將數(shù)據(jù)項某個版本寫入永久性存儲器之前,數(shù)據(jù)項可以經(jīng)由多個節(jié)點而循環(huán)若干次。較為正確的是在每次把臟數(shù)據(jù)項用偵測隊列發(fā)送到另一個節(jié)點的時候都創(chuàng)建一個PI,并且在節(jié)點緩存區(qū)的臟數(shù)據(jù)隊列或檢查點隊列的不同位置具有關于若干PI的條目。
舉例來說,圖5描述了一種方案,其中節(jié)點的檢查點隊列500具有某個特定數(shù)據(jù)項(數(shù)據(jù)項5)的三個條目。特別地,檢查點隊列500具有一個頭部502、一個尾部504以及與數(shù)據(jù)項5的版本V1、V6和V8相對應的三個條目506、508和510。同樣,圖6描述了一種方案,其中另一個節(jié)點的檢查點隊列600具有數(shù)據(jù)項5的兩個條目。特別地,條目606和608對應于數(shù)據(jù)項5的版本V3和V7。
出于說明目的,假定檢查點隊列500是節(jié)點A(未示出)的檢查點隊列,并且檢查點隊列600是節(jié)點B(未示出)的檢查點隊列。
數(shù)據(jù)項主管是與最新PI版本號一起更新的,其中該PI是將臟數(shù)據(jù)項轉移到另一個節(jié)點之后才創(chuàng)建的。因此,當節(jié)點A創(chuàng)建數(shù)據(jù)項5的V1并將數(shù)據(jù)項5轉移到另一個節(jié)點時,數(shù)據(jù)項5的主管將會更新,以便指示節(jié)點A具有V1。當節(jié)點A隨后創(chuàng)建數(shù)據(jù)項5的V6并將數(shù)據(jù)項5轉移到另一個節(jié)點時,數(shù)據(jù)項5的主管將會更新,以便指示節(jié)點A具有V6。同樣,當節(jié)點A隨后創(chuàng)建數(shù)據(jù)項5的V8并將數(shù)據(jù)項5轉移到另一個節(jié)點時,數(shù)據(jù)項5的主管將會更新,以便指示節(jié)點A具有V8。
然而,在將PI或是一個更近的版本寫入永久性存儲器之前,這個PI將會占用緩存區(qū)中的存儲器,并且這個PI是不能替換的。因此,當一個臟數(shù)據(jù)項移出緩存區(qū)時,如果已經(jīng)存在一個PI,則新創(chuàng)建的PI可以與先前的PI合并(或是將其替換)。但是,與所合并PI相關聯(lián)的檢查點條目必須與合并中包含的最早版本的條目保持在臟數(shù)據(jù)隊列或檢查點隊列中的相同位置,這是因為一個檢查點不能夠考慮完整直到在創(chuàng)建第一PI時對數(shù)據(jù)項進行的改變將會反映在數(shù)據(jù)項的永久性存儲器版本上。此外,在合并中的最新版本由寫入磁盤的操作覆蓋之前,合并條目是不能從檢查點隊列中刪除的。
例如,圖7描述了檢查點隊列500,其中與數(shù)據(jù)項5的版本V1、V6和V8相對應的條目506、508以及510合并為單個條目702。由于條目506是合并中包含的最早條目,因此單個條目702位于條目506占據(jù)的位置。
部分覆蓋的合并條目在對一個數(shù)據(jù)項的PI進行合并時,當把數(shù)據(jù)項的一個版本寫入一個不同節(jié)點的永久性存儲器時,該版本有可能覆蓋合并PI中反映的某些而非全部變化。舉例來說,如果節(jié)點B把數(shù)據(jù)項5的V7寫入永久性存儲器,則只有與合并條目702的V1和V6相關聯(lián)的變化將會受到覆蓋。而與V8相關聯(lián)的變化則不會受到覆蓋。
當永久性存儲器版本完全覆蓋了所合并PI中包含的變化時,涉及PI的條目可以丟棄,檢查點可以超過PI中進行的最早變化而得以提前。舉例來說,如果已經(jīng)將數(shù)據(jù)項5的V9寫入了永久性存儲器,則可以丟棄合并條目702。
另一方面,當永久性存儲器寫入僅僅覆蓋了所合并PI的某些變化時,所合并PI的條目不能被丟棄。舉例來說,即使將V7寫入永久性存儲器這個操作能夠允許從檢查點隊列500中刪除那些沒有經(jīng)過合并的條目506和508,但是它并不允許從檢查點隊列500中刪除合并條目702。
盡管不能丟棄與受到部分覆蓋的所合并PI相對應的條目,但是可以在臟數(shù)據(jù)隊列或檢查點隊列中將這個條目移動到對應于某個版本的條目的位置,其中所述版本位于寫入到永久性存儲器的版本之后。舉例來說,在將數(shù)據(jù)項5的V7寫入永久性存儲器之后,在檢查點隊列500中,條目702可以移動到與數(shù)據(jù)項5(也就是條目510)的V8相對應的條目的位置。這允許檢查點在第一條目還沒有受到寫入磁盤操作覆蓋之前得以繼續(xù)進行,而不會受到與所合并PI的條目的阻攔。
避免創(chuàng)建部分覆蓋的合并條目在某些系統(tǒng)中,臟隊列或檢查點隊列是作為一個鏈接列表來執(zhí)行的。在CPU使用方面,對鏈接列表進行掃描并將一個合并條目插入隊列中的正確位置,這種操作有可能是非常昂貴的。可以執(zhí)行一個存儲器內部索引來簡化這個操作,但在把數(shù)據(jù)項鏈接到檢查點隊列的時候,這將會造成額外的開銷。
根據(jù)一個實施例,通過避免創(chuàng)建部分覆蓋的已移動條目,可以免除對那些受到部分覆蓋的合并條目進行移動所涉及的開銷。具體地說,當一個合并操作有可能創(chuàng)建一個將會部分覆蓋的合并條目時,該合并操作不會執(zhí)行。
根據(jù)一個實施例,在(1)將數(shù)據(jù)項一個版本寫入永久性存儲器,以及(2)在節(jié)點之間轉移數(shù)據(jù)項時,主管會把當前正在寫入永久性存儲器的數(shù)據(jù)項的版本號(“正被寫入”的版本號)傳遞到該數(shù)據(jù)項正在移至的節(jié)點(“接收”節(jié)點)。接收節(jié)點由此知道不對等同或是早于正被寫入版本的任何數(shù)據(jù)項版本以及晚于正被寫入版本的任何數(shù)據(jù)項版本進行合并。
再次參考圖5和6,假定節(jié)點A對寫入數(shù)據(jù)項5的V6進行處理。在完成寫入操作之前,節(jié)點A將數(shù)據(jù)項5發(fā)送到節(jié)點B,并且節(jié)點B修改數(shù)據(jù)項5的接收版本來創(chuàng)建數(shù)據(jù)項5的V7。主管向節(jié)點B告知數(shù)據(jù)項5的V6是在主管向節(jié)點B發(fā)送一個偵測隊列時寫入永久性存儲器的。因此,節(jié)點B不會對數(shù)據(jù)項5的V7以及數(shù)據(jù)項5的V3進行合并,因為由此產(chǎn)生的合并數(shù)據(jù)項僅僅會因為V6的寫入而受到部分覆蓋。由于寫入V6完全覆蓋了V3,因此在結束了V6的寫入之后,節(jié)點B可以丟棄V3并從隊列600中刪除條目606。
因此,在進行寫入永久性存儲器的操作中,和那些至少與正被寫入版本一樣舊的版本相關聯(lián)的PI及條目可以相互合并,并且,與那些比正被寫入版本更新的版本相關聯(lián)的PI和條目可以相互合并。然而,對于那些至少與正被寫入版本一樣舊的版本以及那些比正被寫入版本更新的版本而言,與這兩種版本分別相關的PI不應該進行合并。
在一個最近版本持有者總是執(zhí)行寫入永久性存儲器的操作的系統(tǒng)中,通過使用這種技術,確保了不會有合并PI受到寫入永久性存儲器操作的部分覆蓋。具體地說,當一個節(jié)點被偵測而發(fā)送一個經(jīng)歷過寫入永久性存儲器操作的數(shù)據(jù)項時,該節(jié)點不會將數(shù)據(jù)項的新版本與舊版本相互合并。如果數(shù)據(jù)項沒有經(jīng)歷過寫入永久性存儲器的操作,則接收到的數(shù)據(jù)項將是最新版本,并且此后不會有其他節(jié)點要求將數(shù)據(jù)項的更早版本寫入永久性存儲器。
一種避免寫入對局部變化造成覆蓋的替換方法是啟發(fā)式的確定何時創(chuàng)建新的檢查點隊列條目,而不是合并現(xiàn)有的檢查點隊列條目。舉例來說,假設存在對應于數(shù)據(jù)項3的版本V7的檢查點隊列條目。有可能會有必要確定是否為數(shù)據(jù)項3的新版本創(chuàng)建一個新條目或是將新版本與現(xiàn)有版本相合并。舉例來說,對于是否合并所進行的判斷可以啟發(fā)性的基于對現(xiàn)有條目進行的首次變化相對于(1)重做日志中存在的最新變化以及(2)對臟隊列或檢查點隊列開頭數(shù)據(jù)項進行的最早變化到底有多長時間。這種啟發(fā)式方法估計了與現(xiàn)有條目相關聯(lián)的PI不久將被寫入(或是因為寫入而受到覆蓋)的可能性,并且能使節(jié)點擴展檢查點,使之超過PI中的首次變化。
舉例來說,如果重做日志中的最新變化對應于遠遠晚于V7的一個時間,并且處于檢查點隊列開頭的數(shù)據(jù)項與接近V7的一個時間相關聯(lián),則存在一個較高概率而使一個與現(xiàn)有條目相關聯(lián)的PI不久即被寫入(或是由一次寫入所覆蓋),因此應該為新版本產(chǎn)生一個單獨條目。另一方面,如果重做日志中的最新變化對應于一個接近V7的時間,并且處于檢查點隊列開頭的數(shù)據(jù)項對應于一個遠遠早于V7的時間,則存在一個較低的可能性而使一個與現(xiàn)有條目相關聯(lián)的PI不久即被寫入(或是由一次寫入所覆蓋)。因此,新版本應該合并到現(xiàn)有條目中。
單個節(jié)點故障的檢查點隊列如上所述,在重做日志內部,位于檢查點隊列開頭的條目確定了故障之后必須開始恢復處理的位置。對于一個精確恢復來說,較為安全的是從對應于檢查點隊列開頭的條目的位置開始處理重做日志,而不考慮此次故障涉及了群集內部多少節(jié)點。
根據(jù)一個實施例,提供了一種檢查點機制來為每個節(jié)點追蹤兩個檢查點一個多重故障檢查點和一個單獨故障檢查點。多重故障檢查點指示了包括該節(jié)點的多節(jié)點故障之后開始處理節(jié)點恢復的位置。單獨故障檢查點指示了節(jié)點的單個節(jié)點故障之后開始處理節(jié)點重做日志的位置。
如在下文將要描述的那樣,在不允許從多重故障檢查點隊列中刪除條目的情況下,可以從單個故障檢查點隊列中刪除條目。因此,單獨故障檢查點通常要比多重故障檢查點提前很多。由于單獨故障檢查點被提前很多,因此保持單獨故障檢查點只會產(chǎn)生從單個節(jié)點故障中進行恢復而必須執(zhí)行的較少工作。
相對于提前檢查點而言,當節(jié)點將一個臟數(shù)據(jù)項轉移到另一個節(jié)點時,該節(jié)點的多重故障檢查點不會改變。由于數(shù)據(jù)項是臟的,因此在多重故障檢查點隊列中存在一個關于該數(shù)據(jù)項的條目。在轉移了臟數(shù)據(jù)之后,該條目保持在多重故障檢查點的隊列中。
與之相反,在把臟數(shù)據(jù)項轉移到另一個節(jié)點時,與臟數(shù)據(jù)項相關聯(lián)的條目是從單獨故障檢查點隊列中刪除的。因為只要轉移節(jié)點出現(xiàn)故障,那么對臟數(shù)據(jù)項所做的改變就不會丟失,所以從單獨故障檢查點隊列中刪除所轉移臟數(shù)據(jù)項的條目是非常安全的。僅僅響應于轉移節(jié)點的故障,轉移節(jié)點所進行的改變是在發(fā)送到接收節(jié)點的數(shù)據(jù)項版本中反映出來的。在這些情況下,確保將改變存入永久性存儲器的責任是與數(shù)據(jù)項一起轉移的。因此,即使接收節(jié)點并沒有對數(shù)據(jù)項進行任何進一步的修改,接收節(jié)點也必須任選其一(1)確保將轉移節(jié)點所做的改變(或是關于這些變化的重做)寫入了永久性存儲器,或者(2)將臟數(shù)據(jù)項(以及責任)轉移到另一個節(jié)點。
將臟數(shù)據(jù)項轉移到另一個節(jié)點,這使得轉移節(jié)點能夠從它的單個節(jié)點故障的檢查點隊列刪除關于所轉移數(shù)據(jù)項的條目。因此,想要將其單個節(jié)點故障的檢查點隊列提前的節(jié)點只須將與其單個節(jié)點故障的檢查點隊列開頭的條目相對應的臟數(shù)據(jù)項轉移到另一個節(jié)點。即使是在接收臟數(shù)據(jù)項的節(jié)點從不請求數(shù)據(jù)項的情況下,也可以為此目的而執(zhí)行臟數(shù)據(jù)項的轉移。
這兩個檢查點可以使用各種方法來加以實現(xiàn),并且本發(fā)明并不局限于任何特定實施。舉例來說,單獨故障的檢查點隊列以及多重故障的檢查點隊列可以作為兩個完全獨立的隊列來加以保持。作為選擇,可以保持條目的單獨“組合”隊列,以便適合單獨故障的檢查點隊列和多重故障的檢查點隊列。在使用一個組合隊列的時候,在組合隊列內部,可以使用一個指針來識別哪個條目位于單獨故障的檢查點隊列開頭。在從多重故障的檢查點隊列中刪除條目的時候,這些條目是從組合隊列中刪除的。在從單個故障的檢查點隊列中刪除條目的時候,它們是據(jù)此標記的,但是這些條目并沒有從組合隊列中刪除。
基于二進制文件的分批處理根據(jù)基于二進制文件的分批處理方法,在一個節(jié)點中保持了兩個獨立的檢查點隊列一個全局變臟的檢查點隊列和一個本地變臟的檢查點隊列。節(jié)點的本地變臟的檢查點隊列包含了對應于那些僅僅在該節(jié)點中變臟的數(shù)據(jù)項的條目。節(jié)點的全局變臟檢查點隊列包含了對應于那些在其它節(jié)點中也已變臟的數(shù)據(jù)項的條目。
根據(jù)一個實施例,在全局變臟的檢查點隊列中的條目合并為“二進制文件”。每個二進制文件都與一定的時間范圍相關聯(lián),并且包含了關于數(shù)據(jù)項版本的條目,其中這些數(shù)據(jù)項首先在這個時間范圍內變臟。因此,如果合并條目對應于數(shù)據(jù)項在時間T7、T9和T12變臟時產(chǎn)生的數(shù)據(jù)項版本,則合并條目將會落入與包含T7的時間范圍相對應的二進制文件,這是因為T7是由該條目覆蓋的“首次變臟時間”。
舉例來說,圖8描述了節(jié)點X的全局變臟的檢查點隊列800,該隊列分成了二進制文件812、814以及816。二進制文件812與時間范圍T15到T25相關聯(lián)并且包含了與那些在T15與T25之間具有首次變臟時間的全局變臟數(shù)據(jù)項相對應的條目。二進制文件814與時間范圍T16到T35相關聯(lián)并且包含了與那些在T16與T35之間具有首次變臟時間的全局變臟的數(shù)據(jù)項相對應的條目。二進制文件816與時間范圍T36到T45相關聯(lián)并且包含了與那些在T36與T45之間具有首次變臟時間的全局性臟數(shù)據(jù)項相對應的條目。
根據(jù)一個實施例,每個二進制文件都指派了一個版本號。舉例來說,二進制文件的版本號可以是二進制文件中任何一個條目的首次變臟時間值。舉例來說,二進制文件812包含條目805、806以及807,這三個條目分別與數(shù)據(jù)項1的V1、數(shù)據(jù)項5的V1以及數(shù)據(jù)項8的V3相關聯(lián)。假設數(shù)據(jù)項1的V1、數(shù)據(jù)項5的V1以及數(shù)據(jù)項8的V3分別是在時間T17、T19以及T23首次變臟的。在這種情況中,T23是二進制文件812中任何一個PI的最高的首次變臟時間。因此將會把版本號T23指派給二進制文件812。
根據(jù)一個實施例,通過使永久性存儲器的寫入子系統(tǒng)基于逐個二進制文件而不是基于逐個條目來向主管發(fā)布寫入請求,由此減少了寫入請求消息的數(shù)目。舉例來說,為使檢查點隊列800提前,節(jié)點X向主管發(fā)送一個單獨的寫入請求消息,以便寫入那些與二進制文件812中的所有條目相對應的數(shù)據(jù)項。寫入請求消息只須借助版本號T23(而不是二進制文件內部的特殊條目)即可識別二進制文件812。響應于寫入請求,主管將寫入執(zhí)行消息發(fā)送到全部數(shù)據(jù)項的當前鎖持有者,其中對于具有一個PI的這些數(shù)據(jù)項來說,它們的首次變臟時間小于或等于寫入請求中指定的版本號。在當前實例中,主管將寫入執(zhí)行消息發(fā)送到所有數(shù)據(jù)項的當前鎖持有者,對于具有一個PI的這些數(shù)據(jù)項來說,它們的首次變臟時間小于或等于T23。
當每個節(jié)點完成了將最早在T23或者T23之前發(fā)生變化的所有臟數(shù)據(jù)項寫入磁盤時,該節(jié)點向主管發(fā)送一個寫入確認信息。當主管從寫入執(zhí)行消息所發(fā)至的所有節(jié)點接收到寫入確認信息時,主管會向所有節(jié)點發(fā)送寫入通知消息,以便向其告知所請求的寫入已經(jīng)完成。作為響應,每個節(jié)點可以清空對應的二進制文件。舉例來說,當節(jié)點X被告知首次變臟時間在T23或T23之前的全部數(shù)據(jù)項已經(jīng)寫入磁盤時,該節(jié)點X可以清空二進制文件812。清空二進制文件812可以通過(1)丟棄所有那些沒有覆蓋掉T23之后所作改變的條目,以及(2)將覆蓋T23之后所作改變的二進制文件812內部的那些條目移動到其他二進制文件。舉例來說,如果條目806是一個覆蓋了T19與T40時所作改變的合并條目,則在清空二進制文件812的時候,條目806移動到了二進制文件814。
根據(jù)一個實施例,主管追蹤(1)PI的首次變臟時間,以及(2)與PI的最后改變(“最后變臟時間”)相關聯(lián)的版本號。舉例來說,對于合并條目702而言,主管知道合并條目對應于版本V8(合并條目中的最新版本)以及版本V1(合并條目中的最早版本)。在這種實施例中,當節(jié)點從主管那里接收到一個具有二進制文件版本號的寫入通知時,它會(1)丟棄最后變臟時間小于或等于二進制文件版本號的二進制文件中的所有條目,以及(2)將最后變臟時間大于二進制文件版本號的二進制文件中的所有條目移動到隊列中的下一個二進制文件,由此清空二進制文件。在這個方案中,當存在一次部分覆蓋了PI中所包含變化的寫入時,由于與最終得到的合并PI相對應的條目很容易移動到它的恰當二進制文件在舊的PI二進制文件中,當因為臟數(shù)據(jù)項轉移到另一個節(jié)點而創(chuàng)建一個新PI時,新PI的條目總是可以替換掉若有的較舊PI的條目。
基于二進制文件的分批處理通常更適于那些使用全局主管而不是分布式鎖管理器的多節(jié)點系統(tǒng)。發(fā)送到當前鎖持有者的消息易于進行批量處理,因為它們是同時產(chǎn)生的。實質上,主管還為全局變臟的數(shù)據(jù)項追蹤永久性存儲器的版本號,而不是追蹤永久性存儲器上的數(shù)據(jù)項版本號以及那些處于寫入過程中的數(shù)據(jù)項的版本號,這非常類似于檢驗點記錄對那些涉及節(jié)點中所有臟數(shù)據(jù)項的變化進行追蹤。
恢復對在多節(jié)點系統(tǒng)中執(zhí)行的寫入磁盤操作進行追蹤,這一點是非常重要的。舉例來說,對于判定哪個條目可以從檢查點隊列中刪除以及確定是否數(shù)據(jù)項的過去鏡像可以寫入磁盤和/或從緩存區(qū)中釋放(“刷新”)來說,這種信息是非常重要的。具體地說,如果已經(jīng)將數(shù)據(jù)項的新近版本寫入磁盤,則決不應該將數(shù)據(jù)項的先前一個版本寫入磁盤。此外,在將數(shù)據(jù)項的更近版本寫入磁盤的時候,可以從緩存區(qū)刷新數(shù)據(jù)項的PI版本。
在某種情況下,是否成功執(zhí)行了寫入磁盤操作有可能是不清楚的。舉例來說,如果將數(shù)據(jù)項寫入磁盤的節(jié)點在寫入操作過程中出現(xiàn)了故障,則是否在故障發(fā)生成功完成了寫入操作的前后有可能是不清楚的。同樣,如果某個數(shù)據(jù)項的主管駐留的節(jié)點發(fā)生故障,則這個故障可能會導致與數(shù)據(jù)項有關的信息損失。這種信息可能包含了用于指示寫入到磁盤的數(shù)據(jù)項的最近版本的信息。
在發(fā)生了一種不清楚是否成功執(zhí)行了寫入磁盤操作的情況時,可以通過掃描磁盤上的數(shù)據(jù)項來確定其版本,由此可能解決這個問題。然而,作為恢復操作一部分的掃描磁盤將會耗費大量時間和資源,并且有可能過度延遲數(shù)據(jù)的有效性。
根據(jù)本發(fā)明的一個方面,可以通過以下手段來免除掃描磁盤上的數(shù)據(jù)項的需要(1)如果不清楚是否已將數(shù)據(jù)項的某個特定版本寫入磁盤并且恢復信息(例如重做日志)指示已經(jīng)將這個特定版本寫入了磁盤,則引起恢復處理去假設特定數(shù)據(jù)項已經(jīng)成功寫入了磁盤,以及(2)將較早緩存的所有數(shù)據(jù)項版本都標記為“懷疑”。在恢復操作之后,系統(tǒng)可以借助相反的假設來繼續(xù)進行。具體地說,系統(tǒng)是基于數(shù)據(jù)項特定版本沒有寫入磁盤這個假設而繼續(xù)進行的。然而,在將數(shù)據(jù)項的任何懷疑版本寫入磁盤之前,該系統(tǒng)會讀取駐留在磁盤上的數(shù)據(jù)項版本。如果數(shù)據(jù)項的磁盤版本更近,則不會執(zhí)行寫磁盤操作,并且主管將被告知磁盤上的是哪個版本??蛇x地,主管然后將寫入通知消息發(fā)送到保持了由磁盤上的版本所覆蓋的版本的全部節(jié)點。另一方面,數(shù)據(jù)項被恢復。
同樣,當一個節(jié)點請求數(shù)據(jù)項的當前版本時,不能向該請求節(jié)點提供數(shù)據(jù)項的懷疑版本,這是因為磁盤中可能包含了數(shù)據(jù)項的更近版本。取而代之的是,從磁盤中讀取數(shù)據(jù)項的磁盤版本。如果從磁盤中讀取的數(shù)據(jù)項版本是最近版本,則該版本將會提供給請求節(jié)點。如果數(shù)據(jù)項的磁盤版本不是最近版本,則將會根據(jù)出現(xiàn)故障的節(jié)點的重做日志所保持的恢復信息來創(chuàng)建最近的版本。
不保留過去鏡像而對檢查點進行管理在以上給出的許多情況中,假設每個節(jié)點都被配置成保留一個PI,直到該PI受到寫入磁盤操作所覆蓋。然而,根據(jù)本發(fā)明的一個實施例,并沒有保留這種PI。
具體地說,每個節(jié)點保持一個全局變臟的檢查點隊列以及一個本地變臟的檢查點隊列。與本地變臟的檢查點隊列中的條目相關聯(lián)的臟數(shù)據(jù)項將會保留,直到它由寫入磁盤操作所覆蓋。然而,與全局變臟的檢查點隊列相關聯(lián)的PI無需以這種方式加以保留。
在這個實施例中,如上所述,執(zhí)行寫入磁盤操作的權限受到數(shù)據(jù)項上保持的封鎖模式的束縛。具體地說,如果(1)節(jié)點持有數(shù)據(jù)項的排他鎖,或者(2)不存在持有數(shù)據(jù)項的排他鎖的節(jié)點,并且一個節(jié)點是保持排他鎖的最新節(jié)點,那么該節(jié)點有權為一個數(shù)據(jù)項執(zhí)行寫入磁盤的操作。
由于一個節(jié)點將會具有本地變臟的所有數(shù)據(jù)項的排他鎖,因此該節(jié)點能將那些與本地變臟的隊列相關聯(lián)的數(shù)據(jù)項寫入磁盤,而不需要主管介入。該節(jié)點還可以具有一個數(shù)據(jù)項的排他鎖或者已擁有最近的排他鎖,其中這個數(shù)據(jù)項與全局變臟的隊列中的條目相關聯(lián),并且該節(jié)點由此可以將這個數(shù)據(jù)項寫入磁盤,而不需要主管介入。
由于從緩存區(qū)中偵測出臟數(shù)據(jù)項時,節(jié)點并未保持一個PI,因此需要專門的恢復處理。具體地說,在數(shù)據(jù)項轉移過程中或是因為節(jié)點故障而使數(shù)據(jù)項的當前版本丟失時,該系統(tǒng)把來自所有節(jié)點并經(jīng)過合并的重做日志中的變化應用于永久性存儲器上的數(shù)據(jù)項,以便重新產(chǎn)生數(shù)據(jù)項的當前版本。在每個重做日志內部,開始恢復處理的位置是通過一個與該節(jié)點相關聯(lián)的檢查點而得到確定的。除非數(shù)據(jù)項版本中包含了永久性存儲器的檢查點之前在節(jié)點中進行的變化,否則不能認為節(jié)點中的檢查點完結。因此,在將一個臟數(shù)據(jù)項被偵測出發(fā)送到另一個節(jié)點,而不是在任何檢查點隊列中都保持數(shù)據(jù)項過去鏡像的時候,數(shù)據(jù)項本身可以丟棄,并且數(shù)據(jù)項頭部或控制塊鏈接到全局變臟的隊列。
全局變臟的隊列是借助與條目相關聯(lián)的首次變臟時間來進行排序的,并且它與本地變臟的隊列相似,只不過沒有為每個條目保持相關的真實數(shù)據(jù)項(也就是說,節(jié)點緩存區(qū)中并沒有數(shù)據(jù)項內容)。節(jié)點中的檢查點低于出于本地變臟隊列開頭的條目的首次變臟時間以及處于全局變臟隊列開頭的條目的首次變臟時間。
當一個節(jié)點想要將其檢查點提前時,該節(jié)點可以在沒有主管介入的情況下寫入本地變臟隊列中的數(shù)據(jù)項(因為絕不存在兩個節(jié)點同時寫入同一數(shù)據(jù)項的可能性)或是將一個寫入請求發(fā)送到主管,以便在擁有者的節(jié)點寫出數(shù)據(jù)項,其中該數(shù)據(jù)項對應于全局變臟隊列中數(shù)據(jù)項頭部的一個更近的版本。
根據(jù)一個替換實施例,在每個節(jié)點中保存了兩個檢驗點記錄(每一個都對應于每個隊列)。第一檢驗點記錄指示的是時間TX,其中在節(jié)點緩存區(qū)中,在TX之前對當前變臟的數(shù)據(jù)項所做的全部改變都記錄在永久性存儲器的數(shù)據(jù)項版本上。第二檢驗點記錄包括數(shù)據(jù)項列表以及在這個節(jié)點中進行的首次變化的版本號,在這個節(jié)點中,這個版本號曾經(jīng)變臟,但是此后已被偵測出,并且并未寫入永久性存儲器。一旦偵測出臟數(shù)據(jù)項,那么緩存區(qū)將會無法追蹤臟數(shù)據(jù)項,但是仍舊在主管之中保持將封鎖開啟(也就是說,在出現(xiàn)一個寫入通知之前,鎖定是不會關閉的)。
在出現(xiàn)節(jié)點故障時,掃描出現(xiàn)故障的節(jié)點上的重做日志的起始位置是通過確定(1)第一檢查點記錄所確定的日志中的位置(稱之為本地檢查點記錄)以及(2)第二檢查點記錄中由數(shù)據(jù)項列表進行的最早變化所確定的日志中的位置(它可以認為是全局檢查點記錄的特定節(jié)點部分)中的較少的一方來進行計算。
在恢復過程中,對于全局檢查點記錄到節(jié)點的本地檢查點記錄之間的日志部分的可能恢復而言(假設全局檢查點記錄是在本地檢驗點記錄之后),只有那些對應于全局檢查點記錄中的數(shù)據(jù)項的日志記錄需要被考慮。一旦到達了本地檢驗點記錄,那么在到達日志末尾之前,需要為可能的恢復而對所有日志記錄加以考慮。
這個方案優(yōu)于現(xiàn)有方法,因為它把第二檢驗點記錄中的數(shù)據(jù)項列表限制到了僅僅那些先前在這個節(jié)點已經(jīng)變臟的數(shù)據(jù)項(與整個系統(tǒng)中的所有臟數(shù)據(jù)項相反)。第二,可以獨立于其他節(jié)點來寫入每個節(jié)點的全局檢查點記錄(也就是說,不需要協(xié)調全局主管或是GLM檢查點)。最終,在恢復過程中需要掃描的各個節(jié)點的重做日志部分總是比較短的,因為不需要從整個系統(tǒng)中最早的未寫入變化開始掃描每個節(jié)點的重做日志。
此外,在具有全局緩存區(qū)的情況下,現(xiàn)有永久性存儲器寫入?yún)f(xié)議假設對一個同步的全局時鐘進行訪問,其中將來自時鐘的數(shù)值用作日志序列碼(LSN)。這里給出的技術方法無需訪問一個同步的全局時鐘。此外,現(xiàn)有技術需要一個保持封鎖一致性的全局主管(GLM)以及群集中的臟數(shù)據(jù)項的恢復序列號。此外,現(xiàn)有技術無法輕易擴展到那些主管分布在幾個節(jié)點的系統(tǒng)(DLM)。
硬件綜述圖9是描述可以執(zhí)行本發(fā)明一個實施例的計算機系統(tǒng)900的數(shù)據(jù)項框圖。計算機系統(tǒng)900包括一條總線902或是用于傳遞信息的其他通信機制,并且包括一個與總線902耦合并用于處理信息的處理器904。計算機系統(tǒng)900還包含一個主存儲器906,例如隨機訪問存儲器(RAM)或是其它動態(tài)存儲設備,這個存儲設備與總線902耦合,用于保存信息以及處理器904所要執(zhí)行的指令。在運行處理器904所執(zhí)行指令的過程中,主存儲器906還可用于保存臨時變量或是其它中間信息。計算機系統(tǒng)900還包括一個只讀存儲器(ROM)908或其它靜態(tài)存儲設備,它與總線902耦合,用于保存靜態(tài)信息和涉及處理器904的指令。此外還提供了諸如磁盤或光盤這種存儲設備910,它與總線902耦合,用于保存信息和指令。
計算機系統(tǒng)900可以經(jīng)由總線902而與陰極射線管(CRT)這類顯示器912相連,從而將信息顯示給計算機用戶。包括字母數(shù)字及其他按鍵的輸入設備914與總線902相連,以便將信息和命令選擇傳達到處理器904。另一種用戶輸入設備是光標控制916,例如鼠標、軌跡球或光標方向鍵,用于將方向信息和命令選擇傳遞給處理器904以及控制顯示器912上的光標移動。這種輸入設備通常在第一軸(例如x)和第二軸(例如y)這兩個軸上具有兩個自由度,由此設備能夠確定一個平面上的位置。
本發(fā)明涉及使用計算機系統(tǒng)900來執(zhí)行這里所描述的技術方法。根據(jù)本發(fā)明的一個實施例,處理器904執(zhí)行主存儲器906中包含的一個或多個指令的一個或多個序列,計算機系統(tǒng)900對此做出響應,由此執(zhí)行這些技術方法。這些指令可以從諸如存儲設備910等等的另一種計算機可讀介質讀入主存儲器906。通過執(zhí)行主存儲器906中包含的指令序列,處理器904執(zhí)行這里描述的處理步驟。在替換實施例中,硬布線電路可用于取代軟件指令或是與之組合,由此實現(xiàn)本發(fā)明。因此,本發(fā)明的實施例并不局限于硬件電路和軟件的任何一種特定組合。
這里使用的術語“計算機可讀介質”是指任何一種參與向處理器904提供指令以供執(zhí)行的介質。這種介質可以采取很多形式,其中包括但不局限于非易失介質、易失介質和傳輸介質。舉例來說,非易失介質包括光盤或磁盤,例如存儲設備910。易失介質包括動態(tài)存儲器,例如主存儲器906。傳輸介質包括同軸電纜、銅線和光纖,其中包括了構成總線902的線路。傳輸介質還可以采取聲波或光波的形式,例如無線電波和紅外數(shù)據(jù)通信中產(chǎn)生的信號。
舉例來說,計算機可讀介質的通用形式包括軟盤、軟磁盤、硬盤、磁帶或任何其它磁介質、CD-ROM或任何其它光學介質、穿孔卡、紙帶紙條或具有孔洞圖案的任何其它物理介質、RAM、PROM和EPROM、FLASH-EPROM、其它任何存儲芯片或盒式磁帶機、如下所述的載波或是計算機可以讀取的其它任何介質。
不同形式的計算機可讀介質可以涉及向處理器904傳遞用于實施的一個或多個指令的一個或多個序列。舉例來說,最初可以在遠程計算機磁盤上攜帶指令。遠程計算機可以將指令加載到它的動態(tài)存儲器中,并且使用調制解調器經(jīng)由電話線來發(fā)送指令。計算機系統(tǒng)900本地的調制解調器可以在電話線上接收數(shù)據(jù)并使用紅外發(fā)射機來將數(shù)據(jù)轉換成紅外信號。紅外檢測器可以接收紅外信號中攜帶的數(shù)據(jù),而恰當?shù)碾娐穭t可將數(shù)據(jù)安插到總線902上。總線902將數(shù)據(jù)傳送到主存儲器906,處理器904從主存儲器906中檢索并執(zhí)行指令。在由處理器904執(zhí)行之前或之后,主存儲器906接收的指令可以隨意保存在存儲設備910中。
計算機系統(tǒng)900還包括一個與總線902相連的通信接口918。通信接口918提供了一個與網(wǎng)絡鏈路920耦合的雙向數(shù)據(jù)通信,其中網(wǎng)絡鏈路920與本地網(wǎng)絡922相連。舉例來說,通信接口918可以是一個向對應類型的電話線路提供數(shù)據(jù)通信連接的綜合業(yè)務數(shù)字網(wǎng)(ISDN)網(wǎng)卡或調制解調器。作為另一個實例,通信接口918可以是一個LAN網(wǎng)卡,它向兼容的LAN提供數(shù)據(jù)通信連接。此外還可以實施無線鏈路。在任何一種這類實施中,通信接口918都會收發(fā)電、電磁或光信號,這些信號傳送的是那些代表不同類型信息的數(shù)字數(shù)據(jù)流。
網(wǎng)絡鏈路920通常經(jīng)由一個或多個網(wǎng)絡來向其它數(shù)據(jù)設備提供數(shù)據(jù)通信。舉例來說,網(wǎng)絡鏈路920可以經(jīng)由本地網(wǎng)絡922而將一個連接提供給計算機主機924或是互聯(lián)網(wǎng)服務供應商(ISP)926運作的數(shù)據(jù)設備。ISP 926進而又經(jīng)由現(xiàn)在通常稱為“互聯(lián)網(wǎng)”的全球分組數(shù)據(jù)通信網(wǎng)絡928來提供數(shù)據(jù)通信業(yè)務。本地網(wǎng)絡922和互聯(lián)網(wǎng)928都使用了傳送數(shù)字數(shù)據(jù)流的電、電磁或光信號。經(jīng)由不同網(wǎng)絡的信號以及網(wǎng)絡鏈路920上經(jīng)由通信接口918的信號傳送的是那些往返于計算機系統(tǒng)900的數(shù)字數(shù)據(jù),而這些信號即為傳送信息的載波的示范性形式。
計算機系統(tǒng)900可以經(jīng)由一個或多個網(wǎng)絡、網(wǎng)絡鏈路920以及通信接口918來發(fā)送消息和接收數(shù)據(jù),其中包括了程序代碼。在互聯(lián)網(wǎng)實例中,服務器930可以經(jīng)由互聯(lián)網(wǎng)928、ISP 926、本地網(wǎng)絡922以及通信接口918來發(fā)送一個用于應用程序的被請求碼。
接收到的代碼可以在接收時由處理器904執(zhí)行和/或存入存儲設備910或其它非易失存儲器以供稍后執(zhí)行。這樣,計算機系統(tǒng)900可以得到載波形式的應用碼。在前述說明中,本發(fā)明是參考其特定實施例而被描述的。然而很明顯,可以對本發(fā)明進行各種修改和變化,而不脫離本發(fā)明較寬的實質和范圍。因此,說明書以及附圖僅僅被看作是說明性的,它們并不具有限制意義。
權利要求
1.一種用于對將數(shù)據(jù)項寫入到永久性存儲器的操作進行協(xié)調的方法,所述方法包括步驟在第一節(jié)點內部為需要寫入永久性存儲器的臟數(shù)據(jù)項保持一個第一隊列;在第一節(jié)點內部為需要寫入永久性存儲器的臟數(shù)據(jù)項保持一個第二隊列;當對應于條目的臟數(shù)據(jù)項需要轉移到所述第一節(jié)點之外的一個節(jié)點時,將條目從所述第一隊列移動到所述第二隊列;以及在對寫入到永久性存儲器中的數(shù)據(jù)項進行選擇的時候,為與所述第二隊列中的條目相對應的數(shù)據(jù)項提供優(yōu)先級。
2.根據(jù)權利要求1所述的方法,其中移動條目的步驟包括響應于所述第一節(jié)點接收的消息而將一個條目從所述第一隊列移動到所述第二隊列,其中所述消息指示另一個節(jié)點已經(jīng)請求了對應于所述條目的數(shù)據(jù)項。
3.一種用于對將數(shù)據(jù)項寫入到永久性存儲器的操作進行協(xié)調的方法,所述方法包括步驟為每個所述數(shù)據(jù)項保持一個強制寫入計數(shù);每當一個節(jié)點將一個數(shù)據(jù)項寫入永久性存儲器,以使所述數(shù)據(jù)項轉移到另一個節(jié)點時,則遞增所述數(shù)據(jù)項的強制寫入計數(shù);基于與數(shù)據(jù)項相關聯(lián)的寫入計數(shù)來選擇寫入永久性存儲器中的臟數(shù)據(jù)項。
4.根據(jù)權利要求3所述的方法,還包括步驟將那些強制寫入計數(shù)超出某個閾值的臟數(shù)據(jù)項存入某個特定隊列;以及在對寫入到永久性存儲器中的臟數(shù)據(jù)項進行選擇的時候,為存儲在所述特定隊列中的數(shù)據(jù)項提供優(yōu)先級。
5.一種管理涉及到故障之后從何處開始進行恢復的信息的方法,所述方法包括步驟在多節(jié)點系統(tǒng)的某個特定節(jié)點中,同時保持一個單獨故障隊列,所述隊列指示的是在所述節(jié)點出現(xiàn)故障之后,在恢復日志中開始進行恢復的位置,以及一個多重故障隊列,所述隊列指示的是當所述多節(jié)點系統(tǒng)中的所述節(jié)點以及一個或多個其他節(jié)點出現(xiàn)故障之后,在恢復日志中開始進行恢復的位置;響應于正被寫入永久性存儲器的臟數(shù)據(jù)項,從所述單獨故障隊列和所述多重故障隊列中刪除一個涉及所述數(shù)據(jù)項的條目;以及響應于發(fā)送到所述多節(jié)點系統(tǒng)的另一節(jié)點而沒有首先寫入永久性存儲器的臟數(shù)據(jù)項,在不從所述多重故障隊列中刪除涉及所述數(shù)據(jù)項的條目的情況下,從所述單獨故障隊列中刪除一個涉及所述數(shù)據(jù)項的條目。
6.根據(jù)權利要求5所述的方法,還包括步驟將臟數(shù)據(jù)項發(fā)送到另一個節(jié)點,以便在其他節(jié)點沒有請求所述臟數(shù)據(jù)項的情況下,允許從所述單獨故障隊列中刪除所述條目。
7.根據(jù)權利要求5所述的方法,還包括步驟在一個單獨節(jié)點故障之后,在與單獨故障隊列相關聯(lián)的所述恢復日志中的一個位置開始應用所述恢復日志;以及在一個多節(jié)點故障之后,在與多重故障隊列相關聯(lián)的所述恢復日志中的一個位置開始應用所述恢復日志。
8.根據(jù)權利要求5所述的方法,還包括步驟所述單獨故障隊列和所述多重故障隊列是由一個單獨的組合隊列來實施的;以及從所述單獨故障隊列中刪除一個涉及所述數(shù)據(jù)項的條目而不從所述多重故障隊列中刪除涉及所述數(shù)據(jù)項的條目的步驟包括在不從所述組合隊列中刪除涉及所述數(shù)據(jù)項的條目的情況下,在所述組合隊列中對涉及所述數(shù)據(jù)項的條目加以標記。
9.根據(jù)權利要求5所述的方法,其中所述單獨故障隊列和所述多重故障隊列是作為兩個獨立的隊列而加以實施的。
10.一種用于在故障之后進行恢復的方法,所述方法包括步驟確定所述故障是否僅涉及一個節(jié)點;以及如果所述故障僅涉及所述一個節(jié)點,則通過從恢復日志中的第一個點開始應用所述節(jié)點的恢復日志來執(zhí)行恢復;以及如果所述故障涉及所述一個節(jié)點之外的一個或多個節(jié)點,則通過從恢復日志中的第二個點開始應用所述節(jié)點的恢復日志來執(zhí)行恢復;其中所述第一個點不同于所述第二個點。
11.根據(jù)權利要求10所述的方法,其中第一點至少部分是由駐留在其他節(jié)點緩存區(qū)中并由所述節(jié)點弄臟的數(shù)據(jù)項來確定的;以及第二點至少部分是由被永久存儲的所述節(jié)點弄臟的數(shù)據(jù)項來確定的。
12.一種用于在故障之后進行恢復的方法,所述方法包括步驟如果不清楚是否數(shù)據(jù)項的特定版本已被寫入了磁盤,則執(zhí)行以下步驟在不嘗試恢復所述數(shù)據(jù)項的情況下,對所述數(shù)據(jù)項的臟緩存版本進行標記,其中如果所述特定版本已被寫入磁盤,則所述數(shù)據(jù)項將被覆蓋;在發(fā)出一個請求而要求將所述臟緩存版本中的一個版本寫入磁盤的時候,確定所述數(shù)據(jù)項的哪一個版本已經(jīng)位于磁盤之上;以及如果所述數(shù)據(jù)項的所述特定版本已經(jīng)位于磁盤之上,則不將所述臟緩存版本中的一個所述版本寫入磁盤。
13.根據(jù)權利要求12所述的方法,還包括步驟如果所述數(shù)據(jù)項的所述特定版本不曾位于磁盤,則恢復所述數(shù)據(jù)項。
14.根據(jù)權利要求12所述的方法,還包括步驟如果所述數(shù)據(jù)項的所述特定版本已經(jīng)位于磁盤之上,則向包含數(shù)據(jù)項的所述臟緩存版本的節(jié)點告知所述臟緩存版本已經(jīng)由一個寫入磁盤操作所覆蓋。
15.一種用于在系統(tǒng)出現(xiàn)一次故障之后恢復數(shù)據(jù)項當前版本的方法,其中所述系統(tǒng)包含多個緩存區(qū),所述方法包括步驟修改所述多個緩存區(qū)的第一節(jié)點中的數(shù)據(jù)項,以便創(chuàng)建一個經(jīng)過修改的數(shù)據(jù)項;將修改過的數(shù)據(jù)項從所述第一節(jié)點發(fā)送到所述多個緩存區(qū)的第二節(jié)點,而不將來自所述第一節(jié)點的已修改數(shù)據(jù)項持久保存在永久性存儲器中;在已經(jīng)從所述第一節(jié)點將所述已修改數(shù)據(jù)項發(fā)送到所述第二節(jié)點之后,并且在所述第一節(jié)點中的所述數(shù)據(jù)項由一個寫入磁盤操作所覆蓋之前,丟棄所述第一節(jié)點中的所述數(shù)據(jù)項;以及在所述故障之后,基于與所有所述多個緩存區(qū)相關聯(lián)的合并的重做日志而將改變應用于永久性存儲器上的數(shù)據(jù)項,由此重新構建所述數(shù)據(jù)項的當前版本。
16.根據(jù)權利要求15所述的方法,還包括步驟為所述多個緩沖區(qū)的每一個都保持一個全局變臟的檢查點隊列以及一個本地變臟的檢查點隊列;其中,在由寫入磁盤操作覆蓋之前,與全局變臟的檢查點隊列中的條目相關聯(lián)的全局變臟的數(shù)據(jù)項是不會保留的;基于位于本地變臟的檢查點隊列頭部的條目的首次變臟時間以及位于全局變臟的檢查點隊列頭部的條目的首次變臟時間中較低的一個來為每個緩存區(qū)確定一個檢查點;以及在所述故障之后,基于為所述緩存區(qū)確定的檢查點來判定從何處開始處理與每個緩存區(qū)相關聯(lián)的重做日志。
17.根據(jù)權利要求15所述的方法,還包括步驟為所述多個緩沖區(qū)的每一個都保持一個全局變臟的檢查點隊列以及一個本地變臟的檢查點隊列;其中,在由寫入磁盤操作覆蓋之前,與全局變臟的檢查點隊列中的條目相關聯(lián)的全局變臟的數(shù)據(jù)項是不會保留的;為每個緩存區(qū)保持一個涉及本地變臟的檢查點隊列的第一檢查點記錄,所述記錄指示了一個第一時間,其中在第一時間之前對緩存區(qū)中當前變臟的數(shù)據(jù)項所進行的所有改變都被記錄到位于永久性存儲器上的數(shù)據(jù)項的一個版本中;為每個緩存區(qū)保持一個涉及全局變臟的檢查點隊列的第二檢查點記錄,其中第二檢查點記錄包括了數(shù)據(jù)項的一個列表,這些數(shù)據(jù)項在緩存中曾經(jīng)變臟,但是此后已被轉移出去并且不會寫入永久性存儲器;以及在所述故障之后,基于涉及所述緩存的所述第一檢查點記錄以及所述第二檢查點記錄來確定從何處開始處理與每個緩存區(qū)相關聯(lián)的重做日志。
18.根據(jù)權利要求17所述的方法,其中處理重做日志的步驟包括以下步驟確定一個起始位置,以便基于第一檢查點記錄所確定的重做日志中的一個位置以及對第二檢查點記錄中的數(shù)據(jù)項的列表所進行的較早改變而確定的日志中的位置中較小的一方來掃描重做日志;以及在恢復過程中,對于全局檢查點記錄所指示位置到本地檢查點記錄所指示位置之間的重做日志的位置來說,為了可能的重做而僅僅對那些與全局檢查點記錄中所標識數(shù)據(jù)項相對應的日志記錄加以考慮。
19.一種攜帶指令的計算機可讀介質,用于對數(shù)據(jù)項寫入到永久性存儲器中的操作進行協(xié)調,這些指令中包含了用于執(zhí)行以下步驟的指令在第一節(jié)點內部為需要寫入永久性存儲器的臟數(shù)據(jù)項保持一個第一隊列;在第一節(jié)點內部為需要寫入永久性存儲器的臟數(shù)據(jù)項保持一個第二隊列;當對應于條目的臟數(shù)據(jù)項需要轉移到所述第一節(jié)點之外的一個節(jié)點時,將條目從所述第一隊列移動到所述第二隊列;以及在對寫入到永久性存儲器中的數(shù)據(jù)項進行選擇的時候,為與所述第二隊列中的條目相對應的數(shù)據(jù)項提供優(yōu)先級。
20.根據(jù)權利要求19所述的計算機可讀介質,其中移動條目的步驟包括響應于所述第一節(jié)點接收的消息而將一個條目從所述第一隊列移動到所述第二隊列,其中所述消息指示另一個節(jié)點已經(jīng)請求了對應于所述條目的數(shù)據(jù)項。
21.一種攜帶指令的計算機可讀介質,用于對把數(shù)據(jù)項寫入到永久性存儲器的操作進行協(xié)調,這些指令中包含了用于執(zhí)行以下步驟的指令為每個所述數(shù)據(jù)項保持一個強制寫入計數(shù);每當一個節(jié)點將一個數(shù)據(jù)項寫入永久性存儲器,以使所述數(shù)據(jù)項轉移到另一個節(jié)點時,則遞增所述數(shù)據(jù)項的強制寫入計數(shù);基于與數(shù)據(jù)項相關聯(lián)的寫入計數(shù)來選擇寫入永久性存儲器中的臟數(shù)據(jù)項。
22.根據(jù)權利要求21所述的計算機可讀介質,還包括用于執(zhí)行以下步驟的指令將那些強制寫入計數(shù)超出某個閾值的臟數(shù)據(jù)項存入某個特定隊列;以及在對寫入到永久性存儲器中的臟數(shù)據(jù)項進行選擇的時候,給存儲在所述特定隊列的數(shù)據(jù)項提供優(yōu)先級。
23.一種攜帶指令的計算機可讀介質,用于對涉及到故障之后從何處開始進行恢復的信息進行管理,這些指令中包含了用于執(zhí)行以下步驟的指令在多節(jié)點系統(tǒng)的某個特定節(jié)點中,同時保持一個單獨故障隊列,所述隊列指示的是在所述節(jié)點出現(xiàn)故障之后,在恢復日志中開始進行恢復的位置,以及一個多重故障隊列,所述隊列指示的是當所述多節(jié)點系統(tǒng)中的所述節(jié)點以及一個或多個其他節(jié)點出現(xiàn)故障之后,在恢復日志中開始進行恢復的位置;響應于正被寫入到永久性存儲器的臟數(shù)據(jù)項,從所述單獨故障隊列和所述多重故障隊列中刪除一個涉及所述數(shù)據(jù)項的條目;以及響應于發(fā)送到所述多節(jié)點系統(tǒng)的另一節(jié)點而沒有首先寫入永久性存儲器的臟數(shù)據(jù)項,在不從所述多重故障隊列中刪除涉及所述數(shù)據(jù)項的條目的情況下,從所述單獨故障隊列中刪除一個涉及所述數(shù)據(jù)項的條目。
24.根據(jù)權利要求23所述的計算機可讀介質,還包括用于執(zhí)行以下步驟的指令將臟數(shù)據(jù)項發(fā)送到另一個節(jié)點,以便在其他節(jié)點沒有請求所述臟數(shù)據(jù)項的情況下,允許從所述單獨故障隊列中刪除所述條目。
25.根據(jù)權利要求23所述的計算機可讀介質,還包括用于執(zhí)行以下步驟的指令在一個單獨節(jié)點故障之后,在與單獨故障隊列相關聯(lián)的所述恢復日志中的一個位置開始應用所述恢復日志;以及在一個多節(jié)點故障之后,在與多重故障隊列相關聯(lián)的所述恢復日志中的一個位置開始應用所述恢復日志。
26.根據(jù)權利要求23所述的計算機可讀介質,其中所述單獨故障隊列和所述多重故障隊列是由一個單獨的組合隊列來實施的;以及從所述單獨故障隊列中刪除一個涉及所述數(shù)據(jù)項的條目而不從所述多重故障隊列中刪除涉及所述數(shù)據(jù)項的條目的步驟包括在不從所述組合隊列中刪除涉及所述數(shù)據(jù)項的條目的情況下,在所述組合隊列中對涉及所述數(shù)據(jù)項的條目加以標記。
27.根據(jù)權利要求23所述的計算機可讀介質,其中所述單獨故障隊列和所述多重故障隊列是作為兩個獨立的隊列而加以實施的。
28.一種攜帶指令的計算機可讀介質,用于在故障之后進行恢復,這些指令中包含了用于執(zhí)行以下步驟的指令確定所述故障是否僅涉及一個節(jié)點;以及如果所述故障僅涉及所述一個節(jié)點,則通過從恢復日志中的第一個點開始應用所述節(jié)點的恢復日志來執(zhí)行恢復;以及如果所述故障涉及所述一個節(jié)點之外的一個或多個節(jié)點,則通過從恢復日志中的第二個點開始應用所述節(jié)點的所述恢復日志來執(zhí)行恢復;其中所述第一個點不同于所述第二個點。
29.根據(jù)權利要求28所述的計算機可讀介質,其中第一點至少部分是由駐留在其他節(jié)點緩存區(qū)中并由所述節(jié)點弄臟的數(shù)據(jù)項來確定的;以及第二點至少部分是由被永久存儲的所述節(jié)點弄臟的數(shù)據(jù)項來確定的。
30.一種攜帶指令的計算機可讀介質,用于在故障之后進行恢復,這些指令中包含了用于執(zhí)行以下步驟的指令如果不清楚是否數(shù)據(jù)項的特定版本已被寫入了磁盤,則執(zhí)行以下步驟在不嘗試恢復所述數(shù)據(jù)項的情況下,對所述數(shù)據(jù)項的臟緩存版本進行標記,其中如果所述特定版本已被寫入磁盤,則所述數(shù)據(jù)項將被覆蓋;在發(fā)出一個請求而要求將所述臟緩存版本中的一個版本寫入磁盤的時候,確定所述數(shù)據(jù)項的哪一個版本已經(jīng)位于磁盤之上;以及如果所述數(shù)據(jù)項的所述特定版本已經(jīng)位于磁盤之上,則不將所述臟緩存版本中的一個版本寫入磁盤。
31.根據(jù)權利要求30所述的計算機可讀介質,還包括用于執(zhí)行以下步驟的指令如果所述數(shù)據(jù)項的所述特定版本不曾位于磁盤,則恢復所述數(shù)據(jù)項。
32.根據(jù)權利要求30所述的計算機可讀介質,還包括用于執(zhí)行以下步驟的指令如果所述數(shù)據(jù)項的所述特定版本已經(jīng)位于磁盤之上,則向包含數(shù)據(jù)項的所述臟緩存版本的節(jié)點告知所述臟緩存版本已經(jīng)由一個寫入磁盤操作所覆蓋。
33.一種攜帶指令的計算機可讀介質,用于在系統(tǒng)出現(xiàn)一次故障之后恢復數(shù)據(jù)項的當前版本,其中所述系統(tǒng)包含多個緩存區(qū),這些指令中包含了用于執(zhí)行以下步驟的指令修改所述多個緩存區(qū)的第一節(jié)點中的數(shù)據(jù)項,以便創(chuàng)建一個經(jīng)過修改的數(shù)據(jù)項;將修改過的數(shù)據(jù)項從所述第一節(jié)點發(fā)送到所述多個緩存區(qū)的第二節(jié)點,而不將來自所述第一節(jié)點的已修改數(shù)據(jù)項持久保存在永久性存儲器中;在已經(jīng)從所述第一節(jié)點將所述已修改數(shù)據(jù)項發(fā)送到所述第二節(jié)點之后,并且在所述第一節(jié)點中的所述數(shù)據(jù)項由一個寫入磁盤操作所覆蓋之前,丟棄所述第一節(jié)點中的所述數(shù)據(jù)項;以及在所述故障之后,基于與所有所述多個緩存區(qū)相關聯(lián)的合并的重做日志而將改變應用于永久性存儲器上的數(shù)據(jù)項,由此重新構建所述數(shù)據(jù)項的當前版本。
34.根據(jù)權利要求33所述的計算機可讀介質,還包括用于執(zhí)行以下步驟的指令為所述多個緩存區(qū)中的每一個都保持一個全局變臟的檢查點隊列以及一個本地變臟的檢查點隊列;其中,在由寫入磁盤操作覆蓋之前,與全局變臟的檢查點隊列中的條目相關聯(lián)的全局變臟的數(shù)據(jù)項是不會保留的;基于位于本地變臟的檢查點隊列頭部的條目的首次變臟時間以及位于全局變臟的檢查點隊列頭部的條目的首次變臟時間中較低的一個來為每個緩存區(qū)確定一個檢查點;以及在所述故障之后,基于為所述緩存區(qū)確定的檢查點來判定從何處開始處理與每個緩存區(qū)相關聯(lián)的重做日志。
35.根據(jù)權利要求33所述的計算機可讀介質,還包括用于執(zhí)行以下步驟的指令為所述多個緩存區(qū)中的每一個都保持一個全局變臟的檢查點隊列以及一個本地變臟的檢查點隊列;其中,在由寫入磁盤操作覆蓋之前,與全局變臟的檢查點隊列中的條目相關聯(lián)的全局變臟的數(shù)據(jù)項是不會保留的;為每個緩存區(qū)保持一個涉及本地變臟的檢查點隊列的第一檢查點記錄,所述記錄指示了一個第一時間,其中在第一時間之前對緩存區(qū)中當前變臟的數(shù)據(jù)項所進行的所有改變都被記錄到位于永久性存儲器上的數(shù)據(jù)項的一個版本中;為每個緩存區(qū)保持一個涉及全局變臟的檢查點隊列的第二檢查點記錄,其中第二檢查點記錄包括了數(shù)據(jù)項的一個列表,這些數(shù)據(jù)項在緩存中曾經(jīng)變臟,但是此后已被轉移出去并且不會寫入永久性存儲器;以及在所述故障之后,基于涉及所述緩存的所述第一檢查點記錄以及所述第二檢查點記錄來確定從何處開始處理與每個緩存區(qū)相關聯(lián)的重做日志。
36.根據(jù)權利要求35所述的計算機可讀介質,其中處理重做日志的步驟包括以下步驟確定一個起始位置,以便基于第一檢查點記錄所確定的重做日志中的一個位置以及對第二檢查點記錄中的數(shù)據(jù)項的列表所進行的較早改變而確定的日志中的位置中較小的一方來掃描重做日志;以及在恢復過程中,對于全局檢查點記錄所指示位置到本地檢查點記錄所指示位置之間的重做日志的位置而言,為了可能的重做而僅僅對那些與全局檢查點記錄中所標識數(shù)據(jù)項相對應的日志記錄加以考慮。
全文摘要
提供了用于管理一個系統(tǒng)中的緩存區(qū)的方法,該系統(tǒng)具有多個緩存區(qū),其中多個緩存中可以具有同一數(shù)據(jù)項的不同拷貝。具體的說,提供了用于對在這種數(shù)據(jù)項上執(zhí)行的磁盤寫入操作進行協(xié)調的方法,以確保數(shù)據(jù)項的較舊版本不會改寫較新版本,并且減少故障之后進行恢復所需要的處理量。并且提供了各種方法,其中使用了一個主管來與多個緩存區(qū)進行協(xié)調,以便將數(shù)據(jù)項寫入永久性存儲器。此外還提供了技術方法來管理那些與緩存區(qū)相關聯(lián)的檢查點,其中使用檢查點來確定一個位置,在出現(xiàn)故障時,對恢復日志進行的處理始于這個位置。
文檔編號G06F12/08GK1524226SQ02806161
公開日2004年8月25日 申請日期2002年3月7日 優(yōu)先權日2001年3月7日
發(fā)明者薩什坎斯·錢德拉塞克拉恩, 羅杰·班福德, 威廉·布里奇, 大衛(wèi)·布勞爾, 尼爾·麥克諾頓, 威爾遜·尚, 維納伊·斯瑞哈瑞, 尚, 斯瑞哈瑞, 布勞爾, 布里奇, 班福德, 薩什坎斯 錢德拉塞克拉恩, 麥克諾頓 申請人:甲骨文國際公司