鄧志淵,崔海斌,單崇喆,尹航,唐雷
(1.中國人民解放軍91515部隊,三亞572000;2.中國運載火箭技術(shù)研究院,北京100076;3.北京宇航系統(tǒng)工程研究所,北京100076)
隨著信息技術(shù)的發(fā)展,軟件復雜度日益增加,軟件在系統(tǒng)中的規(guī)模與作用越來越大,特別是在軍事系統(tǒng)中,以軟件為核心的產(chǎn)品得到廣泛應用,軟件質(zhì)量決定了系統(tǒng)成敗。良好的軟件可靠性設(shè)計是系統(tǒng)質(zhì)量的重要保證,是保障系統(tǒng)可靠的最有效、最重要手段。在軟件可靠性設(shè)計方面,軟件容錯技術(shù)是目前認可度較高,具有較好應用前景的設(shè)計技術(shù)之一,曾被用在飛機飛行控制系統(tǒng)、交通管制系統(tǒng)、核反應堆安全控制系統(tǒng)等失效后會出現(xiàn)嚴重后果的關(guān)鍵軟件系統(tǒng)中[1]。隨著網(wǎng)絡(luò)與集群技術(shù)的發(fā)展,在具有高可靠性要求的復雜信息系統(tǒng)中,對軟件容錯設(shè)計提出了系統(tǒng)級應用需求。本文將在介紹軟件容錯設(shè)計方法基礎(chǔ)上,以復雜設(shè)備在線測試數(shù)據(jù)分析與管理系統(tǒng)為例,論述高可靠性復雜信息系統(tǒng)中軟件容錯技術(shù)在系統(tǒng)級層面的應用,為系統(tǒng)級容錯設(shè)計提供借鑒。
軟件容錯設(shè)計是系統(tǒng)可靠性設(shè)計的關(guān)鍵技術(shù)之一。軟件容錯技術(shù)是研究在系統(tǒng)存在故障的情況下,如何發(fā)現(xiàn)故障并糾正故障,使系統(tǒng)不受到影響繼續(xù)正確運行,或?qū)⒐收嫌绊懡档娇山邮芊懂牭募夹g(shù),使系統(tǒng)能夠繼續(xù)滿足使用要求[2]。
常用的軟件容錯技術(shù)主要包括:冗余設(shè)計、N版本程序設(shè)計、恢復塊設(shè)計、防衛(wèi)式程序設(shè)計、服務器集群設(shè)計等[3]。冗余設(shè)計是采用增加多余資源獲得高可靠性。即在一套完整的軟件系統(tǒng)之外,設(shè)計一種不同路徑、不同算法或不同實現(xiàn)方法的模塊或系統(tǒng)作為備份,在出現(xiàn)故障時可以使用冗余部分進行替換,從而維持軟件系統(tǒng)的正常運行。按照對冗余資源不同可分為信息冗余、時間冗余、結(jié)構(gòu)冗余[4]。N版本程序設(shè)計是通過設(shè)計出多個模塊或不同版本,對于相同初始條件和相同輸入的操作結(jié)果,實行多數(shù)表決,防止其中某一模塊的故障提供錯誤服務,以實現(xiàn)軟件容錯[5]。恢復塊設(shè)計是選擇一組操作作為容錯設(shè)計單元,從而把普通程序塊變成恢復塊。一個恢復塊包含若干個功能相同、設(shè)計差異的程序塊文本,每一時刻有一個文本處于運行狀態(tài),一旦該文本出現(xiàn)故障,則用備份文本加以替換,從而構(gòu)成動態(tài)冗余[6]。N版本程序設(shè)計與恢復塊設(shè)計主要用于對系統(tǒng)中關(guān)鍵節(jié)點的容錯設(shè)計,以消除關(guān)鍵節(jié)點的單點故障。防衛(wèi)式程序設(shè)計是通過程序中包含錯誤檢查代碼和錯誤恢復代碼,使得一旦錯誤發(fā)生,程序能撤銷錯誤狀態(tài),恢復到一個已知的正確狀態(tài)中去[7]。服務器集群設(shè)計是指將一種相互獨立的服務器在網(wǎng)絡(luò)中組合成為單一系統(tǒng)工作,并以單一系統(tǒng)模式加以管理,當一臺節(jié)點服務器發(fā)生故障時,其上運行的應用程序?qū)⒈涣硪粋€節(jié)點服務器自動接管,以提高系統(tǒng)可靠性[8]。
復雜設(shè)備在線測試數(shù)據(jù)分析與管理系統(tǒng)(以下簡稱“CETDAS系統(tǒng)”)為局域網(wǎng)應用系統(tǒng),軟件主要采用B/S架構(gòu)和微服務技術(shù)構(gòu)建,硬件主要由11臺云服務器搭建集群及相關(guān)網(wǎng)絡(luò)設(shè)備、備份數(shù)據(jù)中心存儲設(shè)備、安全保密設(shè)備、UPS設(shè)備組成。系統(tǒng)底層對硬件資源虛擬化,形成云平臺,對資源進行統(tǒng)一分配管理,為Ha?doop大數(shù)據(jù)平臺及其上層業(yè)務應用系統(tǒng)提供計算、網(wǎng)絡(luò)及存儲資源。CETDAS系統(tǒng)由數(shù)據(jù)采集平臺、數(shù)據(jù)中心、集成應用平臺、安全保密防護系統(tǒng)4部分組成,其中集成應用平臺按業(yè)務功能又分為復雜設(shè)備構(gòu)型與產(chǎn)品信息管理、測試任務管理、測試流程監(jiān)控、測試數(shù)據(jù)自動判讀、測試技術(shù)資料管理、測試數(shù)據(jù)分析與挖掘、三員與權(quán)限管理、測試數(shù)據(jù)擺渡管理等8個子系統(tǒng),系統(tǒng)組成如圖1所示。
CETDAS系統(tǒng)在可靠性方面提出質(zhì)量要求,這些技術(shù)指標將作為系統(tǒng)軟件容錯設(shè)計的輸入。具體包括:
(1)系統(tǒng)具備7×24小時運維能力;
(2)平均故障修復時間(MTTR)不大于30分鐘;
(3)平均故障間隔時間(MTBF)不小于1000小時;
(4)具有對突發(fā)事件、故障的及時響應和快速恢復能力。
在CETDAS系統(tǒng)中,數(shù)據(jù)中心為系統(tǒng)提供統(tǒng)一資源分配,為上層應用提供計算與存儲服務,同時應用系統(tǒng)服務端部署在數(shù)據(jù)中心之上,因此,數(shù)據(jù)中心級容錯設(shè)計是衡量系統(tǒng)能否達到可靠性質(zhì)量要求的主要因素。數(shù)據(jù)中心的容錯設(shè)計包括:備份數(shù)據(jù)中心構(gòu)建與主數(shù)據(jù)中心容錯設(shè)計。
圖1 復雜設(shè)備在線測試數(shù)據(jù)分析與管理系統(tǒng)架構(gòu)圖
2.2.1 備份數(shù)據(jù)中心構(gòu)建
備份數(shù)據(jù)中心作為主數(shù)據(jù)中心的冗余設(shè)計,為系統(tǒng)提供了數(shù)據(jù)備份與容災恢復功能。按照國家標準,備份數(shù)據(jù)中心建設(shè)分為6個等級[9],如圖2所示。
圖2 備份數(shù)據(jù)中心建設(shè)分級圖
一級備份數(shù)據(jù)中心具有基本備份支持功能,具備介質(zhì)存儲備份及容災恢復計劃;二級備份數(shù)據(jù)中心具有備用場地支持,從物理空間上實現(xiàn)對主數(shù)據(jù)中心的容災緊急供貨;三級備份數(shù)據(jù)中心具備電子傳輸和部分設(shè)備支持,實現(xiàn)電子傳輸?shù)臄?shù)據(jù)備份并配置專職運行管理人員;四級備份數(shù)據(jù)中心具備電子傳輸及完整設(shè)備支持,實現(xiàn)就緒狀態(tài)7×24小時運行;五級備份數(shù)據(jù)中心具備實時數(shù)據(jù)傳輸及完整設(shè)備支持,實現(xiàn)遠程在線數(shù)據(jù)恢復和網(wǎng)絡(luò)集中切換能力;六級備份數(shù)據(jù)中心具備數(shù)據(jù)零丟失和遠程集群支持,實現(xiàn)數(shù)據(jù)實時備份及應用系統(tǒng)實時無縫切換。
根據(jù)系統(tǒng)在可靠性方面的質(zhì)量要求,同時考慮項目進度、成本等其他因素,經(jīng)論證,CETDAS系統(tǒng)選擇4級標準進行備份數(shù)據(jù)中心方案設(shè)計。方案設(shè)計目標是實現(xiàn)備份數(shù)據(jù)中心近實時數(shù)據(jù)備份功能,在主數(shù)據(jù)中心故障條件下,不會造成數(shù)據(jù)丟失,備份數(shù)據(jù)中心支持重建所需安裝程序,當主數(shù)據(jù)中心重建后,可利用備份數(shù)據(jù)中心恢復系統(tǒng)數(shù)據(jù)。
備份數(shù)據(jù)中心與主數(shù)據(jù)中心系統(tǒng)運行架構(gòu)如圖3所示。備份數(shù)據(jù)中心設(shè)計方案如下:與主數(shù)據(jù)中心部署在同一物理網(wǎng)絡(luò),兩個中心可通過網(wǎng)絡(luò)相連并設(shè)置為不同網(wǎng)段,其間具備防火墻等必要的安全防護設(shè)備。備份數(shù)據(jù)中心硬件能夠支持全部數(shù)據(jù)的備份存儲。備份數(shù)據(jù)中心能夠?qū)υ破脚_,大數(shù)據(jù)平臺安裝程序及初始配置文件進行備份;對各應用服務軟件初始鏡像進行備份。同時,主數(shù)據(jù)中心設(shè)置定時任務,指定周期在后臺對分布式數(shù)據(jù)庫、關(guān)系數(shù)據(jù)庫、分布式文件系統(tǒng)的數(shù)據(jù)進行增量備份。主數(shù)據(jù)中心能夠監(jiān)視備份數(shù)據(jù)中心的狀態(tài),在備份數(shù)據(jù)中心異常時給出告警提示。
圖3 備份數(shù)據(jù)中心與主數(shù)據(jù)中心系統(tǒng)運行架構(gòu)圖
當發(fā)生災難導致主數(shù)據(jù)中心無法正常運行時,備份數(shù)據(jù)中心按照以下步驟恢復系統(tǒng):
(1)恢復主數(shù)據(jù)中心硬件架構(gòu);
(2)通過備份數(shù)據(jù)中心獲取云平臺安裝程序與初始配置文件,安裝云平臺系統(tǒng);
(3)恢復云平臺之上的全部虛擬機;
(4)通過備份數(shù)據(jù)中心獲取大數(shù)據(jù)平臺安裝程序與初始配置文件,安裝大數(shù)據(jù)平臺系統(tǒng);
(5)通過備份數(shù)據(jù)中心獲取各應用服務軟件初始鏡像,安裝應用服務;
(6)恢復分布式數(shù)據(jù)庫、關(guān)系數(shù)據(jù)庫、分布式文件系統(tǒng)數(shù)據(jù)及元信息;
(7)啟動系統(tǒng)。
2.2.2 主數(shù)據(jù)中心容錯設(shè)計
在CETDAS系統(tǒng)中,主數(shù)據(jù)中心容錯設(shè)計主要體現(xiàn)在集群部署設(shè)計、云平臺冗余設(shè)計、大數(shù)據(jù)平臺冗余設(shè)計三個方面。
在集群部署方面,采用集群技術(shù),虛擬了40余臺服務器,將服務分別部署在不同機柜物理節(jié)點的服務器上,當其中一個服務器出現(xiàn)故障時,系統(tǒng)會自動切換到另一個臺服務器運行。由于備份節(jié)點部署于不同物理機柜中,當某一機柜網(wǎng)絡(luò)出現(xiàn)問題時,仍能保證該服務可正常運行。
云平臺冗余設(shè)計主要體現(xiàn)在資源虛擬化設(shè)計方面,通過虛擬機HA、虛擬機快照、虛擬機遷移、存儲遷移等技術(shù)[10]實現(xiàn)了對虛擬機的故障預計及故障自動處理。在故障處理時,支持對故障服務器進行隔離,避免業(yè)務消息發(fā)到故障服務器,確保故障不影響系統(tǒng)正常運行和業(yè)務正常使用,降低了故障危害。同時,云計算平臺管理系統(tǒng)采用冗余備份機制,主系統(tǒng)故障可自動切換到從系統(tǒng)提供服務。當系統(tǒng)冗余度降低時,可利用云平臺的HA機制恢復其冗余度,從而保證在長時間免維護情況下系統(tǒng)的不間斷應用。
大數(shù)據(jù)平臺冗余設(shè)計主要體現(xiàn)在分布式文件系統(tǒng)管理節(jié)點的冗余備份機制[11]。分布式文件管理系統(tǒng)HDFS管理節(jié)點NameNode的備份機制利用Zookeeper的寫一致性和臨時節(jié)點機制實現(xiàn)[12]。為每個NameNode設(shè)置監(jiān)視節(jié)點,若監(jiān)視節(jié)點檢測到對應的NameNode狀態(tài)正常,則表示這個NameNode有資格參加Zookeeper的主備選舉。若目前還沒有進行過主備選舉,則系統(tǒng)就會發(fā)起一次新的主備選舉,在Zookeeper上創(chuàng)建路徑為/hadoop-ha/${dfs.nameservices}/ActiveStandbyElector?Lock的臨時節(jié)點(其中,${dfs.nameservices}為Hadoop的配置參數(shù)dfs.nameservices的值)。Zookeeper的寫一致性會保證最終只會有一個臨時節(jié)點創(chuàng)建成功,創(chuàng)建成功的NameNode就會成為主NameNode,創(chuàng)建失敗的NameNode成為備NameNode。主NameNode在Active狀態(tài),備NameNode會被切換為Standby狀態(tài),多個NameNode節(jié)點通過共享存儲實現(xiàn)元信息共享。通過大數(shù)據(jù)平臺的冗余設(shè)計,實現(xiàn)了Active狀態(tài)的NameNode節(jié)點故障時自動將Standby狀態(tài)的Name Node節(jié)點切換到Active狀態(tài),使系統(tǒng)持續(xù)提供服務。
CETDAS系統(tǒng)的數(shù)據(jù)庫級容錯設(shè)計主要包括:分布式數(shù)據(jù)庫容錯設(shè)計與關(guān)系型數(shù)據(jù)庫容錯設(shè)計。
2.3.1 分布式數(shù)據(jù)庫容錯設(shè)計
在CETDAS系統(tǒng)中,分布式數(shù)據(jù)庫用于存放標準格式的測試數(shù)據(jù)。分布式數(shù)據(jù)庫采用HBase,底層基于分布式文件系統(tǒng)HDFS構(gòu)建,如圖4所示。HBase分布式數(shù)據(jù)庫繼承了分布式文件系統(tǒng)HDFS的可靠性、高性能和可擴展性,其冗余與擴展機制為:利用分布式文件系統(tǒng)存儲多個復本的元信息和Zookeeper的選舉機制實現(xiàn)管理節(jié)點的多機備份;利用分布式文件系統(tǒng)存儲數(shù)據(jù)表的多個副本,實現(xiàn)數(shù)據(jù)的冗余存儲;數(shù)據(jù)庫表到達一定規(guī)模后會根據(jù)Key值自動分裂,分布到多個節(jié)點,實現(xiàn)負載均衡。
圖4 HBase分布式數(shù)據(jù)庫結(jié)構(gòu)圖
HBase分布式數(shù)據(jù)庫在數(shù)據(jù)恢復方面實現(xiàn)了數(shù)據(jù)庫鏡像機制。創(chuàng)建鏡像時,數(shù)據(jù)庫能夠保存源信息的副本,并對元信息指向的全部底層文件進行保護,防止文件在后續(xù)操作中被刪除或移動。通過鏡像機制,能夠在數(shù)據(jù)庫損壞時恢復到某一時刻的狀態(tài)。
2.3.2 關(guān)系型數(shù)據(jù)庫容錯設(shè)計
在CETDAS系統(tǒng)中,關(guān)系型數(shù)據(jù)庫存儲各業(yè)務系統(tǒng)產(chǎn)生的格式化數(shù)據(jù),選用MySQL關(guān)系型數(shù)據(jù)庫實現(xiàn)。MySQL數(shù)據(jù)庫采用雙機熱備的主從備份模式進行容錯設(shè)計。具體方案是:使用兩臺服務器,一臺作為主服務器,運行MySQL數(shù)據(jù)庫管理系統(tǒng)提供服務。另一臺作為備份服務器,安裝完全一樣的MySQL數(shù)據(jù)庫管理系統(tǒng),但處于待機狀態(tài)。當主服務器出現(xiàn)故障時,通過軟件診測將備份機器激活,保證MySQL數(shù)據(jù)庫在短時間內(nèi)恢復正常運行。
圖5 MySQL數(shù)據(jù)庫雙機熱備運行模式示意圖
在主從服務器同步方面,采用讀寫二進制日志文件的方式實現(xiàn)。作為主服務器Master,把自己每一次改動都記錄到二進制日志Binarylog中。作為從服務器Slave,會用Master上的賬號登錄到Master上,讀取Master的Binarylog,寫入到自己的中繼日志Relaylog中,然后從服務器的SQL線程會負責讀取這個中繼日志并執(zhí)行,實現(xiàn)主從數(shù)據(jù)庫同步,其運行機制如圖5所示。
在CETDAS系統(tǒng)中,應用系統(tǒng)級容錯設(shè)計主要體現(xiàn)在開發(fā)設(shè)計準則,通過約束系統(tǒng)設(shè)計,提高代碼質(zhì)量,降低系統(tǒng)復雜度。例如,要求系統(tǒng)采用組件式開發(fā),統(tǒng)一使用Springcloud技術(shù)棧實現(xiàn)新服務,并強制使用Hystrix熔斷組件實現(xiàn)容錯機制[13]。同時,提出防衛(wèi)式程序設(shè)計要求,在方案設(shè)計階段對各業(yè)務流程進行事務性分析,辨別哪些業(yè)務具有事務原子性、一致性等特性,在實現(xiàn)中需按事務模式處理。提出采用Trycatch異常處理拋出自定義業(yè)務異常設(shè)計要求,特別是各服務系統(tǒng)邊界類之間的數(shù)據(jù)調(diào)用,需按統(tǒng)一化規(guī)定定義好業(yè)務中出現(xiàn)的異常,避免故障定位不清等問題。在處理異常時,規(guī)范界面告警信息的提示規(guī)則,以便為故障恢復提供指導。
CETDAS系統(tǒng)自上線以來運行良好,滿足使用需求,達到了7×24小時運行等可靠性設(shè)計指標要求。但在運行中也暴露了一些可靠性設(shè)計中考慮不足的情況。例如,沒有考慮到頻繁斷電的系統(tǒng)用電環(huán)境,導致MySQL數(shù)據(jù)庫選用主從備份方案不合適,當主服務器失效后,從服務器被激活為Active狀態(tài)時寫入的數(shù)據(jù),無法在主服務器恢復運行后向主服務器同步,導致數(shù)據(jù)狀態(tài)回滾。針對這一問題,提出解決措施:將MySQL數(shù)據(jù)庫的“主從模式”改為“主主模式”,并采用雙Mas?ter+Keepalived方案防止響應延遲產(chǎn)生“腦裂”[14]。經(jīng)改進,解決了數(shù)據(jù)回滾問題,提高了系統(tǒng)可靠性。
本文針對復雜信息系統(tǒng)的高可靠性需求,對系統(tǒng)級軟件容錯設(shè)計方法進行研究,以CETDAS系統(tǒng)為例,從數(shù)據(jù)中心級、數(shù)據(jù)庫級、應用系統(tǒng)級三個層面論述了軟件容錯設(shè)計,為提高復雜系統(tǒng)的可靠性提供一種有效解決方案。