專利名稱:基于消息重排序和消息數(shù)目檢驗消息日志恢復方法
技術領域:
本發(fā)明涉及分布式系統(tǒng),尤其涉及ー種基于消息重排序和消息數(shù)目檢驗消息日志恢復方法。
背景技術:
基于消息日志的恢復協(xié)議依賴于分段確定性假設(PWD)。根據(jù)這ー假設,一個進程的執(zhí)行分為若干個狀態(tài)間隔(state interval),每個狀態(tài)間隔以ー個不確定事件的執(zhí)行作為此間隔的開始,后接若干個確定事件的執(zhí)行。根據(jù)PWD假設,消息接收事件是不確定性事件,而消息發(fā)送事件和進程的內部事件是確定性事件;因此,ー個狀態(tài)間隔往往是以ー個消息的接收事件的執(zhí)行作為狀態(tài)間隔的開始,后接若干個進程內部事件和消息發(fā)送事件的執(zhí)行。 若某個進程的狀態(tài)間隔依賴于ー個不確定性事件(例,消息接收事件)且此事件在恢復進程中不能被重新生成,則此進程被稱之為孤兒進程。在分段確定性假設(PWD)下,若進程P接收消息Hii后發(fā)送消息nij.至進程q,則進程q接收nij.后的狀態(tài)間隔依賴于進程P接收^后的狀態(tài)間隔。若進程P在發(fā)送消息后未將所接收消息Hii的必要信息保存至日志文件隨之P發(fā)生故障,則Hli的接收事件在恢復進程中是不可恢復的;依賴于P進程的Hli接收事件的進程q成為孤兒進程。所有日志恢復協(xié)議要求系統(tǒng)回滾(rollback)恢復時系統(tǒng)的全局狀態(tài)不能包含任何孤兒進程。傳統(tǒng)的悲觀和樂觀消息日志故障恢復協(xié)議不得不在兩個相互沖突的目標之間做出平衡或者進程之保存消息必要信息至日志文件與進程間的通信異步地進行,以提高進程無故障時的性能,此種情況下可能存在孤兒進程;或者在進程無故障運行時保存所有必須的信息以便在發(fā)生故障時快速恢復故障進程,此種情況下不存在孤兒進程。ー個消息的必要信息可表示為ー個四元組<m. source, m. ssn, m. dest, m. rsn>,其中m. source表示消息m的發(fā)送進程標識,m. ssn表示消息m的發(fā)送次序,m. dest表示消息m的接收進程標識,m. rsn表示消息m的接收次序。目前在分布式系統(tǒng)中主要存在兩種消息日志協(xié)議,樂觀消息和悲觀消息日志協(xié)議。樂觀消息日志,進程之保存消息必要信息至日志文件與進程間的通信是異步的,系統(tǒng)中可能存在孤兒進程。在此類協(xié)議中,任ー進程P保存已接收消息Hii的必要信息(<m.source, m. ssn, m. dest, m. rsn>)至日志文件之前允許發(fā)送消息Hij至其它進程q。當進程p發(fā)生故障吋,由于已接收消息Hli的必要信息可能未保存至日志文件且P可能已發(fā)送消息Hlj至q,因此進程q可能成為孤兒進程。樂觀日志協(xié)議下,由于進程無需維持消息必要信息保存至日志文件與進程間通信的同步性,因此進程在無故障運行時具有良好的性能;但在故障恢復時需要復雜的恢復計劃,以消除孤兒進程。悲觀消息日志,消息的保存與發(fā)送是同步的,只有所有已提交的消息的必要信息(<m. source, m. ssn, m. dest, m. rsn 寫入堅固存儲器之后才允許進程發(fā)送消息。在故障恢復時,由于悲觀消息日志必定不會出現(xiàn)孤兒進程,因此故障進程只需重新處理先前處理過且已保存的消息,從而實現(xiàn)進程狀態(tài)的恢復。然而,進程無故障運行時由于需保持消息必要信息的保存與發(fā)送的同步,由此必然大大降低了系統(tǒng)無故障運行時的性能。在樂觀消息日志協(xié)議中,由于消息的必要信息<m. source, m. ssn, m. dest, >在進程發(fā)生故障時可能未能保存至日志文件,傳統(tǒng)的消息協(xié)議下消息的接收次序m. rsn是不可恢復的,因而系統(tǒng)的進程不得不回退以重新發(fā)送和接收這些未保存消息。樂觀消息日志中由于消息保存至日志文件和進程通信的異步性因而可能導致消息接收進程中消息接收次序丟失。與現(xiàn)有消息日志恢復方法比較不同消息日志恢復協(xié)議具有不同的性能評價指標,可使用以下五個指標去評價ー個恢復協(xié)議的性能1、N. ckpt,每個進程所需檢查點數(shù)。2、INFOR. add, 一個應用消息所攜帶的額外信息量。3、SYS.num,恢復每個故障進程所需交換的系統(tǒng)消息數(shù)量。4、DIS.rol,進程的回退距離。5, N. roll,恢復期間需回退的進程數(shù)量。為簡單起見以MNCMR表示本申請所提出的基于消息數(shù)目校驗和消息重排序的消息日志恢復協(xié)議。在MNCMR協(xié)議中,每個進程僅需異步地保存一個檢查點,所以N. ckpt is等于I。每個應用消息所攜帯的數(shù)據(jù)是j和LC^所以INFOR. add是2。對于每次故障所需交換的信息量SYS. num為2n+2w;其中η是系統(tǒng)中進程的總數(shù),w是由于故障未能保存至消息日志文件的消息數(shù)量。當ー個或多個進程發(fā)生故障時,只有故障進程回退,無故障進程繼續(xù) 執(zhí)行,因此MNCMR協(xié)議相比其他協(xié)議具有最小的DIS. ro進程回退距離值?;謴推陂gMNCMR協(xié)議需回退的進程數(shù)量N. roll等于發(fā)生故障進程的總數(shù),此指標與悲觀協(xié)議的指標相同。此外MNCMR協(xié)議同時具備了悲觀和樂觀協(xié)議的優(yōu)點在進程無故障執(zhí)行時,像樂觀協(xié)議那樣每個進程保存消息至日志文件與進程通信異步進行,因此進程在無故障運行時具有良好的性能;在進程故障恢復階段,其恢復算法簡單,因此具備了悲觀協(xié)議其恢復算法簡單的優(yōu)點。再者,與現(xiàn)有協(xié)議比較進程發(fā)生故障時MNCMR協(xié)議中的無故障進程不是回退或停止等待,而是繼續(xù)執(zhí)行,此特征類似于前向恢復算法使得系統(tǒng)中的進程具有較高的運行效率。自上世紀八十年代以來,大量的消息日志恢復協(xié)議發(fā)表于國內外期刊雜志中,以下選擇幾種典型協(xié)議與MNCMR協(xié)議進行比較。Sistla和Welch [I]提出了兩個基于消息樂觀日志恢復協(xié)議,一個協(xié)議中的發(fā)送消息攜帯了傳遞依賴向量(以Prasad. I表示此協(xié)議),另ー個協(xié)議所發(fā)送的應用消息僅攜帶發(fā)送進程當前的狀態(tài)間隔值(以Prasad. 2表示此協(xié)議)。Prasad. I協(xié)議中姆個應用消息所需額外信息量為ο (η),對于姆個故障需要交換ο (η2)的系統(tǒng)消息。Prasad. 2協(xié)議中姆個應用消息所需額外信息量為O(I),對于姆個故障需要交換o(n3)的系統(tǒng)消息。在Strom和Yemini [2]的樂觀消息日志協(xié)議中,每個發(fā)送的應用消息攜帯一個傳遞依賴向量,此向量具有η個分量,η為系統(tǒng)所具有的進程數(shù)量。在進程無故障執(zhí)行時,每個進程需定期廣播這個傳遞依賴向量或者把此向量附加在發(fā)送的消息中。表I給出了 MNCMR協(xié)議與上述協(xié)議的比較結果,由此不難看出MNCMR協(xié)議在各項指標中均優(yōu)于其他協(xié)議。
表 I
權利要求
1.一種基于消息重排序和消息數(shù)目檢驗消息日志恢復方法,其特征是,采用消息重排序方法,把消息的接收次序保存在發(fā)送進程中;當消息接收進程發(fā)生故障時,在恢復進程控制下首先從發(fā)送進程獲取已保存和未保存至日志文件的消息及消息的發(fā)送進程對應邏輯時鐘,然后根據(jù)消息的邏輯時鐘對未保存至日志文件的消息重新排序;最后把排序后的消息重新發(fā)送至故障進程,故障進程重新接收消息、處理消息,從而實現(xiàn)消息的重演,該方法的需要的普通進程工作步驟如下 步驟I、對于Y k, k為整數(shù)變量,初始化Uik = O以及Tik為O,分別表示進程Pi發(fā)送到進程Pk的消息總數(shù)為O以及進程Pk接收到進程Pi的消息總數(shù)為O,同時令Isn=O ; 步驟2、若定時時間到,則轉入3 ;否則轉入4 ; 步驟3、將進程Pi的狀態(tài)保存至決定因子文件mlog中,保存Ti, Ui, LCk(k=l,2…η)至本地本地存儲中,刪除舊的檢查點; 步驟4、若進程Pi將要向進程h(j=l,2··· η)發(fā)送消息,則轉入5 ;否則轉入9 ; 步驟5、若Fi為1,表示進程Pi出現(xiàn)故障且尚未恢復,此時轉入9 ;否則進程Pi正常運行,轉入6 ; 步驟6、gFj為1,表示進程?」出現(xiàn)故障且尚未恢復,則等待一直到Fj為O為止;否則表示進程h正常運行,此時轉入7 ; 步驟7、因進程Pi將要向進程P」發(fā)送消息,LCi的值增加1,Uij的值增加1,將〈LA,j,m>添加到消息日志文件dfile中; 步驟8.將Uij的值保存到本地存儲中,并向進程P」發(fā)送消息AM(i,LCi, m); 步驟9.若進程Pi接收到進程P」發(fā)送的消息,則轉入10 ;否則轉入14 ; 步驟10、進程Pi接收到進程P」發(fā)送的消息AM(j,LCj, m),需要判斷這個消息是由進程Pj發(fā)送的還是進程h的恢復進程發(fā)送的; 步驟11、若AM. LCj > LCj,則表示此消息是由進程P」在無故障運行時發(fā)送的,因此轉入12 ;否則此消息由進程&的恢復進程發(fā)送,轉入14 ; 步驟12、用AM. LCj的值更新LCj ;將接收到的消息交給應用進程處理,并將<j,LCj, i,lsn>記錄保存到內存中;因為接受到消息,LCi的值加1,并用LCi與Lq的最大值更新LCi ;步驟13、執(zhí)行其他確定性事件; 步驟14、判定進程Pi是否空閑,若進程Pi空閑則轉入15 ;否則轉入16 ; 步驟15、利用空閑時間,將內存中保存的記錄〈j,LCy i, lsn>保存到mlog中;因為接收到消息,所以Tu值加I ;將Ti, LCk(k=l, 2···η)的值保存到硬盤中,Isn的值加I ; 步驟16、若收到進程pk (k=l, 2…η)的錯誤標志清零消息sys_clearF (k),則轉入17 ;否則轉入18 ; 步驟17、將O值賦給Fk,表明此時進程pk正常運行; 步驟18、若接收到進程pk(k=l, 2…η)的錯誤標志置I的消息sys_SetF (k),則轉入19 ;否則轉入20 ; 步驟19、將I值賦給Fk,此時表明進程pk出現(xiàn)故障且尚未恢復; 步驟20、進程Pi是否為故障后重啟?若進程Pi為故障后重啟則轉入21,否則轉入I ;步驟21、用預先保存的Ti, Ui以及LCk(k=l,2···η)的值更新Ti, Ui以及LCk(k=l,2···η)的值,并令Isn=O, Fi = I ;轉入I。
2.如權利要求I所述的一種基于消息重排序和消息數(shù)目檢驗消息日志恢復方法,其特征是,當普通進程遇到故障時進入恢復進程,其中恢復進程包含三個階段 階段一 從消息日志文件dfile按其發(fā)送順序取得已保存消息并存于內存儲器;Recoverya)首先通過過程調用RequestDeterminant (i, lsn)取得三元組〈j, LCj, lsn>,然后通過過程調用GetM(LCj)取得〈j, LCj,m>,其中m表示消息的內容;最后Recovery(i)把三元組<j, LCj, lsn>保存在本地內存數(shù)組ARRAY中; 階段二 從消息日志文件dfile取得由于進程故障而未能保存至mlog的消息并存于內存儲器; Recovery (i)首先通過遠程過程調用取得Tu和Ri ;TU記錄了進程Pi接收于進程Pj且已保存在mlog中的消息數(shù)目,Uji記錄了進程Pj發(fā)送至進程Pi的消息數(shù)目;根據(jù)Uji和Tij的含義,Uji和Tij的差值Uji — Tij表示了進程Pj發(fā)送至Pi且由于Pi故障未能保存至mlog的消息數(shù)目;然后,Pi調用位于Pj本地的進程遠程過程調用GeUnLogM(i,Uji-Tij)根據(jù)差值取得最先接收的消息Recovery (i)通過反復調用GeUnLogM(i, Uji-Tij),取得所有由于進程故障而未能保存至mlog的消息并存于本地內存數(shù)組ARRAY中; 階段三對于所有由于進程故障而未能保存至mlog的消息,Recovery (i)按邏輯時鐘重新排序;最后將所有已保存和未保存至mlog的消息重新發(fā)送至Pi進程,Pi進程重新接收處理這些消息直到運行至故障前的時間點為止。
3.如權利要求2所述的一種基于消息重排序和消息數(shù)目檢驗消息日志恢復方法,其特征是,恢復進程的階段三的邏輯時鐘的具體描述如下 進程P的邏輯時鐘LCp是一個整型變量,用于對消息的發(fā)送事件和接收事件計數(shù);LCP滿足 1)其初值是零; 2)每發(fā)送一個消息,LCp加一; 3)每接收進程q—個消息并將此消息的必要信息存入日志文件后,LCp加一,然后LCp — max (LCp, LCq+1),其中LCq表示進程q的邏輯時鐘,max表示取LCp和LCq+1中的最大值。
4.如權利要求2所述的一種基于消息重排序和消息數(shù)目檢驗消息日志恢復方法,其特征是,恢復進程的具體工作步驟如下 步驟I、從最近的檢查點重啟Pi,并將標記進程Pi處于故障狀態(tài)的SyS_SetF(i)的消息發(fā)送給各個進程,將Isn與NUM的值設置為O ; 步驟2、判斷決定因子文件mlog是否為空;若mlog不為空則轉入3 ;否則轉入6 ; 步驟3、通過調用RequestDetermiant(i,Isn)從決定因子文件mlog中獲得決定因子記錄〈LC」,j, lsn> ;將LCj的值賦給LC,Isn值加I ;利用遠程調用GetM(LC)獲得消息〈LC」,j,m>,此消息在消息日志文件dfile中由LCj唯一標識; 步驟4、判斷消息〈LCp j, lsn>是否為空;若消息〈LCp j, lsn>為空則轉入2,否則轉入5 ; 步驟5、將接收到的消息〈LC」,j,I sn>保存到內存的ARRAY數(shù)組中;即ARRAY [NUM].LCj=LCj, ARRAY [NUM] · j = j, ARRAY [NUM] · lsn = lsn ;將 NUM 的值加 1,轉到 2 判斷 mlog 是否為空; 步驟6、將進程Pi發(fā)送且保存在mlog文件中的消息總數(shù)NUM的值保存到NUM’中;步驟7、對于Vj盧,j=l,2…n,通過遠程調用GetU(i,j)獲得進程Pj發(fā)送給進程Pi的消息總數(shù); 步驟8、遠程調用GetT (i)獲得進程Pi所接收其他各個進程的消息數(shù)目; 步驟9、對于、i-1」_=1,2···η,判斷是否存在UpTu ;SupTu,表明進程h發(fā)送給進程?1的消息數(shù)大于進程Pi所接收進程h的消息數(shù),此時轉入10 ;否則轉入13 ; 步驟10、因為UjiXTij,所以存在中途消息;通過遠程調用GetUnlogM(j,Uji-Tij)消息并將獲得的消息記錄在〈LC」,j, m>中; 步驟11、判斷獲得的消息〈LCp j, m>是否為空;若〈LCp j,m>消息為空則轉入9,否則轉入12 ; 步驟12、將獲得的消息存入ARRAY數(shù)組中;因接收到消息,所以Tu值加1,消息數(shù)NUM值加I ;執(zhí)行完后轉入9,繼續(xù)判斷是否存在為存入日志文件的消息; 步驟13、按照ARRAY[k]. Lq的升序排列數(shù)組ARRAY,其中k從NUMlIj NUM-I ;即將進程Pi接收到的其他進程所發(fā)送的消息按照消息的Lq的升序值進行排序;步驟 14、向進程Pi 發(fā)送消息 AM (ARRAY [k]. j, ARRAY [k]. LCj, ARRAY [k] · m),其中 k=0,I...(NUM-I); 步驟15、向其他各個進程pk(k=l,2…n,k古i)發(fā)送標記進程Pi已恢復正常運行的消息sys_clearF(i);恢復進程結束。
5.如權利要求4所述的一種基于消息重排序和消息數(shù)目檢驗消息日志恢復方法,其特征是,恢復進程的步驟10中 GeUnLogM(I1Uji-Tij)的處理流程如下 (O以只讀方式打開dfile文件; (2)移動指針P使其指向最先存入的記錄,dfile是順序文件,最后存入的記錄位于文件的末尾; (3)判斷指針P是否指向了文件的末尾,若未達到文件末尾,轉入(5),否則轉入(10); (5)讀取P所指記錄,存入三元組〈LC」,I,m> ; (6)判斷進程標識I是否等于i;若I等于i轉(7),否則轉(4);(7)difference 變量減一,(Iifferenc=Uji-Tij ; (8)判斷difference是否為O;若difference為O,表明在步驟(5)所記錄為Pj最先發(fā)送至Pi的記錄,將此記錄發(fā)送至Recovery (i)進程,轉向(11);若difference不為O,轉向⑷; (9)移動指針P,使其指向下一個記錄;轉向(3); (10)關閉文件,返回無效三元組<NULL,NULL〈NULL>,轉向(11)結束; (11)結束。
全文摘要
本發(fā)明公開了一種基于消息重排序和消息數(shù)目檢驗消息日志恢復方法。本發(fā)明采用消息重排序方法,發(fā)送進程在發(fā)送消息時以改善的邏輯時鐘間接標記此消息的接收次序并將此次序保存在發(fā)送進程本地存儲中。當消息接收進程發(fā)生故障時,在恢復進程控制下首先從發(fā)送進程獲取已保存和未保存至日志文件的消息及消息的邏輯時鐘,然后根據(jù)消息的邏輯時鐘對未保存至日志文件的消息重新排序。最后把排序后的消息重新發(fā)送至故障進程,故障進程重新接收消息、處理消息,從而實現(xiàn)消息的重演。從而既改善了系統(tǒng)進程在無故障時的運行性能又簡化了進程發(fā)生故障時的恢復算法。
文檔編號G06F11/34GK102841840SQ201210239710
公開日2012年12月26日 申請日期2012年7月11日 優(yōu)先權日2012年7月11日
發(fā)明者高勝法, 蔡靜, 馮振 申請人:山東大學