一種具有前向恢復(fù)特征的后向恢復(fù)容錯方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及分布式系統(tǒng)基于消息重排序消息日志故障恢復(fù)方法。
【背景技術(shù)】
[0002] 在分布式系統(tǒng)后向恢復(fù)容錯研究領(lǐng)域,按保存信息的類型,回卷恢復(fù)協(xié)議可分為 基于檢查點的回卷恢復(fù)協(xié)議和基于消息日志的回卷恢復(fù)協(xié)議?;谙⑷罩净鼐砘謴?fù)的協(xié) 議又細(xì)分為悲觀消息日志和樂觀消息日志。
[0003] 采用悲觀消息日志[1]的系統(tǒng)中,進(jìn)程接收消息后總是先將其保存至消息日志 中,然后才提交給應(yīng)用程序處理。此特征確保進(jìn)程所接收消息及其接收次序完整保存在消 息日志文件,使得進(jìn)程的故障恢復(fù)較為簡單;但是由于接收消息后須先保存消息信息至消 息日志因此嚴(yán)重影響了系統(tǒng)正常運行時的性能。按由何進(jìn)程保存消息信息至消息日志分, 悲觀消息日志協(xié)議分為基于發(fā)送者的消息日志協(xié)議(sender-based) [2] [3] [4]和基于接 收者的消息日志協(xié)議(receiver-based)。
[0004] 在基于接收者的消息日志協(xié)議中,進(jìn)程接收消息后首先把消息的接收次序等信息 存入消息日志,然后再提交此消息給應(yīng)用程序處理。
[0005] 在基于發(fā)送者的消息日志協(xié)議[2] [3] [4]中,消息的發(fā)送進(jìn)程發(fā)送一個消息前首 先把消息內(nèi)容保存在內(nèi)存緩沖區(qū)中,然后發(fā)送此消息至接收進(jìn)程。接收進(jìn)程接收消息后先 把該消息的接收次序傳送給消息的發(fā)送進(jìn)程,然后再提交消息至應(yīng)用進(jìn)程。消息的發(fā)送進(jìn) 程接收到消息的接收次序后把消息的內(nèi)容及其接收次序統(tǒng)一存入消息日志。
[0006] 采用樂觀消息日志[1]的系統(tǒng)中,進(jìn)程接收消息后即刻提交給應(yīng)用程序處理,而 后在進(jìn)程空閑時才保存所接收消息至消息日志。此特征使得系統(tǒng)進(jìn)程在正常運行時具有良 好的性能;然而發(fā)生故障時,若存在進(jìn)程已接收且未保存至消息日志的消息,此類消息的接 收次序必然丟失,使得進(jìn)程的故障恢復(fù)極為復(fù)雜。
[0007] 基于消息重排序和消息數(shù)目檢驗的日志恢復(fù)協(xié)議[5] [6],采用消息重排序方法, 較好解決了樂觀日志中由于進(jìn)程故障所導(dǎo)致的消息接收次序丟失問題。該協(xié)議下的發(fā)送進(jìn) 程在發(fā)送消息時以邏輯時鐘間接標(biāo)記此消息的接收次序并將消息及其邏輯時鐘保存在發(fā) 送進(jìn)程本地存儲中。接收進(jìn)程接收消息后,首先把消息提交給應(yīng)用程序處理,然后在進(jìn)程 空閑時間把消息及其接收次序保存至消息日志。當(dāng)消息接收進(jìn)程發(fā)生故障時,恢復(fù)進(jìn)程首 先從消息日志取得已保存的消息及其邏輯時鐘,然后根據(jù)發(fā)送進(jìn)程和接收進(jìn)程所保存消息 數(shù)目的差值從發(fā)送進(jìn)程的本地存儲中取得因進(jìn)程故障未能保存至消息日志的消息及其邏 輯時鐘。然后根據(jù)消息的邏輯時鐘對消息重新排序,并實現(xiàn)消息的重演。此協(xié)議下的進(jìn)程 在正常執(zhí)行時,接收到消息后即刻提交給應(yīng)用程序處理,僅僅在進(jìn)程空閑時間保存消息信 息至消息日志。上述特征使得此恢復(fù)協(xié)議實質(zhì)上仍屬于樂觀消息日志協(xié)議;在此協(xié)議下進(jìn) 程正常執(zhí)行時具有良好性能,且在某個進(jìn)程發(fā)生故障時其恢復(fù)算法較為簡單。
[0008] 消息重排序和消息數(shù)目檢驗的日志恢復(fù)協(xié)議的主要缺點是在程序正常運行時,進(jìn) 程接收到消息后仍需在進(jìn)程空閑時間把消息保存至消息日志。然而該協(xié)議下發(fā)送進(jìn)程發(fā) 送消息前已把消息的內(nèi)容及其邏輯時鐘值保存至本地存儲,接收進(jìn)程端的消息日志是冗余 的,故該協(xié)議算法還可進(jìn)一步優(yōu)化。
[0009] 修改后的重排序恢復(fù)協(xié)議[7]仍然基于重排序基本理論進(jìn)行算法設(shè)計,但對恢 復(fù)協(xié)議作了較大修改,主要是去除了消息接收進(jìn)程端的消息日志。在此協(xié)議中,消息發(fā)送 進(jìn)程發(fā)送消息前先保存消息的內(nèi)容及其邏輯時鐘至消息日志,消息接收進(jìn)程接收消息后, 即刻提交應(yīng)用程序處理,且此后不再保存任何消息信息。與基于發(fā)送者的消息日志協(xié)議 (sender-based) [2] [3] [4]相比較,修改后的重排序恢復(fù)協(xié)議中的接收進(jìn)程接收消息后無 需轉(zhuǎn)送消息接收次序至發(fā)送進(jìn)程,從而使得進(jìn)程正常執(zhí)行時具有良好的性能且確保在進(jìn)程 故障恢復(fù)階段系統(tǒng)不存在任何孤兒進(jìn)程。
[0010] 修改后的重排序恢復(fù)協(xié)議[7]徹底擺脫了悲觀、樂觀協(xié)議的束縛,形成了一種同 時具備悲觀和樂觀協(xié)議優(yōu)點的全新容錯恢復(fù)協(xié)議。此協(xié)議具有以下主要特點:
[0011] 1)進(jìn)程發(fā)送消息前一次性保存消息的內(nèi)容及指示消息接受次序的邏輯時鐘至消 息日志,然后發(fā)送消息至接收進(jìn)程。此特點使得該協(xié)議具有悲觀消息日志協(xié)議特征,即任一 時刻系統(tǒng)不存在孤兒進(jìn)程。
[0012] 2)進(jìn)程接收消息后不保存任何消息信息,因而該協(xié)議下的進(jìn)程在正常執(zhí)行時較樂 觀日志協(xié)議下的進(jìn)程具有更優(yōu)良的性能。此特點使得該協(xié)議完全不同于悲觀和樂觀協(xié)議, 且其系統(tǒng)在正常執(zhí)行時的性能優(yōu)于樂觀協(xié)議。
[0013] 3)某進(jìn)程發(fā)生故障時,無故障進(jìn)程有條件繼續(xù)執(zhí)行;因而在進(jìn)程故障恢復(fù)階段, 重排序恢復(fù)協(xié)議下的進(jìn)程較悲觀日志協(xié)議下的進(jìn)程具有更優(yōu)良的故障恢復(fù)性能。
[0014] 4)任何進(jìn)程可在任意時刻獨立保存其進(jìn)程狀態(tài)(檢查點)。
[0015] 修改后的重排序恢復(fù)協(xié)議的上述特點使得其各項性能指標(biāo)均優(yōu)于現(xiàn)有的所有消 息日志協(xié)議。然而該協(xié)議僅僅給出了無故障進(jìn)程運行的條件(限制一個故障進(jìn)程向另一個 故障進(jìn)程發(fā)送消息等條件),卻沒有給出無故障進(jìn)程有條件執(zhí)行的具體實現(xiàn)方法,故限制了 協(xié)議的應(yīng)用。
[0016] 本發(fā)明的目的及所能達(dá)到的效果:
[0017] 完善重排序恢復(fù)協(xié)議,提出一種便于以程序設(shè)計員語言實現(xiàn)的基于重排序理論的 后向恢復(fù)容錯方法。該方法具有類似修改后的重排序恢復(fù)協(xié)議[7]的基本特征,并具有如 下獨特之處:1、對無故障進(jìn)程故障狀態(tài)下條件運行的理論和方法進(jìn)一步完善,2、增加進(jìn)程 故障標(biāo)志位,并通過故障位控制無故障進(jìn)程在系統(tǒng)故障恢復(fù)階段有條件運行。
[0018] 消息重排序基本原理
[0019] 在分段確定(PWD)假設(shè)下,進(jìn)程的消息接收事件具有隨機性,即消息的接收在時 間和次序上具有不確定性,但是消息的發(fā)送事件確是確定事件。
[0020] 如圖1所示,假設(shè)分布式系統(tǒng)由進(jìn)程p、q和r組成。其中,δρ,。、δ。。和δ^分別 表示P、q和r的初始狀態(tài)間隔;δq,2分別表示進(jìn)程q接收消息&和…后的狀態(tài)間 隔;tpq和tq分別表示進(jìn)程p和q之間以及q和r之間的通信信道延時。在樂觀消息日志 協(xié)議下,若進(jìn)程q在將消息叫和m2的必要信息保存至日志文件之前于"X"處發(fā)生故障。進(jìn) 程q發(fā)生故障后,進(jìn)程P、q和r必須重新啟動以重新發(fā)送和接收叫和m2。顯然,進(jìn)程q重 放(replay)消息的次序應(yīng)為叫、!!!;;,然而由于信道延時tpq和tq不是固定常數(shù),若tpq>trq貝1J 進(jìn)程q接收消息的次序可能變?yōu)閙2、mi。圖1的實例說明,盡管樂觀消息日志協(xié)議要求故障 進(jìn)程在重演時準(zhǔn)確發(fā)送、接收未保存至日志文件的消息,但在某些情況下(例,進(jìn)程信道延 時變化,系統(tǒng)中的進(jìn)程重新啟動時間參差不齊等)實際進(jìn)程收發(fā)消息的次序可能與故障前 不一致。然而每次重復(fù)執(zhí)行,系統(tǒng)的最終結(jié)果應(yīng)該是一致的,這說明在PWD假設(shè)下系統(tǒng)的執(zhí) 行結(jié)果與某些消息的接收次序無關(guān)。
[0021] 總是在先發(fā)生關(guān)系(alwayshappenbefore)關(guān)系:
[0022] 假設(shè)進(jìn)程的信道為FIFO可靠信道,edPe,分別表示消息mJPm,的發(fā)送或接收事 件。如果在系統(tǒng)任何一次執(zhí)行中ei的發(fā)生總是先于e]的發(fā)生而與信道的延時、cpu的速度
[0023] 在圖2中,ROV、R(m2)、R(m3)和R(m4)分別表示消息m!、m2、m3和m4的接收事件, SOi^SOi^SO^)和S(m4)分別表示消息叫為馬和m4的發(fā)送事件。在分段確定(PWD)假
ROiO總是在先發(fā)生于R(m3)表明R(m3)邏輯上依賴于R(mi),R(m3)和R(mi)之間的關(guān)系 是一種邏輯依賴關(guān)系與系統(tǒng)的其他因素?zé)o關(guān)。由于消息的接收事件是確定性事件,因此
[0024] 圖2中由于叫和~的發(fā)送經(jīng)過不同的信道延時到達(dá)進(jìn)程q,因此R(m3)不一定 總是在先發(fā)生于R(m4)。若事件ei的發(fā)生不一定總是先于事件e,的發(fā)生,而是與信道
因此進(jìn)程q實際的消息接收序列為ml、m3、m4或ml、m4、m3。
[0025] 消息等效序列定理:
[0026] 假設(shè)S是進(jìn)程p的一消息序列,S'是一將S中的消息重新排列后形成的新序列。 S'中的元素滿足:1、所有存在于S中的消息在S'中仍然存在;2、若某些消息的接收事件在 S中具有總是在先發(fā)生關(guān)系,則這種關(guān)系在S'中仍然保持。在進(jìn)程信道FIFO和可靠信道假 設(shè)下,S和S'在進(jìn)程p重放過程中是等效序列(進(jìn)程分別接收兩個序列后所完成的計算相 同)。
[0027] 證明:在定理假設(shè)條件下,盡管S中的某些消息在S'中進(jìn)行了重新排序,但是這 些消息間的總是在先發(fā)生關(guān)系在S'中維持不變;因此S'中消息的接收次序是進(jìn)程重演 (replay)中可能出現(xiàn)的實際次序。若S和S'在進(jìn)程p重放過程中不是等效序列,則S中的 消息接收事件在進(jìn)程P的執(zhí)行與S'中的消息接收事件在進(jìn)程p的執(zhí)行不等效,即同一個進(jìn) 程的每次執(zhí)行是不一致的,這與進(jìn)程執(zhí)行的一致性屬性相矛盾。
[0028] 例在圖2中,ml、m3和m4與ml、m4和m3是等效序列,即進(jìn)程p重演(replay)ml、 m3和m4與重演ml、m4和m3后進(jìn)程所完成的計算是相同的。
[0029] 改善的邏輯時鐘:
[0030] 進(jìn)程p改善的邏輯時鐘LCp是一個整型變量,用于對消息的發(fā)送事件和接收事件 計數(shù)。LCp滿足:
[0031] 1、其初值是零;
[0032] 2、每發(fā)送一個消息,LCp加一;
[0033]3、每接收到進(jìn)程q-個消息,LCp-max(LCp+1,LCq+Ι),其中LCp和LCq分別表示 進(jìn)程P
[0034] 和q的邏輯時鐘,max表示取LCp+1和LCq+1中的最大值。
[0035] 如圖3所示,p發(fā)送叫后LCp= 1,發(fā)送1114后LCp= 2。q接收且保存心