相關申請的交叉引用
本申請要求序列號為第62/065,941號美國申請的2014年10月20日優(yōu)先權日期的權益,該申請的內容通過引用合并于此。
背景技術:
本說明書涉及在存在計算不確定性情況下的恢復和容錯。
由于各種原因,計算系統(tǒng)有時會故障。當這樣的系統(tǒng)故障時,數(shù)據(jù)可能會丟失。最好采取措施來防止或至少最小化這種數(shù)據(jù)丟失。
這些措施的示例包括數(shù)據(jù)庫中的acid(原子性、一致性、直到提交的隔離性、提交時的持久性)事務。這些已知的措施是非常有魯棒性的。它們可以滿足非常高的正確性標準,同時也是容錯的。
然而,所有的這種魯棒性都是有代價的。用于防止故障的已知方法具有高延遲時間,并且有時會導致很長時間裝置不可用。因此,對于大容量的事務來說,這些方法不太適合。
另外,一些已知方法需要確定性計算。在確定性計算中,執(zhí)行任務的順序是固定的,并且計算的結果在每次執(zhí)行時保持不變。不清楚這些已知方法如何適應于有效處理非確定性計算環(huán)境。
當計算裝置包括彼此協(xié)作的多個處理節(jié)點時,產生額外的復雜性。在這種裝置中,裝置的一個節(jié)點可能故障,而其它節(jié)點可以繼續(xù)工作。當故障的節(jié)點恢復時,這不能保證該故障節(jié)點本身已經恢復到其它節(jié)點期望其所處狀態(tài)的狀態(tài)。
技術實現(xiàn)要素:
在一個方案中,本發(fā)明特征在于一種用于提升包括至少一個處理節(jié)點的計算系統(tǒng)中容錯和恢復的方法。這種方法包括:提升第一處理節(jié)點的可用性和恢復,其中提升可用性和恢復包括,在第一處理節(jié)點處,在所述節(jié)點處執(zhí)行派生器,其中所述派生器在執(zhí)行過程中產生第一派生進程,其中執(zhí)行所述派生器包括向所述派生器分配第一代指示符(generationindicator),其中所述第一派生進程繼承所述第一代指示符;開始檢查點間隔,在該檢查點間隔結束時,可用于恢復所述節(jié)點的節(jié)點恢復信息被提交到持久性存儲裝置,其中開始所述檢查點間隔包括使得所述派生器暫停產生派生進程,向所述派生器分配與所述第一代指示符不同的第二代指示符,繼續(xù)執(zhí)行所述派生器,從而使得所述派生器產生第二派生進程,其中所述第二派生進程繼承所述第二代指示符,以及控制所述第二派生進程寫入存儲器的程度;以及在提交所述節(jié)點恢復信息之后,釋放對所述第二派生進程可寫入存儲器的所述程度的控制。
在一些實踐中,控制所述第二派生進程寫入存儲器的程度包括阻止所述第二派生進程完成對所述存儲器的寫入。在這些實踐中,還包括在提交恢復信息之后,允許第二個派生進程將寫入排隊到存儲器,用于其最終完成。
在其它實踐中,控制第二派生進程寫入存儲器的程度包括確定所述寫入操作是可交換操作,并且允許完成所述可交換操作。在這些實踐中,確定所述寫入操作是可交換操作包括確定所述寫入操作包括增加變量,并且確定所述寫入操作是可交換操作包括確定所述寫入操作包括在指定位置插入記錄。
在本發(fā)明的實踐中,還包括在暫停所述派生器之后設置截止期限,從而為具有所述第一任務代指示符的任何派生進程提供時間來執(zhí)行完成,并且避免與不得不保存具有所述第一代指示符的所述派生進程的狀態(tài)相關聯(lián)的開銷。在這些實踐中,還包括如果所述第一派生進程在所述截止期限之前仍然執(zhí)行,則暫停所述第一派生進程,還包括使所述第一派生進程能夠避免由于在所述截止期限之前未能完成執(zhí)行而暫停,例如如果所述第一派生進程在所述截止期限前仍在執(zhí)行,則在所述第一派生進程中將所述第一任務代指示符改變?yōu)樗龅诙蝿沾甘痉?/p>
在第一節(jié)點具有節(jié)點代指示符,本發(fā)明的額外實踐包括使得派生進程成為遷移到第二節(jié)點的遷移進程,其中所述第二節(jié)點具有節(jié)點代指示符。在這些實踐中,所述第二節(jié)點的所述節(jié)點代計數(shù)指示所述第二節(jié)點處于比所述第一節(jié)點更年輕的一代中,在這種情況下,所述方法還包括使所述遷移進程年輕化,要么移入側年輕化所述遷移進程,要么移出側年輕化所述遷移進程。
在一些情形下,所述第一節(jié)點是多節(jié)點系統(tǒng)中的節(jié)點,其中每個節(jié)點均具有節(jié)點代計數(shù),并且所述多節(jié)點系統(tǒng)包括至少一個第二節(jié)點。這些情形下,本發(fā)明中具有一些實踐,在所述第二節(jié)點的故障恢復之后,所述第一節(jié)點向后滾動到對應于所述第二節(jié)點的節(jié)點代計數(shù)的狀態(tài)。
在其它情形下,其中所述第一節(jié)點是多節(jié)點系統(tǒng)中的節(jié)點,其中每個節(jié)點均具有節(jié)點代計數(shù),并且所述多節(jié)點系統(tǒng)包括至少一個第二節(jié)點。這些情形下,本發(fā)明中具有一些實踐,在所述第一節(jié)點的故障恢復之后,所述第一節(jié)點通過從檢查點恢復提交的工作并從日志恢復未提交的工作,向前滾動到與所述第二節(jié)點的節(jié)點代計數(shù)相對應的狀態(tài)。
在這些情形下,所述第一節(jié)點是多節(jié)點系統(tǒng)中的節(jié)點,其中每個節(jié)點均具有節(jié)點代計數(shù),本發(fā)明的實踐包括第一節(jié)點實施一些動作的實踐。這些包括從主節(jié)點接收指示將要執(zhí)行檢查點的消息,作為響應,年輕化所述第一節(jié)點的節(jié)點代計數(shù),使得派生器暫停產生派生進程,保存派生器恢復信息,以恢復派生器狀態(tài),繼續(xù)執(zhí)行所述派生器,確定在所述第一節(jié)點處不再期待有其它較老一代的移入,并且響應于所述確定,向所述持久性存儲裝置提交所述節(jié)點恢復信息。在這些實踐中,還包括設定截止期限,并且在所述截止期限過去之后,暫停仍然在執(zhí)行的所有較老一代的派生進程,同時較年輕一代的派生進程繼續(xù)執(zhí)行。
在一些情形下,所述第一節(jié)點是多節(jié)點系統(tǒng)中的節(jié)點。在這種情形下,本發(fā)明的替代實踐包括在所述第二節(jié)點處保存所述第一節(jié)點的工作存儲器的副本,當所述第一節(jié)點故障時,暫時地使用所述副本用于本來將由所述第一節(jié)點執(zhí)行的處理,并且在所述第一節(jié)點恢復時,向所述第一節(jié)點傳送更新所述第一節(jié)點中的存儲器所需的信息,以便可以由所述第一節(jié)點執(zhí)行后續(xù)計算。
在另一個方案中,本發(fā)明特征是一種以非暫態(tài)形式存儲在計算機可讀存儲介質上的軟件,當執(zhí)行時,提升包括至少一個處理節(jié)點的計算系統(tǒng)中的容錯和恢復。所述軟件包括用于使計算系統(tǒng)執(zhí)行下述步驟的指令:提升第一處理節(jié)點的可用性和恢復,其中提升可用性和恢復包括,在第一處理節(jié)點處,在所述節(jié)點處執(zhí)行派生器,其中所述派生器在執(zhí)行過程中產生第一派生進程,其中執(zhí)行所述派生器包括向所述派生器分配第一代指示符,其中所述第一派生進程繼承所述第一代指示符;開始檢查點間隔,在該檢查點間隔結束時,可用于恢復所述節(jié)點的節(jié)點恢復信息被提交到持久性存儲裝置,其中開始所述檢查點間隔包括使得所述派生器暫停產生派生進程,向所述派生器分配與所述第一代指示符不同的第二代指示符,繼續(xù)執(zhí)行所述派生器,從而使得所述派生器產生第二派生進程,其中所述第二派生進程繼承所述第二代指示符,以及控制所述第二派生進程寫入存儲器的程度;以及在提交所述節(jié)點恢復信息之后,釋放對所述第二派生進程可寫入存儲器的所述程度的控制。
在又一種方案中,本發(fā)明特征是一種數(shù)據(jù)存儲系統(tǒng),包括持久性存儲裝置;以及一個或多個處理節(jié)點,包括被配置為提升第一處理節(jié)點的容錯和恢復,其中提升可用性和恢復包括,在第一處理節(jié)點處,在所述節(jié)點處執(zhí)行派生器,其中所述派生器在執(zhí)行過程中產生第一派生進程,其中執(zhí)行所述派生器包括向所述派生器分配第一代指示符,其中所述第一派生進程繼承所述第一代指示符;開始檢查點間隔,在該檢查點間隔結束時,可用于恢復所述節(jié)點的節(jié)點恢復信息被提交到持久性存儲裝置,其中開始所述檢查點間隔包括使得所述派生器暫停產生派生進程,向所述派生器分配與所述第一代指示符不同的第二代指示符,繼續(xù)執(zhí)行所述派生器,從而使得所述派生器產生第二派生進程,其中所述第二派生進程繼承所述第二代指示符,以及控制所述第二派生進程寫入存儲器的程度;以及在提交所述節(jié)點恢復信息之后,釋放對所述第二派生進程可寫入存儲器的所述程度的控制。
方案可以具有以下一個或多個優(yōu)點。
本文描述的用于提升容錯和恢復的技術使得計算系統(tǒng)能夠保持高可用性。通過戰(zhàn)略性地放松某些acid約束,計算系統(tǒng)仍然可以提供可恢復性,但是無需更多極端措施的高開銷。因此,有更多的計算資源可用于有用的工作。此外,通過控制派生進程(例如,操作系統(tǒng)進程或線程)寫入存儲器的程度,仍然可以在檢查點間隔期間實現(xiàn)有用的工作,同時確保保持容錯機制的完整性。因此,這些技術在發(fā)生故障的情況下和正常的無故障運行期間都能增強計算系統(tǒng)的內部功能。
附圖說明
圖1示出在存在計算不確定性的情況下用于實施我們的容錯和恢復的單節(jié)點計算裝置;
圖2示出在圖1的節(jié)點操作期間遇到的檢查點間隔和工作間隔;
圖3示出在圖2的檢查點間隔期間允許將派生運行到完成的方法;
圖4示出派生器進程可以在圖2的檢查點間隔期間繼續(xù)產生派生進程的方法;
圖5示出一種方法,其中在檢查點間隔期間派生進程可以通過將寫入排隊到存儲器來繼續(xù)工作;
圖6示出了多節(jié)點計算裝置;
圖7示出了來自圖7的裝置的節(jié)點中共存的兩代;
圖8示出了響應于檢查點消息由從屬節(jié)點執(zhí)行的方法步驟;
圖9示出了涉及增加遷移代計數(shù)的方法步驟;
圖10示出了故障后用于恢復的方法步驟;
圖11示出了在另一個節(jié)點處維護的副本,以使得能夠更快速地恢復;
圖12示出了使用圖11所示的副本,用于快速恢復的過程;以及
圖13示出了關于圖9所示的多節(jié)點,執(zhí)行圖5所示方法的示例。
具體實施方式
圖1示出一種數(shù)據(jù)處理系統(tǒng)的示例,其中可以在存在計算不確定性情形下使用用于容錯和恢復的技術。數(shù)據(jù)處理系統(tǒng)包括單節(jié)點計算裝置8,其具有包括工作存儲器12的節(jié)點10。在該節(jié)點10上運行的進程14使用該工作存儲器12,來保存它們相應的進程狀態(tài)并且存儲它們相應計算的中間結果。在不同的實施例中,進程14可以被實現(xiàn)為在節(jié)點10上運行的操作系統(tǒng)內的多種計算資源中的任何一個。例如,進程14可以被實現(xiàn)為具有它們自己的地址空間的操作系統(tǒng)“進程”,或者實現(xiàn)為具有它們自己的執(zhí)行上下文(例如,階段、寄存器等)的操作系統(tǒng)“線程”,或者實現(xiàn)為一些其它類型的“任務”,該“任務”包括要執(zhí)行的一系列操作、但不一定具有專用于它的特定操作系統(tǒng)進程或線程。
由于工作存儲器12通常是易失性的,所以將其狀態(tài)周期性地保存在存儲在持久性存儲裝置16中的檢查點文件18中是明智的。在節(jié)點10的操作中斷的情況下,這些檢查點文件18可以用于恢復狀態(tài)信息。
在節(jié)點上運行的進程14中的有些進程是派生器(spawner)20。“派生器”是一種類型的進程,其屬性之一為具有產生一個或多個其它進程的能力。由派生器產生的進程在本文中被稱為“派生進程(spawn)”(以單數(shù)和復數(shù)形式)。由動詞“派生(tospawn)”的適當變形來指稱產生這種派生進程的動作。圖1示出已經產生派生進程22a、22b的派生器20。派生器20通常是一個長生存期的進程,而派生進程22a、22b雖然有很多,但生存期往往要短得多。在某些情況下,派生器是一個比該派生器派生的派生進程生存期更長的進程。派生進程22a、22b也相互獨立和異步,使得派生進程22a、22b已經完成其計算的程度與派生器20起初產生派生進程22a、22b的時間無關。結果是,派生進程22a、22b執(zhí)行計算的順序是不確定的。由于執(zhí)行計算的順序通常會影響結果,所以這使計算整體不確定。
計算裝置8在其操作過程中與外界通信。例如,計算裝置8可以接收一個或多個傳入消息流24并且產生一個或多個傳出消息流28。如下面將更詳細描述的,這些消息24、28由裝置8臨時存儲在持久性存儲裝置16內。這些消息24、28可以臨時存儲在物理和/或邏輯上分開的相應區(qū)域內,由其托管(escrow)。傳入消息24可以存儲在持久性存儲裝置16中的傳入消息托管區(qū)域26中,并且傳出消息28可以存儲在持久性存儲裝置16中的傳出消息托管區(qū)域30中。
參考圖2,由檢查點間隔32和工作間隔34來標記節(jié)點的操作。在工作間隔34期間,節(jié)點執(zhí)行有用的工作,同時進程向完成推進。在檢查點間隔32期間,節(jié)點10暫停所有進程,對它們進行序列化,并且將結果保存到持久性存儲裝置16中。然后,節(jié)點10將工作存儲器中的任何其它內容保存到持久性存儲裝置16中。此時,檢查點被認為是已經被“提交”了,進程14被認為是已經“經過檢查點”了。
優(yōu)選地,檢查點間隔32比工作間隔34短得多。本文所述的裝置和方法旨在通過減小檢查點間隔32的長度來增加可在工作間隔34中執(zhí)行的處理量。
一旦提交了檢查點,則節(jié)點10就允許進程14繼續(xù)并且釋放傳出消息托管區(qū)域30中的傳出消息28。
將傳出消息28存儲在傳出消息托管區(qū)域30中而不是立即發(fā)送它們是有用的,用于防止可能由于節(jié)點10的故障而導致的不一致。例如,進程14很可能發(fā)送傳出消息28,來通知一些計算結果。如果在該消息28已被發(fā)送之后但是在計算結果被提交給持久性存儲裝置16之前,節(jié)點10故障,則節(jié)點10將重新啟動并且重新執(zhí)行未提交的計算。一旦完成,將發(fā)送另一消息28,來通知該第二次計算的結果。如果兩個結果不同(在非確定性計算的情況下是可能的),則其中一個消息將是無效的。
作為具體的示例,考慮進程14基于隨機數(shù)發(fā)生器的結果向客戶授予獎勵的情況。如果不存在傳出消息托管區(qū)域30,則進程14將向第一個客戶發(fā)送消息28,宣布獎勵即將到來。然后,節(jié)點10崩潰并重新啟動。由于進程14的狀態(tài)從未被保存,所以沒有該客戶被授予任何獎勵的記錄,或者沒有進程14已成功完成執(zhí)行的記錄。然后節(jié)點10可以重新執(zhí)行進程14,進而進程14將產生不同的隨機數(shù),從而導致第二消息28被發(fā)送給另一個客戶,宣布獎勵即將到來。這將需要要么頒發(fā)兩個獎勵而其中只有一個是本打算頒發(fā)的,要么應對至少一個失望的客戶。
為了在故障之后進行恢復,節(jié)點10從持久性存儲裝置16檢索所有進程14的狀態(tài)和工作存儲器12的狀態(tài)。然后,它重傳存儲在傳出消息托管區(qū)域30中的任何傳出消息28,檢索傳入消息托管區(qū)域16中的傳入消息用于處理,然后繼續(xù)對實時數(shù)據(jù)的正常操作。
傳出消息托管區(qū)域30中所有消息28的重傳可能導致接收者接收相同重復的消息。在一個實施例中,接收者被配置為忽略重復消息28。在另一實施例中,當恢復時,接收者和恢復的節(jié)點10通信,以識別已經接收到的消息28。這允許節(jié)點10避免發(fā)送相同重復的消息28。
上述過程結果導致了冗長的檢查點間隔32,其進而可以導致在接收到傳入消息與產生對應傳出消息之間的低吞吐量或增加的延遲時間??梢允褂酶鞣N方法來減少此延遲時間、和/或增加吞吐量。
第一種優(yōu)化方法的特征是在后臺維護日志(journal)36。每當工作存儲器12中的項目被改變時,對應的條目將被寫入日志36,使得日志條目可以用于在恢復時間再現(xiàn)所述改變。日志36可以被異步地轉移到持久性存儲裝置16。在檢查點間隔32期間,節(jié)點10將確保所有日志條目確實已經變得持久。然后可以通過使用包含工作存儲器12的快照的舊檢查點文件18并且應用如日志36所示的更改來實現(xiàn)恢復。
該優(yōu)化減少了檢查點間隔32的長度,但是其以增加恢復時間為代價。特別地,從獲得工作存儲器12的上一張完整圖像經過的時間越長,日志36中的條目數(shù)將越多。這將增加恢復時間。
第二優(yōu)化方法依賴于以下事實:節(jié)點10僅具有幾個派生器進程20,每個派生器進程20產生(或“派生”)多個短生存期進程,本文以單數(shù)和復數(shù)形式表示為“派生進程22a、22b”。
派生進程22a、22b的生存期是隨機的,但其預期值遠遠短于派生器20生存期的預期值。因此,在檢查點期間花費時間來對派生進程22a、22b進行序列化幾乎沒有意義。事實上,在一些情況下,序列化派生進程22a、22b所需的時間是派生進程預期生存期的很大一部分。因此,通常有利的是暫停派生器20,從而防止產生新的派生進程,并且然后允許現(xiàn)有派生進程22a、22b自然地終止。
為了節(jié)省時間,如圖3所示,檢查點產生方法包括暫停派生器20(步驟38)并將其序列化(步驟40)。然而,現(xiàn)有派生進程22a繼續(xù)執(zhí)行(步驟42)。然后,在落后者的截止期限(落后者的截止期限被選擇為限定足夠長的空閑時間間隔,其足夠長以允許大多數(shù)派生進程22a完成執(zhí)行但是不會太長來明顯地影響延遲時間)之后(步驟46),暫停(步驟48)并序列化(步驟50)仍然在執(zhí)行的派生進程(被稱為“落后派生進程”)。
因此,前述方法通過減少需要序列化的進程14的數(shù)量,來減小檢查點間隔32的長度。它通過允許被期望快速終止的進程22快速終止來實現(xiàn)上述目的,從而消除了序列化這些進程22作為創(chuàng)建有效檢查點的一部分的需要。
由于認識到所要避免的缺陷實際上是在檢查點間隔32期間對工作存儲器12的改變,因此出現(xiàn)了第三優(yōu)化過程。因此,如果進程14實際上不必寫入工作存儲器12,而是只需要讀取工作存儲器12,那么暫停它就沒有意義了。
為了實現(xiàn)該第三優(yōu)化過程,節(jié)點10依賴于與每個進程相關聯(lián)的代計數(shù)(generationcount)。由于派生器20是一種進程,所以它具有代計數(shù)。由于派生器的派生進程22a、22b也是進程,所以它們也具有代計數(shù)。派生進程22a和派生該派生進程22a的派生器20的代計數(shù)是相關的。特別地,派生進程22a、22b的代計數(shù)等于派生它的派生器20的代計數(shù)。由動詞“繼承(toinherit)”的適當形式來描述引起派生進程22a、22b的代計數(shù)與派生它的派生器的代計數(shù)相關聯(lián)(或由其導出)的動作。當具有特定代計數(shù)的派生器20產生派生進程22a、22b時,可以說派生進程22a、22b已經繼承了派生器的代計數(shù)。
在操作中,在檢查點間隔32開始之前,派生器20已經產生較老一代的派生進程22a。在檢查點間隔32開始時,派生器20被“年輕化”。
動詞“年輕化(toyouthen)”及其變形和同義詞描述了可以在整數(shù)上執(zhí)行的特定計算操作。如本文所使用的,對其進行年輕化運算的特定整數(shù)是代計數(shù)。描述了可以在代計數(shù)上執(zhí)行的操作。
在本文所描述的特定示例中,使派生器20年輕化的動作指增加其代計數(shù)的動作。在年輕化之后,派生器20則繼續(xù)在檢查點間隔32期間產生派生進程,僅僅現(xiàn)在,它產生較年輕一代的派生進程22b。這樣做的結果是在節(jié)點10內共存兩種派生進程22:在派生器20年輕化之前產生的較老一代的派生進程22a、以及在派生器20年輕化之后產生的較年輕一代的派生進程22b。
參考圖4,在檢查點間隔開始時,派生器20被暫停(步驟52),使得它在暫停時不產生任何新的派生進程,并且其處理狀態(tài)被保存(步驟54)。然后派生器20使得其代計數(shù)增加(步驟56),此后,派生器20繼續(xù)(即,不暫停)。在繼續(xù)之后,派生器20能夠再次產生派生進程22,不過這一次,它的所有派生進程22b都將在較年輕一代的派生進程中。
嘗試寫入工作存儲器12的任何較年輕一代的派生進程22b被阻止,直到檢查點間隔32完成。因此,較年輕一代的派生進程22不能運行到完成。它們只能運行直到第一次實際寫入工作存儲器12的時刻。然而,較年輕一代的派生進程22可以至少在中途完成。這允許甚至在檢查點間隔32期間發(fā)生一些處理。
通常,在檢查點間隔32期間,存儲裝置12中的所有進程14將被序列化。然而,在圖4的優(yōu)化方法中,僅序列化較老一代的派生進程22a是有利的。
代計數(shù)使得節(jié)點10能夠識別哪個派生進程是較年輕一代的派生進程22b,并且因此避免保存其狀態(tài)。
遺憾的是,不得不等待較老一代派生進程22a完成處理,這往往會增加延遲時間,因為年輕一代的派生進程22b不能進行全通徑,直到所有的較老一代派生進程22a都完成,或者直到較老一代派生進程22a的落后者暫停所觸發(fā)落后者截止期限。
在第二優(yōu)化方法的變型中,代替阻止嘗試修改工作存儲器12的較年輕一代派生進程22b,并且因此失去繼續(xù)進行有用工作的機會,節(jié)點10可以用世代號(generationnumber)來標記工作存儲器12中的每個數(shù)據(jù)項。如果較年輕一代的派生進程22b修改了一個存儲器位置,而不是阻止直到檢查點之后,則節(jié)點10將通過更新其世代號來年輕化存儲器位置。那么,如果較老一代的派生進程22a試圖讀或寫這種年輕化的存儲器位置,那么較老一代的派生進程22a會通過暫停自己、將其狀態(tài)寫到檢查點、更新它的世代號、繼續(xù)執(zhí)行年輕化狀態(tài),從而來自發(fā)地年輕化它自身。節(jié)點10還使用世代號來標記寫入日志的條目,使得其可以將對應于較老一代派生進程的日志條目與對應于較年輕一代派生進程的日志條目區(qū)分開。
第四種優(yōu)化方法依賴于允許較年輕一代派生進程22b即使在第一次嘗試寫入工作存儲器12之后也繼續(xù)處理的想法。該方法依賴于以下事實:有時,將計算結果寫入工作存儲器12的順序不重要。如果是這種情況,則可以稍后對工作存儲器12的寫入簡單地排隊。此方法也允許即使在第一次嘗試寫入工作存儲器12之后,較年輕一代的派生進程22b在檢查點間隔32期間也繼續(xù)工作。
通常,每當執(zhí)行一系列操作時,出現(xiàn)的問題是序列中的操作順序是否會使序列的結果有差異。如果操作在序列內的位置不影響結果,則該序列內的操作被稱為“可交換的”。否則,操作是“不可交換的”??山粨Q操作的示例是增加或減少一值的指令、將記錄插入到列表中某個限定位置的指令、以及通常地不需要讀取待執(zhí)行的值的任何操作。第四優(yōu)化方法利用這些可交換的操作。
現(xiàn)在參考圖5,在第四優(yōu)化方法中,在通常不允許較年輕一代的派生進程22b寫入存儲器12時,節(jié)點10從較年輕一代的派生進程22b接收寫入請求(步驟60)。然而,在該方法中,節(jié)點10區(qū)分可交換操作和不可交換操作(步驟62)。如果所提出的寫入是可交換的,則節(jié)點10將其排隊(步驟64)。然后較年輕一代的派生進程22b繼續(xù)執(zhí)行(步驟66)。這允許較年輕一代的派生進程22b在其第一次嘗試寫入工作存儲器12之后繼續(xù)處理。其結果是,只要較年輕一代的派生進程22b實施的任何寫入操作是可交換的,則該較年輕一代的派生進程22b在檢查點間隔32期間繼續(xù)執(zhí)行。另一方面,如果提出的寫入是不可交換的寫入,則節(jié)點10暫停執(zhí)行較年輕一代的派生進程22b(步驟68)。
除了不可交換的寫入,還有其它條件可以允許派生進程22b在本來通常不能寫入的條件下寫入。另一個示例出現(xiàn)在較年輕一代派生進程22b檢查存儲器12之后認識到較老一代派生進程22a不可能進行進一步的存儲器訪問時。
第五優(yōu)化方法是減少延遲時間,該延遲時間的出現(xiàn)原因是由于傳出消息托管區(qū)域30直到檢查點間隔32完成并且與產生傳出消息28相關聯(lián)的所有計算已被提交到持久性存儲裝置16才釋放傳出消息28。在發(fā)送錯誤消息的后果嚴重的情況下,在從傳出消息托管區(qū)域30釋放消息28之前,等待直到檢查點間隔32結束的想法是有用的。然而,有時發(fā)送錯誤消息的影響是最小的,但是發(fā)送延遲消息的后果是嚴重的。
作為示例,考慮傳出消息28是特定零售商店中商品優(yōu)惠券的情況。假設裝置已經檢測到用戶在特定時刻處于該特定零售店附近。顯然,在用戶有機會離開零售商店之前,期望立即傳送消息28。如果這個消息28在等待發(fā)送的傳出消息托管區(qū)域30上滯留,那么就會丟失優(yōu)惠券有用的機會。另一方面,如果該優(yōu)惠券是由于節(jié)點10的故障而隨后丟失的計算的結果,那么任何人都不可能抱怨。畢竟,要不商店可能會進行它本不該進行的銷售,而且用戶可能已經獲得了商品的一些折扣。
第五優(yōu)化方法,其在不等待將底層數(shù)據(jù)提交到持久性存儲裝置16的情況下釋放傳出消息28,預先假定傳送傳出消息28的時間是重要的,并且與其延遲傳送的不良后果相比,錯誤的或不一致的傳出消息28的成本是最小的。在第五優(yōu)化方法中,在檢查點間隔32結束之前從傳出消息托管區(qū)域30釋放傳出消息28或者完全地繞開傳出消息托管區(qū)域30。
圖6示出多節(jié)點裝置70,其中結合圖1-圖6描述的類型的多個節(jié)點72、74、76、78彼此通信并且彼此協(xié)作進行數(shù)據(jù)處理。在這種情況下,任務可以將消息從第一節(jié)點72發(fā)送到第二節(jié)點74。
在某些情況下,消息可以具有將任務從第一節(jié)點72遷移到第二節(jié)點74的效果。從一個節(jié)點遷移到另一個節(jié)點的任務被稱為“遷移(migrant)”任務。取決于不同視角,遷移任務是“移入(immigrant)”任務或“移出(emigrant)”任務。從第一節(jié)點72的視角來看,因為任務將要離開第一個節(jié)點,所以遷移任務是“移出”任務。相反地,從第二節(jié)點74的視角來看,因為任務將要到達第二節(jié)點74,所以遷移任務是“移入”任務。
在其它情況下,消息可能是遠程過程調用或遠程數(shù)據(jù)訪問請求,使得請求任務在接收到返回消息之前不能繼續(xù)。在其它情況下,任務可以使用該消息簡單地將信息從第一節(jié)點72異步地發(fā)送到第二節(jié)點74。例如,可以使用本文描述的用于提升容錯和恢復的技術來配置諸如在2015年9月2日提交的、發(fā)明名稱為“executinggraph-basedprogramspecifications(執(zhí)行基于圖形的程序規(guī)范)”的序列號為14/842,956的美國專利申請中描述的計算系統(tǒng),該申請通過引用合并于此。
在這種情況下,上述方法的應用將不太理想,部分是因為直到在下一個檢查點間隔32結束時將消息80從托管中釋放時,才能將消息80從第一節(jié)點72發(fā)送到第二節(jié)點76。這導致了相當長的延遲時間。雖然可以通過對于多節(jié)點裝置70中的節(jié)點到節(jié)點發(fā)送的消息免除托管來潛在地減少這種延遲時間,但是由于不確定性,這樣的免除是不夠的。
例如,當存在多個節(jié)點72、74、76、78時,因為許多計算是非確定性的,所以會出現(xiàn)這樣和那樣的困難。這種不確定性計算的示例包括:結果取決于發(fā)生讀取和寫入的順序的示例,依賴于實時時鐘的示例,以及依賴于隨機數(shù)發(fā)生器的結果的示例,這些示例已經在上文中結合傳出消息托管區(qū)域30的有利性進行了描述。
如果第一節(jié)點72與第二節(jié)點74通信,然后在下一個檢查點間隔32之前失去聯(lián)系(例如由于故障),則裝置70可能由于這種不確定性而以不一致性告終,如下所述。在故障之后,裝置70將從最近的檢查點恢復第一節(jié)點72并且重新開始計算。在將消息從第一節(jié)點72傳輸?shù)降诙?jié)點74之前,可以從計算的點重新開始計算。由于計算的非確定性特性,在從檢查點恢復之后,第一節(jié)點72很大程度上可能發(fā)送完全不同的消息到第二節(jié)點74。但是,該第二節(jié)點74可能已經接收到原始消息,這潛在地將兩個節(jié)點72和74置于不一致的狀態(tài)中。例如,節(jié)點72處于已經向節(jié)點74發(fā)送“新”版本消息的狀態(tài),但是節(jié)點74處于已經對“舊”版本消息進行動作的狀態(tài)。此外,節(jié)點74還可能基于從節(jié)點72接收到的原始消息,已向另一節(jié)點76發(fā)送消息,因此節(jié)點72和節(jié)點76也可能處于不一致的狀態(tài)。因此,不一致性可以像病毒一樣傳播到裝置70中的所有節(jié)點。
避免上述困難的一種方法是確保所有節(jié)點72、74、76、78對它們的檢查點同步,例如使用“屏障同步”操作,如下所述?!皺z查點領導者”向所有節(jié)點發(fā)送消息,命令它們開始檢查點間隔。然后,在每個檢查點完成之后,每個節(jié)點回復檢查點領導者,確認檢查點完成。當檢查點領導者已經從所有節(jié)點接收到確認時,它將命令所有節(jié)點提交檢查點,然后繼續(xù)處理。
這種方法形成了多節(jié)點檢查點問題的解決方案的基礎,但并沒有完全解決問題,原因有兩個。首先,在多節(jié)點裝置中,某些節(jié)點可能在故障中幸存,在這種情況下,幸存的節(jié)點必須從它們的當前狀態(tài)向后滾動到檢查點狀態(tài)(而不是向前滾動到檢查點狀態(tài))。其次,當執(zhí)行檢查點時,可能有在傳輸中的消息,這可能允許非確定性從舊處理間隔、經過檢查點、并且泄漏到新的處理間隔。
在單節(jié)點裝置中,如果節(jié)點10發(fā)生故障,則它只需要向前滾動以恢復未提交的工作。但是在多節(jié)點裝置70中,在節(jié)點78故障時,未發(fā)生故障的其它節(jié)點72、74、76可能需要向后滾動。分布式裝置70通過使一些節(jié)點78向前滾動并且其它節(jié)點72、74、76向后滾動來恢復的這種機制意味著,實際上可以使所有節(jié)點72、74、76、78在相同檢查點處重新開始。因此,所得到的裝置70實現(xiàn)了所有節(jié)點的同時檢查點的效果。然而,它并不是通過嘗試在所有節(jié)點上實際地同步操作來實現(xiàn)的,如上所述這是困難的。相反,它通過操縱節(jié)點72、74、76、78的狀態(tài)來獲得同步檢查點的優(yōu)點,而不必實際地提供這樣的檢查點。
為了實現(xiàn)上述恢復方法,節(jié)點72、74、76、78執(zhí)行分布式檢查點方法,如下詳細描述的。參考圖7,當實現(xiàn)分布式檢查點方法時,每個進程和每個消息獲取代計數(shù)82。另外,維護與每個檢查點相關聯(lián)的任務的運行計數(shù)84。每個節(jié)點還維護其派生器20的派生器-注冊表86。另外,每個節(jié)點72維護節(jié)點代計數(shù)88。
節(jié)點代計數(shù)88使得節(jié)點76能夠執(zhí)行代間隙(generationgap),在代間隙中由較年輕一代派生進程22a執(zhí)行的工作與由較老一代派生進程22b執(zhí)行的工作彼此不會相互干擾。作為代間隙的結果,較老一代和較年輕一代可能或多或少地忽視彼此。實際上,節(jié)點76變成兩個虛擬機,一個被較老一代的派生進程22a看到,另一個被較年輕一代的派生進程22b看到。這兩個虛擬機共存在相同的物理平臺上,但是彼此正交。
此外,每個節(jié)點76還實現(xiàn)雙向日志90,其使得節(jié)點76根據(jù)需要向前或向后滾動到特定狀態(tài)。雙向日志90包括對工作存儲裝置92的更改、檢查點任務狀態(tài)的列表94和檢查點消息96。這些元素提供了一種及時向前滾動的方式。此外,雙向日志90以存儲器12中的撤銷日志98為特征,以使得節(jié)點76能夠及時地向后滾動。一般來說,及時向前滾動是故障節(jié)點恢復的方式。及時向后滾動是當裝置70中的一個節(jié)點發(fā)生故障時另一個節(jié)點所做的動作。
在操作中,如圖6所示,主節(jié)點72向所有其它節(jié)點74、76、78(即“從屬節(jié)點”)發(fā)送檢查點消息100,指示檢查點的到來。然而,不要求該檢查點在所有節(jié)點72、74、76、78中同時發(fā)生。
圖8示出了在存在計算不確定性的情況下示例性容錯和恢復過程的流程圖。響應于接收到檢查點消息(步驟102),從屬節(jié)點76將不會立即開始檢查點間隔。如上所述,這是不切實際的。相反,從屬節(jié)點76增加其節(jié)點代計數(shù)88(步驟104),并創(chuàng)建日志條目,指示其節(jié)點代計數(shù)88增加(步驟106)。
然后,從屬節(jié)點76暫停其所有的派生器20(步驟108),并將它們的狀態(tài)寫入雙向日志90(步驟110)。然后,對于其每個派生器20,從屬節(jié)點76增加該派生器的代計數(shù)82(步驟112)。隨著其代計數(shù)82增加,允許派生器20繼續(xù)操作(步驟114)。然而,由于派生器的代計數(shù)82已經增加,所以任何得到的派生進程22b將處于較年輕的一代。
在這一點上,兩代將共存于從屬節(jié)點76中。較老一代的派生進程22a,即代計數(shù)比該節(jié)點的代計數(shù)少一代的那些派生進程,可以繼續(xù)處理至完成,必要時向存儲器12寫入。較年輕一代的派生進程22b,即代計數(shù)符合節(jié)點代計數(shù)88的那些派生進程,可能會處理到寫入存儲器12為止。此時,較年輕一代的派生進程22b被阻止。
應該指出的是,在至此的描述中,只涉及兩代派生進程:較老一代的派生進程22a(其代計數(shù)82比節(jié)點代計數(shù)88少一代),以及較年輕一代的派生進程22b(其代計數(shù)82匹配節(jié)點代計數(shù)88)。然而,原則上沒有理由在同一平臺上不能共存多于兩代。
參考圖9,在多節(jié)點裝置70中,任務79可以從發(fā)送節(jié)點78移出并移入到接收節(jié)點76。如結合圖6所示,這樣的任務79被稱為“遷移任務”或“遷移”。
在下面的討論中,有必要引用與特定對象相關聯(lián)的值。為了避免附圖中的附圖標記發(fā)生歧義,并且以與標準數(shù)學符號一致的方式,括號將用于表示“的”。因此,由于“88”已被分配給“節(jié)點代計數(shù)”以及“76”是節(jié)點,所以節(jié)點76的節(jié)點代計數(shù)88將被寫為88(76)。
當遷移的代計數(shù)82(79)與接收節(jié)點76的節(jié)點代計數(shù)88(76)不同時,可能會出現(xiàn)困難。通過在節(jié)點之間實現(xiàn)消息托管區(qū)域,可以避免這些困難。但是,這將再次導致延遲時間,而分布式檢查點方法首先要避免的就是延遲時間。
根據(jù)分布式檢查點方法,有三種可能性:發(fā)送節(jié)點的節(jié)點計數(shù)88(78)與接收節(jié)點的節(jié)點計數(shù)88(76)相同;發(fā)送節(jié)點78具有比接收節(jié)點的節(jié)點計數(shù)88(76)低的節(jié)點代計數(shù)88(78);并且發(fā)送節(jié)點78具有比接收節(jié)點的88(76)更高的節(jié)點代計數(shù)88(78)。
在第一種可能性中,遷移將具有與發(fā)送節(jié)點78的節(jié)點計數(shù)88(78)相同的代計數(shù)82(79)。因此,發(fā)送節(jié)點78、接收節(jié)點76和遷移79都具有相同的代計數(shù)。在這種情況下,沒有什么特別需要做的。
當在遷移79傳送的同時接收節(jié)點76增加其代計數(shù)88(76)時,可能會出現(xiàn)第二種可能性。這意味著,在移入接收節(jié)點76時,遷移79將其自身呈現(xiàn)為此時已經成為接收節(jié)點76的較老一代的成員。在這種情況下,接收節(jié)點76將通過增加遷移的代計數(shù)82(79)來年輕化該遷移79。其結果是,遷移任務79將能夠繼續(xù)處理,但是如同其它較年輕一代的派生進程22b一樣,它將被阻止寫入存儲器12。然后,在接收節(jié)點76處對遷移79的年輕化進行日志記錄。由于年輕化的動作發(fā)生在接收節(jié)點76處,所以其被稱為“移入側年輕化”。
當在遷移79移出之前發(fā)送節(jié)點78增加其代計數(shù)88(78)時,可能出現(xiàn)第三種可能性。在這種情況下,發(fā)送節(jié)點78通過在發(fā)送之前增加遷移的代計數(shù)82(79)來年輕化遷移79,并且在發(fā)送節(jié)點處對年輕化事件進行日志記錄。由于年輕化的動作發(fā)生在發(fā)送節(jié)點78處,所以其稱為“移出側年輕化”。
在任一種情況下,已經從主節(jié)點接收到檢查點消息的節(jié)點76將設置截止期限,以允許較老一代派生進程22a完成執(zhí)行,從而確保較老一代接近滅絕,并避免需要記錄它們的狀態(tài)(步驟116)。盡管如此,可能會存在終止很慢的較老一代的派生進程22a。一旦達到截止期限,則節(jié)點76再等待延長的時間是不切實際的,仍在運行的任何較老一代派生進程22將被暫停、序列化、記錄日志和年輕化,之后允許其繼續(xù)執(zhí)行,受到的約束是它不能寫入工作存儲器12,直到將工作存儲器12提交到持久性存儲裝置16之后。
從屬節(jié)點76直到它知道不再期待有較老一代的移入到達才會開始實際檢查點。為了實現(xiàn)這一點,每當節(jié)點72識別出所有的較老一代的移出已成功移出時,它向所有其它節(jié)點74、76、78廣播刷新消息。一旦從屬節(jié)點76已經從所有節(jié)點72、74、78接收到刷新消息,它就知道較老一代移入的流動已經結束(步驟118)。較年輕一代的移入仍然可以到達從屬節(jié)點76,正如較年輕一代的移出仍然可以從從屬節(jié)點76離開。然而,這些較年輕一代的移出與檢查點過程無關。
此時,從屬節(jié)點76現(xiàn)在準備將其工作存儲器12提交到持久性存儲裝置16(步驟120)。這以與上述單節(jié)點情況相同的方式進行。
節(jié)點故障后重新啟動的過程如圖10所示,這取決于涉及的節(jié)點是否示故障節(jié)點。在接收到重新啟動的指令(步驟122)之后,節(jié)點確定它是否是故障節(jié)點,或者確定裝置70中的另一節(jié)點是否故障(步驟124)。如果節(jié)點是故障節(jié)點,則它檢索日志并且從其最后的有效檢查點向前滾動(步驟126)。如果節(jié)點不是故障節(jié)點,則它向后滾動到其上一個檢查點(步驟128)。
“向后滾動”操作的示例包括以下步驟:(1)終止當前正在運行的所有任務(包括派生器和派生進程);(2)使用雙向日志條目來撤消對存儲器的任何更改。
在已經向前滾動了任何故障節(jié)點并且已經向后滾動了任何幸存節(jié)點之后,裝置70還可以執(zhí)行其它操作,作為重新啟動任務的一部分。例如,裝置70可以執(zhí)行以下操作:(1)刷新通信網絡,以確保早于故障的所有消息已經被丟棄,(2)通過從日志恢復它們的保存狀態(tài)并且重新啟動它們,來重新啟動作為檢查點一部分的所有任務,(3)重新發(fā)送在檢查點之前未發(fā)送的任何消息,以及(4)處理從檢查點接收但尚未被處理的任何消息。
從故障節(jié)點上的最后一個有效檢查點向前滾動的任務是可能耗時的。參考圖11,在一些實踐中,在第二節(jié)點134上維護來自第一節(jié)點132的存儲器130的副本128是有用的。優(yōu)選地,第二節(jié)點134不具有與第一節(jié)點132相同的故障模式。在正常操作中,在每個檢查點處,副本128與第一節(jié)點132處的存儲器130同步。副本128還具有關聯(lián)的撤銷日志136,以使其能夠向后滾動到其最近檢查點處的狀態(tài)。
現(xiàn)在參考圖12,在第一節(jié)點132故障時,將第二節(jié)點124處的副本128指定為主節(jié)點(步驟138)。第二節(jié)點124上的所有進程被關閉(步驟140),之后重新啟動第二節(jié)點134(步驟142)。此時用作原本的前一副本128借助于撤銷日志136向后滾動到上一個檢查點(步驟144)。然后,多節(jié)點裝置70的操作可以繼續(xù),等待向后滾動時間的順序上的恢復。這通常比向前滾動時間短得多。同時,恢復的第一節(jié)點132可以繼續(xù)向前滾動到正確的狀態(tài),而不會減緩多節(jié)點裝置70的整體恢復。一旦第一節(jié)點132準備就緒,它再次接管為原本,并且前一副本128再次成為副本。
盡管圖11示出僅一個第二節(jié)點134,但應當理解,可以存在多于一個的第二節(jié)點,每個節(jié)點具有副本128和撤銷日志136。在這種情況下,在第一節(jié)點132故障時,多個第二節(jié)點中的一個必須被選擇作為第一節(jié)點存儲器的新原本的所有者。
在某些情況下,可能會有許多冪等(idempotent)的操作。在這種情況下,代替向前滾動,簡單地重復執(zhí)行冪等運算的計算是合理的,因為這些計算不會造成任何傷害。
恢復的最終結果是所有點都處于與從一代到下一代的過渡一致的狀態(tài)。其結果是,較老一代進程的任何工作都不會丟失,但是由較年輕一代進程完成的所有的工作都丟失了。這確保了所有節(jié)點之間一致的狀態(tài)。在這種背景下,在沒有任何故障的情況下本來可以到達的狀態(tài)是“一致的”。相比之下,如果只能通過一個或多個故障的發(fā)生來解釋該狀態(tài),則該狀態(tài)是“不一致的”。
圖13示出了結合圖6和圖9所示的多節(jié)點裝置70中的發(fā)送節(jié)點78和接收節(jié)點76中的幾個派生進程的狀態(tài)。在圖13中,時間沿垂直軸向下增加。時間軸示出第一間隔146、跟隨第一間隔146的第二間隔148、以及跟隨第二間隔148的第三間隔150。
圖13示出了幾個派生進程22a-22h,其每個具有相關聯(lián)的代計數(shù)。具有n個代計數(shù)的派生進程在本文中將被稱為“第一代派生進程”。具有n+1個代計數(shù)的派生進程在本文中將被稱為“第二代派生進程”。形容詞“第一代”和“第二代”也將用于指利用代計數(shù)標記的其它實體,包括節(jié)點、遷移任務和派生進程。
在第一間隔146期間,發(fā)送節(jié)點78是第一代節(jié)點。在第二間隔和第三間隔150期間,發(fā)送節(jié)點78是第二代節(jié)點。應當注意,節(jié)點的這種行進是循環(huán)的,使得第三間隔150之后將是對于第二代起到與第二間隔148對于第一代所起作用相同作用的間隔。盡管不一定與在發(fā)送節(jié)點78處發(fā)生的過程同步,但是在接收節(jié)點76上發(fā)生相同的過程。為了方便起見,使用相同的附圖標記來表示發(fā)送節(jié)點78和接收節(jié)點76中的間隔。然而,這并不意味著它們是同步的。
在第一間隔146期間,派生器進程20派生各種第一代派生進程22a-22e。在整個第一間隔146期間,任何第一代派生進程22a-22e可以自由地寫入發(fā)送節(jié)點存儲器12a。
在第二間隔148期間,發(fā)送節(jié)點78成為第二代節(jié)點。因此,派生器進程20現(xiàn)在只派生第二代派生進程。在第二間隔148期間,任何第一代派生進程22a-22e保持自由地寫入發(fā)送節(jié)點存儲器12a。第二代派生進程22f-22g可以自由地執(zhí)行,但是禁止寫入發(fā)送節(jié)點存儲器12a。因此,此第二間隔148的目的是為任何殘留的第一代派生進程22、22d、22e提供一些時間,以在檢查點間隔32出現(xiàn)之前完成執(zhí)行。
在第三間隔150期間,派生器進程20派生另一個第二代派生進程22h。在第三間隔150期間,不再保持有第一代派生進程,并且所有的第二代派生進程22f-22h都可以自由地寫入發(fā)送節(jié)點存儲器12a。
在發(fā)送節(jié)點78處,第一個第一代派生進程22a、第二個第一代派生進程22b、第三個第一代派生進程22c、第四個第一代派生進程22d和第五個第一代派生進程22e全部在第一間隔146期間開始執(zhí)行。然而,其中僅有第一個第一代派生進程22a和第二個第一代派生進程22b設法在第一個間隔146期間結束執(zhí)行。第三個第一代派生進程22c設法在第二間隔148期間結束。第四個第一代派生進程22d需要很長時間,直到第三間隔150開始才能結束。第五代第一代派生進程22e從未實際在發(fā)送節(jié)點78處結束。代替地,它在第二間隔148中途遷移到接收節(jié)點76。遷移的同時接收節(jié)點76仍然處于其自己的第二間隔148中。
在執(zhí)行期間,第一個第一代派生進程22a在第一間隔146期間寫入發(fā)送節(jié)點存儲器12a,并且第三個第一代派生進程22c在第二間隔148期間寫入發(fā)送節(jié)點存儲器12a。第二個第一派生進程22b在執(zhí)行期間根本不寫入發(fā)送節(jié)點存儲器12a。第五個第一代派生進程22e最終(但僅僅在接收節(jié)點76處)寫入發(fā)送節(jié)點存儲器12a。
在第二間隔148期間,第一個第二代派生進程22f和第二個第二代派生進程22g都開始執(zhí)行。有時,在第二間隔148期間,第一個第二代派生進程22f達到它必須向發(fā)送節(jié)點存儲器12a寫入的點。然而,由于仍然是第二間隔148,所以禁止寫入發(fā)送節(jié)點存儲器12a。因此,如虛線所示,它被暫停。一旦第三間隔150開始,則第一個第二代派生進程22f向發(fā)送節(jié)點存儲器12a寫入并完成執(zhí)行。
同時,第二個第二代派生進程22g在第二間隔148期間已經開始的足夠晚,使得截止到實際上其必須向發(fā)送節(jié)點存儲器12a寫入的時刻,第三間隔150已經開始。因此,第二個第二代派生進程22g不間斷地執(zhí)行。
第三個第二代派生進程22h在第三間隔150期間開始。這實質上是第一個第一代派生進程22a的鏡像。
在執(zhí)行過程中,第一個第一代派生進程22a導致第一任務152遷移到接收節(jié)點76。第一任務152繼承第一個第一代派生進程22a的世代號。因此,它開始作為第一代任務存在。此第一任務152到達接收節(jié)點76,同時接收節(jié)點76仍然在第一間隔146中操作。因此,接收節(jié)點76充當?shù)谝淮?jié)點。因此,第一任務152自由執(zhí)行并寫入接收節(jié)點存儲器12b,只要在第三間隔150在接收節(jié)點76上開始之前即可。
同樣,在執(zhí)行過程中,第二個第一代派生進程22b使得第二任務154遷移到接收節(jié)點76。第二任務154繼承第一個第一代派生進程22a的世代號。因此,它開始作為第一代任務存在。然而,此第二任務154到達接收節(jié)點76,同時接收節(jié)點76已經在其第二間隔148中操作。因此,第二任務154從第一代任務改變?yōu)榈诙蝿?。這包括在接收節(jié)點日志文件156中日志記錄第二任務154的伴隨步驟。
在發(fā)送節(jié)點78處對于第五個第一代派生進程22e發(fā)生類似的事件。第五個第一代派生進程22e在執(zhí)行中途遷移到接收節(jié)點76。然而,當其到達接收節(jié)點76時,接收節(jié)點76已經開始了它自己的第二間隔148。因此,第二節(jié)點已經變成第二代節(jié)點。因此,第五個第一代派生進程22e被改變?yōu)榈诙缮M程。這種變化伴隨著在發(fā)送節(jié)點日志文件158中對第五個第一代派生過程22e進行日志記錄。然后,第五個第一代派生進程22e繼續(xù)在接收節(jié)點76上執(zhí)行,但是作為第二代派生進程。
同時,返回發(fā)送節(jié)點78處,第四個第一代派生進程22d在第二間隔148結束之前還沒有結束執(zhí)行。此時,第四個第一代派生進程22d在發(fā)送節(jié)點日志文件158處進行日志記錄,并且其代計數(shù)增加,使得它現(xiàn)在變成第二代派生進程。然后,第四個第一代派生進程22d在第三間隔150期間繼續(xù)執(zhí)行。
應當注意的是,第四個第一代派生進程22d在其遷移到接收節(jié)點76期間持續(xù)由第五個第一代派生進程22e持續(xù)的相同的兩個步驟,即記錄步驟和派生變化。因此,可以合理的說,第四個第一代派生過程22d在某種意義也被遷移了。主要區(qū)別在于,第五個第一代派生進程22e進行了節(jié)點間遷移,而第四個第一代派生進程22d進行了節(jié)點內遷移。
因此,這里描述的檢查點和恢復方法基于這樣的認知:多個節(jié)點之間同時執(zhí)行檢查點的有利性不是源于時間同步性,而是源于時間同步的副作用。因此,該方法再現(xiàn)了多個節(jié)點之間檢查點的時間同步性的副作用,而不需要實際地實現(xiàn)時間同步性。
例如,可以使用執(zhí)行合適的軟件指令的可編程計算系統(tǒng)來實現(xiàn)上述容錯和恢復方法,或者可以在諸如現(xiàn)場可編程門陣列(fpga)或某些混雜形式的合適硬件中實現(xiàn)上述容錯和恢復方法。例如,在編程方法中,軟件可以包括在一個或多個編程或可編程計算系統(tǒng)(其可以是諸如分布式、客戶端/服務器或網格的各種架構)上執(zhí)行的一個或多個計算機程序中的過程,每個計算系統(tǒng)包括至少一個處理器,至少一個數(shù)據(jù)存儲系統(tǒng)(包括易失性和/或非易失性存儲器和/或存儲元件),至少一個用戶界面(用于使用至少一個輸入設備或端口接收輸入,并且用于使用至少一個輸出設備或端口提供輸出)。軟件可以包括例如提供與數(shù)據(jù)流圖的設計、配置和執(zhí)行相關的服務的更大程序的一個或多個模塊。程序的模塊(例如,數(shù)據(jù)流圖的元素)可以被實現(xiàn)為符合存儲在數(shù)據(jù)倉庫中的數(shù)據(jù)模型的數(shù)據(jù)結構或其他有組織的數(shù)據(jù)。
軟件可以使用持續(xù)一段時間(例如,動態(tài)存儲器裝置(例如動態(tài)ram)的刷新周期之間的時間)的介質的物理特性(例如,表面凹坑和平臺、磁疇或電荷等)以非暫時性形式存儲,例如被實施在易失性或非易失性存儲介質或任何其它非暫時性介質中。在準備加載指令時,軟件可以提供在有形、非暫時性介質上,例如cd-rom或其他計算機可讀介質(例如,可由通用或專用計算系統(tǒng)或設備讀取),或者可以通過網絡的通信介質被遞送(例如,被編碼成傳播信號)到其被執(zhí)行的計算系統(tǒng)的有形、非暫時性介質。可以在專用計算機上或使用諸如協(xié)處理器或現(xiàn)場可編程門陣列(fpga)或特定的專用集成電路(asic)的專用硬件來執(zhí)行處理中的一些或全部。處理可以以分布式方式實現(xiàn),其中由軟件指定的計算的不同部分由不同的計算元件執(zhí)行。每個這樣的計算機程序優(yōu)選地存儲在或下載到可由通用或專用可編程計算機訪問的存儲設備的計算機可讀存儲介質(例如,固態(tài)存儲器或介質,或磁介質或光介質)上,用于當計算機讀取存儲設備介質以執(zhí)行本文所述的處理時,配置和操作計算機。本發(fā)明的系統(tǒng)還可以被認為可實現(xiàn)為配置有計算機程序的有形的、非暫時性介質,其中如此配置的介質使得計算機以特定和預定義的方式操作以執(zhí)行本文描述的一個或多個處理步驟。
已經描述了本發(fā)明的多個實施例。然而,應當理解,前述描述旨在說明而不是限制本發(fā)明的范圍,本發(fā)明的范圍由所附權利要求的范圍限定。因此,其他實施例也在所附權利要求的范圍內。例如,在不脫離本發(fā)明的范圍的情況下可以進行各種修改。另外,上述的一些步驟可以是與順序無關的,并且因此可以以與所描述的順序不同的順序來執(zhí)行。
已經描述了我們所聲稱的新的發(fā)明,并且該發(fā)明通過專利證書來獲得保護。