国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      對(duì)多節(jié)點(diǎn)系統(tǒng)中的檢查點(diǎn)隊(duì)列進(jìn)行管理的制作方法

      文檔序號(hào):6574521閱讀:164來源:國知局
      專利名稱:對(duì)多節(jié)點(diǎn)系統(tǒng)中的檢查點(diǎn)隊(duì)列進(jìn)行管理的制作方法
      技術(shù)領(lǐng)域
      本發(fā)明涉及磁盤寫入操作的執(zhí)行,尤其涉及對(duì)多個(gè)系統(tǒng)中的臟數(shù)據(jù)項(xiàng)的寫入進(jìn)行協(xié)調(diào),其中這些系統(tǒng)允許一個(gè)數(shù)據(jù)項(xiàng)的臟數(shù)據(jù)版本駐留在多個(gè)節(jié)點(diǎn)的緩存區(qū)中。
      背景技術(shù)
      一種改進(jìn)數(shù)據(jù)庫系統(tǒng)中的可擴(kuò)展性的方法是允許多個(gè)節(jié)點(diǎn)同時(shí)讀取和修改共享存儲(chǔ)器中的數(shù)據(jù)。每個(gè)節(jié)點(diǎn)都具有一個(gè)緩存區(qū),以便將數(shù)據(jù)保持在易失主存儲(chǔ)器中,并且使用非易失共享磁盤存儲(chǔ)器來進(jìn)行備份。一個(gè)全局鎖管理器(GLM)或一個(gè)分布式鎖管理器(DLM)用來維持節(jié)點(diǎn)之間的緩存區(qū)相關(guān)性。為了提供從清除主存儲(chǔ)器內(nèi)容的節(jié)點(diǎn)故障中進(jìn)行的恢復(fù),使用了通用的預(yù)寫式日志(WAL)協(xié)議。出于性能原因,每個(gè)節(jié)點(diǎn)都具有一個(gè)記錄各種改變的私有重做日志。而為了減少節(jié)點(diǎn)故障之后需要在重做日志中被掃描的改變的數(shù)量,通常會(huì)采用遞增或周期性的檢查點(diǎn),由此確保不必將檢查點(diǎn)之前對(duì)數(shù)據(jù)項(xiàng)所做的全部改變重新應(yīng)用于非易失存儲(chǔ)器中的數(shù)據(jù)項(xiàng)。
      并發(fā)控制在運(yùn)行于相同或不同節(jié)點(diǎn)的事務(wù)之間執(zhí)行的并發(fā)控制是借助于全局事務(wù)頁級(jí)鎖或行級(jí)鎖來實(shí)施的。事務(wù)系統(tǒng)可以使用強(qiáng)制策略或非強(qiáng)制性策略,在強(qiáng)制策略中,經(jīng)過事務(wù)修改的數(shù)據(jù)項(xiàng)(例如頁面/數(shù)據(jù)塊)在提交事務(wù)的過程中寫入到穩(wěn)定存儲(chǔ)器中,而在非強(qiáng)制策略中,只有重做日志中的事務(wù)變化是在提交事務(wù)時(shí)強(qiáng)制執(zhí)行的。將強(qiáng)制策略與頁級(jí)鎖一起使用,這意味著數(shù)據(jù)塊僅僅由一個(gè)節(jié)點(diǎn)(實(shí)際上僅僅由一個(gè)事務(wù))進(jìn)行修改,并且在任何時(shí)刻都只能在一個(gè)系統(tǒng)緩存區(qū)中變臟。在所有其他組合中(也就是行級(jí)鎖與強(qiáng)制策略一起,頁級(jí)鎖與非強(qiáng)制策略一起,以及行級(jí)鎖與非強(qiáng)制策略一起),可以在多個(gè)系統(tǒng)中修改這些數(shù)據(jù)項(xiàng)并且還需要一種緩存區(qū)一致機(jī)制。
      最普通的范例是具有非強(qiáng)制數(shù)據(jù)項(xiàng)管理策略的行級(jí)鎖。出于說明目的,以下給出的例子是在使用了具有非強(qiáng)制數(shù)據(jù)項(xiàng)管理策略的行級(jí)鎖的系統(tǒng)環(huán)境中提供的。然而,這里描述的技術(shù)并不局限于這種環(huán)境。
      檢查點(diǎn)隊(duì)列在提交事務(wù)時(shí),反映事務(wù)所進(jìn)行的改變的數(shù)據(jù)必須保存在永久性存儲(chǔ)器中。在某些系統(tǒng)中,在提交的時(shí)候必須持續(xù)保存那些指示事務(wù)所進(jìn)行的改變的重做記錄,但是可以延遲那些經(jīng)過修改的數(shù)據(jù)項(xiàng)自身的實(shí)際寫入。那些(1)包含變化和(2)沒有持續(xù)保存的數(shù)據(jù)項(xiàng)稱為“臟數(shù)據(jù)項(xiàng)”。通常,節(jié)點(diǎn)中的臟數(shù)據(jù)項(xiàng)越多,如果節(jié)點(diǎn)出現(xiàn)故障,則恢復(fù)時(shí)間也就越長。因此,為了確?;謴?fù)時(shí)間不會(huì)長到難以接受,節(jié)點(diǎn)可以保持一個(gè)檢查點(diǎn)隊(duì)列。
      檢查點(diǎn)隊(duì)列包含了標(biāo)識(shí)臟數(shù)據(jù)項(xiàng)的條目。隊(duì)列中的條目是根據(jù)持續(xù)保存的重做日志中的相應(yīng)重做記錄順序來排列的。如果發(fā)生故障,則必須從一條重做記錄開始而對(duì)重做日志進(jìn)行處理,其中該記錄與位于檢查點(diǎn)隊(duì)列頭部的條目相對(duì)應(yīng)。
      在把一個(gè)臟數(shù)據(jù)項(xiàng)寫入永久性存儲(chǔ)器時(shí),對(duì)應(yīng)于這個(gè)數(shù)據(jù)項(xiàng)的條目將從檢查點(diǎn)隊(duì)列中刪除。在從檢查點(diǎn)隊(duì)列中刪除位于檢查點(diǎn)隊(duì)列頭部的條目時(shí),在重做日志內(nèi)部,恢復(fù)處理開始的位置必須開始改變而導(dǎo)致檢查點(diǎn)“提前”。檢查點(diǎn)在重做日志中提前的越多,在出現(xiàn)故障時(shí),從故障中恢復(fù)所要完成的工作也就越少。因此,節(jié)點(diǎn)通常會(huì)嘗試將那些由位于檢查點(diǎn)隊(duì)列頭部的條目所標(biāo)識(shí)的臟數(shù)據(jù)項(xiàng)寫入永久性存儲(chǔ)器。然而,如在下文更詳細(xì)描述的那樣,在多個(gè)節(jié)點(diǎn)的緩存區(qū)中有可能存在同一數(shù)據(jù)項(xiàng)的多個(gè)臟數(shù)據(jù)版本,這時(shí),協(xié)調(diào)臟數(shù)據(jù)項(xiàng)的寫入尤為重要。
      經(jīng)由共享的永久性存儲(chǔ)器的數(shù)據(jù)項(xiàng)轉(zhuǎn)移在多個(gè)系統(tǒng)同時(shí)修改數(shù)據(jù)項(xiàng)時(shí),需要一種機(jī)制來協(xié)調(diào)已修改數(shù)據(jù)項(xiàng)關(guān)于穩(wěn)定的共享永久性存儲(chǔ)器寫入。在某些系統(tǒng)中使用了穩(wěn)定的共享永久性存儲(chǔ)器作為介質(zhì),以便將經(jīng)過修改的數(shù)據(jù)項(xiàng)從一個(gè)節(jié)點(diǎn)轉(zhuǎn)移到另一個(gè)節(jié)點(diǎn),由此簡化這個(gè)問題。當(dāng)節(jié)點(diǎn)中一個(gè)臟數(shù)據(jù)項(xiàng)需要在一個(gè)不同節(jié)點(diǎn)加以修改的時(shí)候,在將頁面鎖授予這個(gè)希望修改臟數(shù)據(jù)項(xiàng)的節(jié)點(diǎn)之前,數(shù)據(jù)項(xiàng)首先寫入到共享的永久存儲(chǔ)器中。當(dāng)一個(gè)不同節(jié)點(diǎn)需要讀取所修改數(shù)據(jù)項(xiàng)的當(dāng)前版本時(shí),相同的寫入永久性存儲(chǔ)器和讀取永久性存儲(chǔ)器的序列將會(huì)得到使用。
      經(jīng)由互連的數(shù)據(jù)項(xiàng)轉(zhuǎn)移在使用非易失存儲(chǔ)器作為介質(zhì),由此在節(jié)點(diǎn)之間轉(zhuǎn)移數(shù)據(jù)項(xiàng)的系統(tǒng)中,沒有必要協(xié)調(diào)不同節(jié)點(diǎn)之間的臟數(shù)據(jù)項(xiàng)寫入。每個(gè)節(jié)點(diǎn)可以使用常規(guī)機(jī)制來寫出臟數(shù)據(jù)項(xiàng)及執(zhí)行檢查點(diǎn)。
      在某些系統(tǒng)中,當(dāng)請(qǐng)求節(jié)點(diǎn)僅僅需要所修改數(shù)據(jù)項(xiàng)的一個(gè)一致性快照版本時(shí),經(jīng)過修改的數(shù)據(jù)項(xiàng)將會(huì)發(fā)送到請(qǐng)求節(jié)點(diǎn),而不會(huì)將該數(shù)據(jù)項(xiàng)寫入永久性存儲(chǔ)器。因此,通過這種一致性控制機(jī)制,盡管不同節(jié)點(diǎn)中的多個(gè)事務(wù)可以在提交事務(wù)之前使用行級(jí)鎖來修改同一數(shù)據(jù)項(xiàng),但是任何數(shù)據(jù)庫的數(shù)據(jù)項(xiàng)都只在一個(gè)節(jié)點(diǎn)緩存區(qū)中是臟的。因此,在節(jié)點(diǎn)出現(xiàn)故障時(shí),只需要從節(jié)點(diǎn)的檢驗(yàn)點(diǎn)記錄開始掃描該節(jié)點(diǎn)的重做日志,一直掃描到其重做日志末端,由此即可恢復(fù)數(shù)據(jù)庫。此外,當(dāng)多個(gè)節(jié)點(diǎn)發(fā)生故障時(shí),可以掃描每個(gè)節(jié)點(diǎn)的重做日志并且按序應(yīng)用這些重做日志,由此恢復(fù)數(shù)據(jù)庫,也就是說,不需要合并來源于多個(gè)重做日志的改變。
      然而,為了提高從一個(gè)具有排他鎖并且有可能修改了數(shù)據(jù)項(xiàng)的節(jié)點(diǎn)向一個(gè)請(qǐng)求相同數(shù)據(jù)項(xiàng)以供排他使用或是請(qǐng)求現(xiàn)有版本以供讀取的節(jié)點(diǎn)進(jìn)行數(shù)據(jù)項(xiàng)轉(zhuǎn)移的等待時(shí)間,較為理想的是把數(shù)據(jù)項(xiàng)從一個(gè)節(jié)點(diǎn)的主存儲(chǔ)器直接轉(zhuǎn)移到另一個(gè)節(jié)點(diǎn)的主存儲(chǔ)器,而不先將數(shù)據(jù)項(xiàng)寫入永久性存儲(chǔ)器。當(dāng)把臟數(shù)據(jù)項(xiàng)從一個(gè)節(jié)點(diǎn)轉(zhuǎn)移到另一個(gè)節(jié)點(diǎn)時(shí),稱為過去鏡像(past image)(PI)的數(shù)據(jù)項(xiàng)的一個(gè)拷貝既可保留在發(fā)送節(jié)點(diǎn)中,也可以不在發(fā)送節(jié)點(diǎn)中保留。
      當(dāng)節(jié)點(diǎn)準(zhǔn)許轉(zhuǎn)移臟數(shù)據(jù)項(xiàng)而不需要將其存入永久存儲(chǔ)器時(shí),必須在不同節(jié)點(diǎn)之間對(duì)臟數(shù)據(jù)項(xiàng)的寫入進(jìn)行協(xié)調(diào)。如果沒有進(jìn)行協(xié)調(diào),則轉(zhuǎn)移了臟數(shù)據(jù)項(xiàng)的節(jié)點(diǎn)可能希望通過把臟數(shù)據(jù)項(xiàng)寫入永久存儲(chǔ)器來使其檢查點(diǎn)提前。然而,如果其他某些節(jié)點(diǎn)已經(jīng)將數(shù)據(jù)項(xiàng)的更新版本寫入了永久存儲(chǔ)器,則將臟數(shù)據(jù)項(xiàng)寫入永久存儲(chǔ)器有可能會(huì)破壞數(shù)據(jù)完整性。
      此外,除非把臟數(shù)據(jù)項(xiàng)寫入磁盤,否則檢查點(diǎn)不能提前。如果一個(gè)節(jié)點(diǎn)并未保持那些由該節(jié)點(diǎn)發(fā)送到其他節(jié)點(diǎn)的數(shù)據(jù)項(xiàng)的臟數(shù)據(jù)版本,則這個(gè)節(jié)點(diǎn)必須以某種方式來與另一個(gè)節(jié)點(diǎn)協(xié)調(diào)寫入操作。
      此外,對(duì)于一個(gè)可擴(kuò)縮的系統(tǒng)來說,由系統(tǒng)執(zhí)行的寫入磁盤操作的數(shù)目不應(yīng)該是系統(tǒng)節(jié)點(diǎn)數(shù)目的一個(gè)函數(shù)。相反,寫入磁盤操作的數(shù)目應(yīng)該只反映了對(duì)系統(tǒng)內(nèi)部數(shù)據(jù)項(xiàng)的實(shí)際改變。
      基于上文,較為理想的是提供那些對(duì)系統(tǒng)中的臟數(shù)據(jù)項(xiàng)寫入進(jìn)行協(xié)調(diào)的技術(shù)方法,在這些系統(tǒng)中,同一數(shù)據(jù)項(xiàng)的臟數(shù)據(jù)版本有可能位于一個(gè)以上的易失存儲(chǔ)器之中。

      發(fā)明內(nèi)容
      由此提供了用于管理一個(gè)系統(tǒng)中的緩存區(qū)的技術(shù)方法,該系統(tǒng)具有多個(gè)緩存區(qū),這些緩存區(qū)可以包含同一數(shù)據(jù)項(xiàng)的不同拷貝。具體的說,提供了技術(shù)方法,用于協(xié)調(diào)在這種數(shù)據(jù)項(xiàng)上執(zhí)行的磁盤寫入操作,由此確保數(shù)據(jù)項(xiàng)的舊版本不會(huì)改寫新版本,并且減少故障之后進(jìn)行恢復(fù)所需要的處理量。并且提供了各種方法,其中使用了一個(gè)主管(master)來與多個(gè)緩存區(qū)器進(jìn)行協(xié)調(diào),以便將數(shù)據(jù)項(xiàng)寫入永久性存儲(chǔ)器。這種方法包括但不局限于直接寫入方法、間接寫入方法、基于擁有者的方法以及基于角色的方法。此外還提供了技術(shù)方法來管理那些與緩存區(qū)相關(guān)聯(lián)的檢查點(diǎn),其中使用檢查點(diǎn)來確定發(fā)生故障時(shí)開始處理恢復(fù)日志的位置。


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