摘 要: 硬件冗余可以極大地提高計算機應用系統(tǒng)的可用性,,然而,一旦關鍵硬件出現(xiàn)故障或數(shù)據(jù)庫宕機,,正在進行中的業(yè)務流程通常會中斷,。探討了一種如何實現(xiàn)應用系統(tǒng)高可用性的軟件架構的設計方案,以彌補純硬件冗余應用系統(tǒng)的不足,。
關鍵詞: 高可用性,;軟件容錯;分布式數(shù)據(jù)庫
在業(yè)內(nèi),,計算機應用系統(tǒng)的可用性定義為計算機應用系統(tǒng)保持正常運行時間的百分比,,通常用表1所示的“9”的個數(shù)來劃分可用性的類型。
通常,,硬件冗余(容錯計算機,、雙機或多機集群、磁盤陣列,、SAN等),、數(shù)據(jù)復制、合理的災難備份和恢復策略都可以極大地提高計算機應用系統(tǒng)的可用性,。正因為如此,,當前,對于計算機應用系統(tǒng)的高可用性,、業(yè)務的可持續(xù)性要求,,業(yè)內(nèi)通常以硬件系統(tǒng)的高可用性來應對或代替。常見的解決方案是雙機(或多機)集群方案或直接采用容錯計算機來保障系統(tǒng)的高可用性,,應用軟件的設計和開發(fā)往往僅注重業(yè)務流程的分析和過程控制,。在這種完全依賴硬件來保障整個系統(tǒng)的可用性的系統(tǒng)里,一旦關鍵硬件出現(xiàn)故障或數(shù)據(jù)庫宕機,,正在進行中的業(yè)務流程(如需較長執(zhí)行時間的事務處理,、后臺批處理過程等)必然會中斷,這是因為雙機切換也需要時間。對此,,應用軟件本身并無多少作為,,該類業(yè)務必須等待系統(tǒng)重新恢復后全部或部分重做。
本文以基于大型數(shù)據(jù)庫的應用系統(tǒng)為例,,從“軟件容錯”設計的概念出發(fā),,參考“分布式”數(shù)據(jù)庫結構設計,以“系統(tǒng)服務總線”為核心,,給出了一種可行的高可用性軟件架構的設計方案,,可以極大地提高應用軟件的可用性和業(yè)務系統(tǒng)的可持續(xù)性。無論是傳統(tǒng)的C/S架構,,還是近年來流行的B/S架構,,本文中給出的設計方案都有一定的參考意義。
1 軟件結構模型
任何基于大型數(shù)據(jù)庫的應用系統(tǒng),,都可以抽象為對數(shù)據(jù)的“讀”和“寫”操作,。至于客戶端如何展現(xiàn)“讀”到的數(shù)據(jù),以及“客戶端”與“服務端”基于何種通信協(xié)議通信,,不在本文討論之列,。
軟件結構的設計其實就是針對“讀”和“寫”的一系列流程的設計。如何最大限度地保證系統(tǒng)中的所有“硬件”和“軟件”協(xié)同工作,,正確完成每一次“讀”和“寫”的操作,,也就是對系統(tǒng)“高可靠性”和“高可用性”的要求。
圖1是基于“軟件容錯”和“分布式數(shù)據(jù)庫系統(tǒng)”的原理,,并參照了計算機“總線”的工作原理給出的一種基于分布式數(shù)據(jù)庫或文件系統(tǒng)的高可用性的軟件架構設計方案,。系統(tǒng)采用3層架構:客戶端、中間應用層和數(shù)據(jù)庫層,。
2 系統(tǒng)設計
2.1 數(shù)據(jù)庫配置
為了更清楚地闡述本文的設計方案,,先對數(shù)據(jù)庫的配置及其功能進行描述。本系統(tǒng)中,,數(shù)據(jù)庫按角色可劃分為如下三類數(shù)據(jù)庫:控制數(shù)據(jù)庫(COTROLL DB),、日志數(shù)據(jù)庫(LOG DB)、業(yè)務數(shù)據(jù)庫(BUS DB_N),。
2.1.1 控制數(shù)據(jù)庫
控制數(shù)據(jù)庫也可以是一個或多個系統(tǒng)控制(參數(shù))文件,。它存放要訪問的目標數(shù)據(jù)庫的節(jié)點(N)、端口,、用戶,、文件頭、表,、視圖等信息,;存放對節(jié)點、業(yè)務數(shù)據(jù)庫、表或視圖的授權或訪問控制信息,;目標數(shù)據(jù)庫(或文件)的當前狀態(tài)(聯(lián)機/脫機,、忙/空閑等);目標數(shù)據(jù)庫中的表或視圖的當前狀態(tài)(聯(lián)機/脫機,、忙/空閑、加鎖/解鎖等),。
2.1.2 日志數(shù)據(jù)庫
日志數(shù)據(jù)庫獨立于業(yè)務數(shù)據(jù)庫之外,,用于記錄客戶端節(jié)點信息、請求時刻和發(fā)來的所有請求的原始內(nèi)容,,但不做業(yè)務流程相關的處理,、運算等。記錄每次數(shù)據(jù)操作分配的唯一的“事件號”(EVENT_ID),。對每一次客戶端的“請求”,,“系統(tǒng)服務總線”(SYSSRV)會分配唯一的標識符號,可以定義為有一定意義的字符串,,比如,,“當前時刻+流水號”。以上信息可以被壓縮,、打包,、加密后存放,以記錄格式保存于數(shù)據(jù)庫的表或文件中,。它可以設計為數(shù)據(jù)庫中的一個或多個表,,也可以是文件格式。
2.1.3 業(yè)務數(shù)據(jù)庫
業(yè)務數(shù)據(jù)庫記錄所有業(yè)務相關的數(shù)據(jù)信息,。所有業(yè)務數(shù)據(jù)庫的相關業(yè)務邏輯的數(shù)據(jù)結構相同,,即,N個節(jié)點的業(yè)務數(shù)據(jù)庫中與業(yè)務模式相關的表,、視圖,、過程或其他程序設置相同。
需要特別指出的是:
(1)控制數(shù)據(jù)庫,、日志數(shù)據(jù)庫和業(yè)務數(shù)據(jù)庫可以是不同數(shù)據(jù)庫廠家或品牌的產(chǎn)品,。比如,日志數(shù)據(jù)庫可以采用低端的數(shù)據(jù)庫產(chǎn)品或開源數(shù)據(jù)庫系統(tǒng),,業(yè)務數(shù)據(jù)庫可以采用高端的大型數(shù)據(jù)庫產(chǎn)品,。
(2)控制數(shù)據(jù)庫、日志數(shù)據(jù)庫和業(yè)務數(shù)據(jù)庫在物理上和邏輯上是可以相互隔離的,,這可以極大地提高系統(tǒng)的整體安全性,。目標數(shù)據(jù)庫和要訪問的表或視圖對客戶端來說是“不可見”的,由控制數(shù)據(jù)庫動態(tài)定義和控制。
(3)所有類別的數(shù)據(jù)庫在物理上位于一個或多個節(jié)點上,,即節(jié)點N>=1,;任意一個節(jié)點N上建有一個或多個業(yè)務數(shù)據(jù)庫(邏輯數(shù)據(jù)庫>=1);任意一個節(jié)點是一個完整的,、可獨立工作的計算機,。根據(jù)性能要求,可以是高性能PC機,、PC服務器,、小型機、集群或超級計算機,,或是它們的“混合體”,;任意一個節(jié)點是指定網(wǎng)絡中的一個指定節(jié)點。
2.2 應用層設計
中間應用層由5個后臺進程構成:(1)系統(tǒng)服務總線(SYSSRV),;(2)數(shù)據(jù)庫寫進程(DBWRT_N),;(3)數(shù)據(jù)庫讀進程(DBRED_N);(4)數(shù)據(jù)庫在線恢復進程(DBRCY),;(5)日志檢查進程(LOGCHK),。
2.2.1 系統(tǒng)服務總線
這是一個后臺監(jiān)聽、分發(fā),、調(diào)度總進程,。設計目標具有一定的“自我修復”和“自我復制”動能。它可以根據(jù)負載情況,,自我復制或開啟子進程響應新的負載,;可以動態(tài)配置可服務的節(jié)點或客戶端;可以為特定節(jié)點或客戶端指定專用進程,;它通過“DBWRT”和“DBRED”“讀/寫”日志數(shù)據(jù)庫或日志文件,。
2.2.2 寫進程
寫進程負責向所有節(jié)點寫數(shù)據(jù)。它可以配置成多進程/單進程模式,;多進程模式,,指對應每個業(yè)務數(shù)據(jù)庫N都有獨立的“寫”進程;單進程模式,,指對應多個業(yè)務數(shù)據(jù)庫只有一個主進程,,主進程開啟多個線程提供“寫”服務。
2.2.3 讀進程
讀進程負責向所有節(jié)點讀數(shù)據(jù),,它可以配置成多進程/單進程模式,。多進程模式指對應每個業(yè)務數(shù)據(jù)庫N都有獨立的“讀”進程,單進程模式指對應多個業(yè)務數(shù)據(jù)庫只有一個主進程,,主進程開啟多個線程提供“讀”服務,。
根據(jù)需要,,讀進程可以配置成:向所有在線節(jié)點并發(fā)讀數(shù)據(jù),返回最快的結果集,,拋棄其他的結果集,,并中斷其他讀進程;也可以配置成:隨機讀某個節(jié)點的數(shù)據(jù),,如果失敗或超時,,則再隨機讀余下的在線節(jié)點,直到“讀”成功或失??;還可以配置成向所有節(jié)點順序讀數(shù)據(jù),過程類似上面“隨機讀”,。
以上“讀寫”業(yè)務數(shù)據(jù)庫的進程,設計上支持多種數(shù)據(jù)庫訪問接口,,針對“表”或“視圖”提供統(tǒng)一格式的,、標準的、動態(tài)的SQL數(shù)據(jù)操作接口和方法,,完成對數(shù)據(jù)庫中表或視圖的增,、刪、改,、查和批處理操作,。它們可以設計為數(shù)據(jù)庫中的存儲過程,也可以是C++,,Java程序的API或混合體,。
2.2.4 數(shù)據(jù)庫在線恢復進程
該進程負責檢查全部或部分節(jié)點數(shù)據(jù)庫(包括所有授權控制數(shù)據(jù)庫、業(yè)務數(shù)據(jù)庫和日志數(shù)據(jù)庫)或文件的工作狀態(tài),;檢查數(shù)據(jù)庫或文件表中數(shù)據(jù)的一致性,;將以上檢查結果寫入日志數(shù)據(jù)庫(或日志文件)。
當某個業(yè)務數(shù)據(jù)庫中的表寫入失敗時,,它負責從“日志數(shù)據(jù)庫”的表或日志文件中讀出原始數(shù)據(jù),,接著寫入出現(xiàn)問題的業(yè)務數(shù)據(jù)庫的表中,并檢查結果,?;驈钠渌?jié)點的數(shù)據(jù)庫中讀相關數(shù)據(jù)并寫入到出現(xiàn)問題的業(yè)務數(shù)據(jù)庫的表中。
接收外部命令,,根據(jù)“時間點”或“事件號”從特定時刻,、特定數(shù)據(jù)庫(包括日志數(shù)據(jù)庫)、特定表恢復數(shù)據(jù)到特定目標數(shù)據(jù)庫的表或文件,。
2.2.5 日志檢查進程
該進程負責讀,、寫日志文件,,檢查數(shù)據(jù)操作結果的一致性。如果不一致,,則報告給“系統(tǒng)服務總線”,,將問題數(shù)據(jù)庫或數(shù)據(jù)庫中的表、視圖設置為“離線”狀態(tài),。
3系統(tǒng)實現(xiàn)
3.1系統(tǒng)初始化
啟動配置好的后臺進程即完成系統(tǒng)初始化過程,。
3.2 數(shù)據(jù)“寫”流程
數(shù)據(jù)“寫”流程的主要步驟如下:
(1)客戶端通過給定協(xié)議(或混合多種通信協(xié)議)向后臺“系統(tǒng)服務總線”發(fā)送“寫”請求。
(2)激活“數(shù)據(jù)庫寫進程”,,將客戶端的“請求”寫入“日志數(shù)據(jù)庫”(或日志文件),,并分配一個唯一的“事件號”。
(3)“系統(tǒng)服務總線”查詢“授權/控制數(shù)據(jù)庫”(或/配置文件)得到客戶端請求訪問的數(shù)據(jù)存放的目標數(shù)據(jù)庫(或文件)節(jié)點N(或文件存放的節(jié)點N),、端口,、用戶、表,、文件頭等信息,。節(jié)點N可以是多個,即節(jié)點N>=1,。
(4)“系統(tǒng)服務總線”向N個“數(shù)據(jù)庫寫進程”發(fā)送數(shù)據(jù)“寫”訪問請求,,并得到各節(jié)點的返回結果集。
(5)只要有1個節(jié)點寫入成功,,“系統(tǒng)服務總線”就將寫入成功的標志發(fā)回客戶端,;“數(shù)據(jù)庫寫進程”將各節(jié)點的返回結果狀態(tài)寫入“日志數(shù)據(jù)庫”(或日志文件)中。
(6)“日志監(jiān)控”查詢“日志數(shù)據(jù)庫”(或日志文件),,比較N個節(jié)點的寫入狀態(tài),。如發(fā)現(xiàn)寫錯誤、失敗,、超時等狀態(tài),,則將該“業(yè)務數(shù)據(jù)庫”(或文件、表,、視圖)標志為“非正常聯(lián)機數(shù)據(jù)庫”(或文件,、表、視圖不可用),。
(7)激活“數(shù)據(jù)在線恢復進程”,,進程為“非正常聯(lián)機數(shù)據(jù)庫”,則執(zhí)行數(shù)據(jù)庫數(shù)據(jù)“同步”,。在線同步恢復如失敗,,則將該“數(shù)據(jù)庫”標志為“需要DBA維護”的類別,留待DBA或軟件維護工程師處理,。
3.3 數(shù)據(jù)“讀”流程
數(shù)據(jù)“讀”流程的主要步驟如下:
(1)客戶端通過給定協(xié)議(或混合多種通信協(xié)議)向后臺“系統(tǒng)服務總線”發(fā)送“讀”請求,。
(2)激活“寫進程”,,將客戶端的“請求”寫入“日志數(shù)據(jù)庫”(或日志文件),并分配一個唯一的“事件號”,。
(3)“系統(tǒng)服務總線”查詢“授權/控制數(shù)據(jù)庫”(或/配置文件)得到客戶端請求訪問的數(shù)據(jù)存放的目標數(shù)據(jù)庫節(jié)點N(或文件存放的節(jié)點N),、端口、用戶,、表等信息,。節(jié)點N可以是多點,即節(jié)點N>=1,。
(4)“系統(tǒng)服務總線”查詢“授權/控制數(shù)據(jù)庫”(或/配置文件)得到可用的,、空閑的目標數(shù)據(jù)庫節(jié)點N(或文件存放的節(jié)點N)。
(5)激活“讀進程”(或隨機,、或順序)向N個節(jié)點的“業(yè)務數(shù)據(jù)庫”(或文件)發(fā)送數(shù)據(jù)“讀”訪問請求,,并得到各節(jié)點的返回結果集。
(6)“系統(tǒng)服務總線”將最快返回的結果集發(fā)回客戶端,;拋棄其他結果集,,中斷其他讀進程。
在本系統(tǒng)的設計和實現(xiàn)中,,由于采用了“分布式”數(shù)據(jù)庫或文件系統(tǒng)部署,只要N個節(jié)點中至少有一個節(jié)點的“業(yè)務數(shù)據(jù)庫”正常工作,,因為一個或幾個“業(yè)務數(shù)據(jù)庫”系統(tǒng)(或節(jié)點硬件)故障所引起的業(yè)務系統(tǒng)的不可持續(xù)性理論上將可以完全避免,,因而提高了系統(tǒng)的“容錯”性。
由于N個數(shù)據(jù)庫同時在線,,且節(jié)點是否可用,、空閑等狀態(tài)可實時監(jiān)控,這為特定業(yè)務快速訪問和獨享訪問提供了先決條件,。如可以指定某特定“業(yè)務數(shù)據(jù)庫”僅為某個或幾個特定客戶端服務提供“讀”訪問,。
因為設計了統(tǒng)一、標準的增,、刪,、改、查的過程方法或API,,前端開發(fā)人員甚至不必寫任何SQL語句就可以完成對數(shù)據(jù)庫中表或視圖的操作,,可以大大地縮短編程和調(diào)試時間。
需要指出的是,,雖然“系統(tǒng)服務總線”具有“自我修復”和“自我復制”的特點,,但因為“節(jié)點”硬件故障或“授權/控制數(shù)據(jù)庫”(或/配置文件)或“日志數(shù)據(jù)庫”故障而引起的全系統(tǒng)不可用依然存在,因此,,建議該節(jié)點采用性能好,、可靠性高的中,、高端服務器。
參考文獻
[1] Mostofa Abd-El-Barr. Design and analysis of reliable and fault-tolerant computer systems[M]. London: Imperial College Press,, 2006.
[2] KOREN I,, KRISHNA C M. Fault-tolerant systems[M]. Morgan Kaufmann Publishers, 2007.
[3] Hoang Pham. Handbook of reliability engineering[M]. Springer,,2003.
[4] MARCUS E,, STERN H. Blueprints for high availability. 2nd, edition. John wiley&Sons,, 2003.