分析高可用性系統(tǒng)的硬件和軟件設(shè)計(jì)模式
N版編程面臨的另一個(gè)問(wèn)題在于如何為N個(gè)獨(dú)立開(kāi)發(fā)團(tuán)隊(duì)提供輸入。一般情況下,將為所有的N個(gè)開(kāi)發(fā)團(tuán)隊(duì)提供相同的規(guī)范標(biāo)準(zhǔn)。然而,一旦規(guī)范存在缺陷,那么將得到N個(gè)獨(dú)立開(kāi)發(fā)的包含類似軟件故障的版本。如果系統(tǒng)發(fā)布之后,規(guī)范或使用錯(cuò)誤得到識(shí)別,那么每個(gè)新錯(cuò)誤都需要糾正N次,即N個(gè)不同的實(shí)現(xiàn)都需要加以糾正,這樣維護(hù)成本就相當(dāng)驚人?,F(xiàn)在,最佳的N版編程方法是讓第一流的軟件開(kāi)發(fā)團(tuán)隊(duì),利用最可靠的底層架構(gòu)、軟件開(kāi)發(fā)工具、技術(shù)和測(cè)試來(lái)開(kāi)發(fā)出高質(zhì)量的軟件版本。
校驗(yàn)點(diǎn)恢復(fù)
與基于靜態(tài)冗余的N版編程不同,許多軟件容錯(cuò)設(shè)計(jì)模式均基于動(dòng)態(tài)冗余。這些設(shè)計(jì)模式均包含以下四個(gè)步驟:
1. 故障檢測(cè)
2. 損害評(píng)估與 限制(有時(shí)也稱為“防火墻處理”)
3. 故障恢復(fù)
4. 故障處理和業(yè)務(wù)繼續(xù)
步驟二中,當(dāng)檢測(cè)到軟件錯(cuò)誤時(shí),一般可以采用失效保護(hù)。但軟件往往極其復(fù)雜,因此消除故障軟件導(dǎo)致的后果也并非輕而易舉。事務(wù)的概念是解決該問(wèn)題的一個(gè)有效工具,事務(wù)是應(yīng)用狀態(tài)下操作的集合,這樣事務(wù)的起始點(diǎn)和結(jié)束點(diǎn)均是應(yīng)用的穩(wěn)定狀態(tài)。例如,每個(gè)城市的市政廳都具有一個(gè)包含該城市所有居民信息的文件系統(tǒng)。當(dāng)一對(duì)夫妻結(jié)婚時(shí),他們的姓名和結(jié)婚日期都記錄在一個(gè)命名為“已婚夫妻”的文件中。另外,記載新郎從單身到已婚狀態(tài)變化的文件稱為“男性居民”;記載新娘從單身到已婚狀態(tài)變化的文件稱為“女性居民”。如果上述3個(gè)文件中的一個(gè)未能得到有效更新或者軟件在更新過(guò)程中突然崩潰,我們將不得不返回到該婚姻“事務(wù)”的起始點(diǎn)。否則,將只會(huì)以不穩(wěn)定狀態(tài)而告終,如新郎顯示為已婚狀態(tài),而新娘則仍然顯示為單身狀態(tài)。穩(wěn)定狀態(tài)只出現(xiàn)在婚姻事務(wù)的起始點(diǎn)以及得到成功處理的結(jié)束點(diǎn)。
如果希望在容錯(cuò)中引入事務(wù)概念,系統(tǒng)必須能在事務(wù)的起始點(diǎn)保存系統(tǒng)狀態(tài),這稱為檢驗(yàn)指示。檢驗(yàn)指示需要在開(kāi)始新事務(wù)之前迅速保存系統(tǒng)狀態(tài),并且必須要求先前的事務(wù)以無(wú)差錯(cuò)狀態(tài)結(jié)束。這里,一種基本的恢復(fù)策略是再執(zhí)行方法:一旦事務(wù)中檢測(cè)到錯(cuò)誤,事務(wù)將進(jìn)行失效保護(hù),系統(tǒng)將重新載入最近保存的檢驗(yàn)點(diǎn)。這樣業(yè)務(wù)又能從檢驗(yàn)點(diǎn)繼續(xù)執(zhí)行下去,并允許在該穩(wěn)定狀態(tài)上進(jìn)行新的事務(wù)處理。然而,這樣將丟失進(jìn)行失效保護(hù)的事務(wù)。這類故障恢復(fù)也稱為后向故障恢復(fù),因?yàn)檐浖顟B(tài)將還原到先前的一個(gè)無(wú)差錯(cuò)點(diǎn)上。
簡(jiǎn)單的檢驗(yàn)指示本身也容易引發(fā)單點(diǎn)失效,因?yàn)樵诒4鏅z驗(yàn)點(diǎn)狀態(tài)時(shí)有可能出現(xiàn)故障,但我們可以采用一種稱為檢驗(yàn)點(diǎn)還原(checkpoint-rollback)的方法解決這個(gè)問(wèn)題,如圖2所示。圖中,橢圓符號(hào)代表通過(guò)發(fā)送隊(duì)列消息進(jìn)行通信的軟件客戶和軟件服務(wù)器。一個(gè)事務(wù)可以包含許多從客戶機(jī)發(fā)往服務(wù)器的請(qǐng)求消息以及從服務(wù)器發(fā)往客戶機(jī)的響應(yīng)消息。在一個(gè)事務(wù)中,數(shù)據(jù)在服務(wù)器中修改。在事務(wù)的結(jié)束點(diǎn),右圖所示的兩個(gè)恒定大容量存儲(chǔ)設(shè)備將記錄穩(wěn)定的數(shù)據(jù)集和事務(wù)序列號(hào)。如果某一時(shí)刻檢測(cè)到錯(cuò)誤,而服務(wù)器已被關(guān)閉,那么服務(wù)器將重啟(或啟動(dòng)備用服務(wù)器)。作為啟動(dòng)恢復(fù)過(guò)程的一部分,兩個(gè)大容量存儲(chǔ)設(shè)備還需要檢驗(yàn)事務(wù)序列號(hào)。服務(wù)器數(shù)據(jù)將根據(jù)包含最高序列號(hào)的設(shè)備進(jìn)行恢復(fù)。因?yàn)楣收铣霈F(xiàn)在設(shè)備檢驗(yàn)中,因此另一大容量設(shè)備將帶有較低的序列號(hào)。
流程對(duì)設(shè)計(jì)模式
檢驗(yàn)點(diǎn)設(shè)計(jì)模式的一個(gè)缺陷在于故障恢復(fù)時(shí)間過(guò)長(zhǎng)。啟動(dòng)或重啟服務(wù)器需要進(jìn)行許多處理,才能恢復(fù)到檢驗(yàn)點(diǎn)狀態(tài)?!盁醾溆谩狈?wù)器與其自帶的恒定大容量存儲(chǔ)設(shè)備的直接協(xié)同工作可以加速恢復(fù),該設(shè)計(jì)模式也稱為流程對(duì)(process pair)設(shè)計(jì),如圖3所示。
圖3中,方框圖中央是一個(gè)工作原理與先前檢驗(yàn)點(diǎn)情形非常相似的主服務(wù)器,客戶機(jī)直接與主服務(wù)器協(xié)同工作。一旦主服務(wù)器成功地完成整個(gè)事務(wù),將傳送與新的穩(wěn)定狀態(tài)相關(guān)的信息至備用服務(wù)器(右端的服務(wù)器)。主服務(wù)器和備用服務(wù)器都將在恒定大容量設(shè)備中記錄數(shù)據(jù)。這樣,備用服務(wù)器就能保存完整事務(wù)的當(dāng)前信息。當(dāng)主服務(wù)器準(zhǔn)備就緒并可供客戶機(jī)使用,將向備用服務(wù)器發(fā)送常規(guī)的“心跳消息(heartbeat message)”,這些心跳消息還可以同某些檢驗(yàn)點(diǎn)消息相結(jié)合。一旦檢測(cè)到心跳消息流終止,備用服務(wù)器就知道主服務(wù)器已關(guān)閉或無(wú)法使用,進(jìn)而作為一個(gè)新的主服務(wù)器迅速接管事務(wù)。
該設(shè)計(jì)模式不僅適用于客戶機(jī)、主服務(wù)器和備用服務(wù)器均位于同一處理器或模塊上的情形,還適用于三者位于不同處理器或模塊的情形。
盡管流程對(duì)設(shè)計(jì)模式具有諸多優(yōu)勢(shì),但仍有一些問(wèn)題需要解決。例如,備用服務(wù)器丟失了檢驗(yàn)點(diǎn)消息或消息的順序不對(duì),而且,當(dāng)主服務(wù)器是物理設(shè)備的控制器并在操作中發(fā)生故障時(shí),也會(huì)產(chǎn)生問(wèn)題。當(dāng)備用服務(wù)器接管事務(wù)時(shí),不必知道如何完成操作,因?yàn)閭溆梅?wù)器并不知道主服務(wù)器失效之前究竟運(yùn)行到哪一步。
需要再次重申的是,在流程對(duì)設(shè)計(jì)模式中,當(dāng)主服務(wù)器失效時(shí),仍在進(jìn)行的事務(wù)將在執(zhí)行中丟失或撤銷。備份服務(wù)器接管主服務(wù)器的狀態(tài)是主服務(wù)器失效前報(bào)告給備用服務(wù)器最后完成的事務(wù)的狀態(tài)。
恢復(fù)程序塊
動(dòng)態(tài)軟件冗余的另一種設(shè)計(jì)模式稱為恢復(fù)程序塊。該方法基于檢驗(yàn)指示,但添加了對(duì)軟件處理結(jié)果的驗(yàn)收測(cè)試。設(shè)計(jì)中必須準(zhǔn)備數(shù)據(jù)處理的替代方法(就像在N版編程中一樣),但不必對(duì)每個(gè)事務(wù)運(yùn)行所有的數(shù)據(jù)處理方法。相反,可以選擇一種數(shù)據(jù)處理方式作為主方式,并且首先只采用主方式處理事務(wù)。一旦主處理完成,即可運(yùn)行驗(yàn)收測(cè)試。如果驗(yàn)收測(cè)試通過(guò),則表明主數(shù)據(jù)處理方式完全有效。如果驗(yàn)收測(cè)試失敗,則可如圖4所示,繼續(xù)試驗(yàn)下一個(gè)替代方案。
如方框圖所示,必須在首次進(jìn)入恢復(fù)程序塊之前進(jìn)行檢驗(yàn)指示。每次失效的驗(yàn)收測(cè)試之后,軟件必須還原到檢驗(yàn)點(diǎn)狀態(tài)。每次嘗試替代的處理方法之后,都必須進(jìn)行驗(yàn)收測(cè)試。這樣,需要不斷進(jìn)行處理方式更迭,直到提供通過(guò)驗(yàn)收測(cè)試的處理方式。這些“良好”的輸出構(gòu)成了恢復(fù)程序塊的最終結(jié)果。
前向故障恢復(fù)
檢驗(yàn)點(diǎn)恢復(fù)、流程對(duì)和恢復(fù)程序塊都是后向故障恢復(fù)方法。大多數(shù)動(dòng)態(tài)軟件容錯(cuò)都采用后向故障恢復(fù)方法,但前向故障恢復(fù)也是不錯(cuò)的選擇。前向故障恢復(fù)的基本思想是從錯(cuò)誤狀態(tài)繼續(xù)進(jìn)行并通過(guò)校正清除故障。前向故障恢復(fù)基于精確的錯(cuò)誤損失評(píng)估,因此通常取決于具體的系統(tǒng)。異常處理就是前向故障恢復(fù)的一個(gè)典型例子,當(dāng)檢測(cè)到問(wèn)題,該方法就發(fā)送命令至專用的異常處理軟件,而不是返回到先前某個(gè)檢驗(yàn)點(diǎn)狀態(tài)并繼續(xù)執(zhí)行下去。
替代處理是前向故障恢復(fù)的一種設(shè)計(jì)模式。當(dāng)某個(gè)事務(wù)存在兩種(或更多)處理選擇時(shí),就可以采用替代處理方法。在這兩種處理方法中,一種方法非常精確,但計(jì)算復(fù)雜;另一種方法則相對(duì)簡(jiǎn)單并具有更高的性能。替代方法不僅可用作測(cè)試,而且當(dāng)主處理方法出現(xiàn)故障時(shí)也可用作二級(jí)結(jié)果提供器。例如,平方根算法可作為主處理方法,而表查詢插入算法則可作為替代方法。一旦運(yùn)行了平方根算法,表查詢插入算法不僅可用于測(cè)試平方根算法所得結(jié)果的質(zhì)量,還能迅速校正這些結(jié)果中的錯(cuò)誤。
圖5中,為了控制飛機(jī)(波音777),同時(shí)采用了兩套數(shù)字飛行數(shù)字系統(tǒng)??驁D右側(cè)的決策邏輯電路將簡(jiǎn)單飛行控制系統(tǒng)的輸出作為測(cè)試復(fù)雜的主飛行控制系統(tǒng)輸出的衡量標(biāo)準(zhǔn)。如果驗(yàn)收測(cè)試失效,簡(jiǎn)單飛行控制系統(tǒng)的輸出也可用作失效主輸出的替代,向左的箭頭表示替代處理的結(jié)果也可為主處理提供反饋。
上述設(shè)計(jì)模式使采用常規(guī)商業(yè)級(jí)質(zhì)量的硬件和軟件為真正的高可用性系統(tǒng)構(gòu)造程序塊成為可能,這樣的高性能系統(tǒng)無(wú)需人為干預(yù),即可實(shí)現(xiàn)高達(dá)99.999%或更高的可靠性。
評(píng)論