分析高可用性系統(tǒng)的硬件和軟件設(shè)計模式
嵌入式系統(tǒng)設(shè)計人員經(jīng)常需要實現(xiàn)那些能在99.999%的業(yè)務時間內(nèi)可靠運行的系統(tǒng),這意味著一天內(nèi)系統(tǒng)故障的時間將少于一秒。這些系統(tǒng)稱為高可用性系統(tǒng)。高可用性系統(tǒng)的設(shè)計通過對冗余硬件和軟件進行組合,無需人為干預即可管理故障檢測和糾錯。本文首先簡要回顧了與高可用性系統(tǒng)和故障管理相關(guān)的一些概念,然后研究了容錯系統(tǒng)的一些硬件和軟件設(shè)計模式。
故障與失效
在設(shè)計高可用性系統(tǒng)時,需要重點關(guān)注“故障”和“失效”。為了更好地說明,這里將“失效”定義為系統(tǒng)提供的業(yè)務與設(shè)計規(guī)范不符的情況。故障則是與系統(tǒng)相互作用的一種錯誤,它是人們通常所指的不期望發(fā)生事件的可能原因。因此,故障可能是系統(tǒng)的子系統(tǒng)失效、器件失效、外部系統(tǒng)失效或程序錯誤。
故障可以是瞬時故障、永久故障或周期性故障。故障一旦發(fā)生,將導致系統(tǒng)或子系統(tǒng)的狀態(tài)出錯,而這些錯誤將引發(fā)系統(tǒng)失效。故障處理主要有以下四種主要方法:
1. 故障預測;
2. 故障避免;
3. 故障消除;
4. 容錯。
故障預測利用數(shù)學模型和試驗提供故障及其后果的預估。例如,實際中采用的一種故障預測技術(shù)就是在系統(tǒng)中插入故障,研究可能出現(xiàn)的各種系統(tǒng)失效。
故障避免和消除則通過嚴格的系統(tǒng)、硬件和軟件開發(fā)工藝及正式規(guī)范和驗證技術(shù)加以實現(xiàn)。
容錯通過采用各種冗余系統(tǒng)實現(xiàn),從而避免了故障影響?!笆趸笔菍崿F(xiàn)容錯的一種方法:即便該方法難以提供整體系統(tǒng)性能,也能提供切合實際的部分功能?!笆ПWo(fail safe)或失效即停(fail stop)”則是另一種容錯方法:當故障發(fā)生時,該方法在一個安全狀態(tài)終止系統(tǒng),而不讓系統(tǒng)繼續(xù)執(zhí)行。
容錯涉及的主要概念是冗余。容錯基于這樣的思想(或愿望):多個獨立的故障不會同時攻擊系統(tǒng)。容錯系統(tǒng)應能規(guī)避單點失效,換言之,如果系統(tǒng)的某部分可能出現(xiàn)故障,那么系統(tǒng)中應當存在解決該故障的冗余部分,從而避免失效。
冗余具有很多種形式:
1. 硬件冗余(低端、高端或兩者兼有);
2. 軟件冗余;
3. 時間冗余;
4. 信息冗余。
飛機內(nèi)的自校驗邏輯電路及多臺飛行計算機即為典型的硬件冗余。軟件冗余可采用兩種完全不同的算法,得到的結(jié)果也完全相同。時間冗余可以利用通信重傳實現(xiàn),而信息冗余則可采用備份、校驗及糾錯代碼實現(xiàn)。
冗余可以是動態(tài)的,也可以是靜態(tài)的,兩者均需復制系統(tǒng)的基本要素。在靜態(tài)冗余中,同一時刻所有的復制要素均保持激活。如果一個復制“拋出”故障,系統(tǒng)能夠馬上使用另一復制,并繼續(xù)正確的操作。在動態(tài)冗余中,只有一個復制保持激活,而其余復制則不激活。如果被激活的復制產(chǎn)生故障,先前未被激活的一個復制將被激活并接管臨界操作。
那么上述各種方法是如何實現(xiàn)高可用性的呢?首先,必須對高可用性進行定義。高可用性表征系統(tǒng)容錯并根據(jù)規(guī)范繼續(xù)提供業(yè)務的能力。系統(tǒng)可以采用本文給出的所有概念和方法實現(xiàn)高可用性。
可用性通常采用“可用度”或“每年故障時間”進行量度。常規(guī)的容錯系統(tǒng)可以達到99.99%的可靠度,即相當于每年故障1小時(每天故障10秒鐘)。但高可用性系統(tǒng)則有望實現(xiàn)高達99.999%的可用度,即每年故障少于5分鐘(簡單地說,即每天故障1秒鐘)。這意味著當故障出現(xiàn)時,系統(tǒng)必須能自動處理,因為操作人員難以在很短的時間內(nèi)移除或掩蓋任何故障。
硬件冗余
與采用極可用器件構(gòu)建單個極可用模塊的硬件設(shè)計相比,使用由常規(guī)商業(yè)級質(zhì)量的器件構(gòu)成的常規(guī)商業(yè)級質(zhì)量硬件進行冗余復制模塊設(shè)計,無疑具有更高的成本效益。
每個復制通常都要求具有“快速失效”或“失效即?!碧匦?,這極大地簡化了故障管理決策。每次失效都使硬件在運行中停止,而不是試圖勉強執(zhí)行下去并要求管理人員指出模塊中哪些輸出發(fā)生故障,哪些則一切正常。
對于采用靜態(tài)冗余的容錯,每個復制模塊都具有常規(guī)的商用可用性。采用雙重復制的模式稱為配對或雙路復用(duplexing)。如果采用了N個復制,則稱為N路復用(N-plexing)。
圖1顯示了3路復用或3重冗余硬件設(shè)計,這三重復制均位于方框圖的底端附近。這些復制向“表決器”提交輸出,表決器決定了子系統(tǒng)的最終實際輸出。在N路復用設(shè)計中,當N ≥ 3時,表決器通常采用多數(shù)決策策略。但是,這需要占不失效復制的絕大多數(shù),而不僅僅是占復制總數(shù)(失效和不失效復制)的簡單多數(shù)。
然而,表決器的硬件和軟件不是類似于系統(tǒng)中的任何其他模塊,也會失效嗎?實際上,確實如此;而且一旦失效,還會給系統(tǒng)帶來災難性的影響。但表決器通常極為簡單,因此可以通過設(shè)計和測試保證其魯棒性。此外,還可以設(shè)計復雜表決器和二級表決器等復雜系統(tǒng),但本文不準備進行深入討論。
對于采用動態(tài)冗余的容錯,復制模塊仍然只需具有常規(guī)的商用可用性。一種實現(xiàn)方法是采用由一個被激活模塊和一個備用模塊組成的冗余對。另一方法則采用一簇模塊,這些模塊不必是其他模塊的精確復制,可以具有不同的特征、接口和容量。這簇復制需要采用失效接替策略,這樣當主模塊出現(xiàn)故障時,就能確定如何對多個模塊進行管理。下面給出了一些選擇:
1. 熱備用。主模塊在系統(tǒng)中運行時,備份模塊處于“熱備用”狀態(tài),一旦主模塊出現(xiàn)故障,備份模塊將啟動并接管主模塊。例如,可以采用這種方法設(shè)計高可用性的互聯(lián)網(wǎng)服務器。
2. 轉(zhuǎn)動備用。主模塊在系統(tǒng)運行時,可以具有許多備用模塊。一旦主模塊出現(xiàn)故障,一個備用模塊將接管系統(tǒng)的運行。航天飛機上飛行計算機的設(shè)計就基于該原理:主模塊由兩臺總穩(wěn)定工作的計算機組成,其中一個備用模塊是一個相似對(similar pair),而第二個備用模塊則是一臺只能根據(jù)操作員指令接管系統(tǒng)的計算機。
3. 非關(guān)鍵模塊的失效接替。主模塊占用系統(tǒng)的關(guān)鍵資源,備用模塊則占用其他非關(guān)鍵資源。一旦主模塊出現(xiàn)故障,備用模塊就能接管主模塊占用的大部分關(guān)鍵資源。日常生活中我們也常常這么做:當我們試圖發(fā)送一封緊急的電子郵件時,如果計算機的高速互聯(lián)網(wǎng)連接出現(xiàn)故障,我們會立即切換到舊式的調(diào)制解調(diào)器。
4. 共同接管。每個模塊均運行自帶的關(guān)鍵資源,而且一旦某個模塊發(fā)生故障,其他模塊還能接管故障模塊的關(guān)鍵資源。例如,在功能增強的心護理室中,每8位病人將設(shè)置一臺心臟監(jiān)控計算機。如果一臺心臟監(jiān)控計算機崩潰,那么鄰近的計算機也能對故障計算機監(jiān)控的8位病人進行監(jiān)控(或許性能將有所降低)。
正確的失效接替實現(xiàn)非常關(guān)鍵。如果故障的主模塊需要拋棄故障并繼續(xù)執(zhí)行,而同時另一模塊也試圖接管其業(yè)務,那么后果將是災難性的,因為它們的業(yè)務有可能產(chǎn)生沖突。如果主模塊拋棄故障后停止執(zhí)行,而又沒有其他模塊接管其業(yè)務,這樣的后果同樣是災難性的。因此失效接替的驗證和測試非常關(guān)鍵,盡管我們當中的許多人并不熱衷于此。
軟件冗余
大多數(shù)硬件故障都是隨機產(chǎn)生并由物理缺陷導致,這些缺陷要么在生產(chǎn)過程中維持不變,要么隨器件的老化而不斷變化,要么將受到外部物理環(huán)境的沖擊。相反,軟件故障與物理條件無關(guān),因為軟件不會老化。與硬件故障不同,軟件故障源自對軟件設(shè)計或?qū)崿F(xiàn)中固有故障的軟件路徑調(diào)用。由于軟件通常比硬件復雜,因此軟件中可能具有比硬件多得多的內(nèi)置缺陷,從而導致軟件中的故障更多,容錯設(shè)計的成本也更高。
N版編程(N-version programming )是久經(jīng)考驗的一種軟件容錯設(shè)計方法。20世紀70年代偶然接觸到該方法時,那時還被稱為異質(zhì)軟件(dissimilar software)。這是硬件N路復用(如圖1所示)的等價軟件實現(xiàn)。但該方法比硬件N路復用的復制機制復雜,N路復用中相同軟件的N個復制將包含相同的故障并產(chǎn)生N次相同的錯誤。在N版編程中,如果N套軟件功能需要并行運行,那么它們應當是該功能的N個不同實現(xiàn),而且是由N個單獨的開發(fā)團隊獨立開發(fā)完成。這就是N版編程的基本原理。
1996年6月,當首次發(fā)射的阿麗安娜-5衛(wèi)星發(fā)送火箭上升到4000米高空時,突然發(fā)生了爆炸。該事故的原因在于火箭的慣性參考系統(tǒng)(這是數(shù)字飛行控制的一部分)發(fā)生了故障。盡管慣性參考系統(tǒng)中引入了硬件冗余,但軟件冗余沒有得到正確的處理。阿麗安娜-5帶有兩臺慣性參考計算機,一臺處于工作狀態(tài),而另一臺則處于“開機”備用狀態(tài)。這兩套系統(tǒng)并行運行,并具有完全一樣的硬件和軟件。系統(tǒng)上的軟件也與先前已經(jīng)成功發(fā)射的阿麗安娜-4幾乎一模一樣,但由于阿麗安娜-5上的某些飛行參數(shù)值比阿麗安娜-4大,因此數(shù)據(jù)發(fā)生了溢出。解決問題的方法是關(guān)閉計算機,由于冗余計算機也在運行相同的軟件,因此也將受到數(shù)據(jù)溢出的沖擊,從而很快關(guān)閉,這樣整個慣性參考系統(tǒng)就完全崩潰。結(jié)果,引擎的噴管被回旋至極限位置,導致火箭突然轉(zhuǎn)向,并在自毀之前裂成兩半。這種處理數(shù)據(jù)溢出錯誤的方法適用于處理隨機出現(xiàn)的硬件錯誤,但不適用于處理兩臺計算機上出現(xiàn)的類似軟件錯誤。N版編程可以避免兩臺計算機出現(xiàn)類似的軟件錯誤。
在20世紀70年代,N版編程(N-version programming)是先進的軟件容錯設(shè)計方法。此后,這種設(shè)計模式引發(fā)了一系列問題:隨著該技術(shù)的采用,軟件開發(fā)成本直線飆升,因為必須成立N個單獨的團隊開發(fā)N套相互獨立的軟件。如果期望降低成本,則將陷入所謂的“平均智商( Average IQ)”怪圈:較低成本的開發(fā)團隊意味著較低質(zhì)量的軟件工程師,而這些工程師只能開發(fā)出較低質(zhì)量的代碼。因此,最終只能得到充斥著以N種不同方式產(chǎn)生故障的N種不同程序。
評論