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