李 勇
(92941部隊(duì)96分隊(duì) 葫蘆島 125001)
?
基于Linux的雙機(jī)熱備系統(tǒng)研究與設(shè)計(jì)*
李 勇
(92941部隊(duì)96分隊(duì) 葫蘆島 125001)
為提高Linux系統(tǒng)下軟件的高可用性,研究了雙機(jī)熱備技術(shù),分析了Linux內(nèi)核機(jī)制,設(shè)計(jì)了Linux系統(tǒng)下的雙機(jī)熱備系統(tǒng)架構(gòu),完成了模塊化設(shè)計(jì),并提供了對外的接口。
雙機(jī)熱備; 高可用; Linux; 模塊化
Class Number TP319
隨著網(wǎng)絡(luò)和信息技術(shù)的發(fā)展,信息系統(tǒng)集成度不斷增大,面對的風(fēng)險(xiǎn)也越來越多,一個(gè)硬件或軟件故障都可能導(dǎo)致網(wǎng)絡(luò)癱瘓、系統(tǒng)崩潰,對企業(yè)造成損失,因此提高系統(tǒng)的高可用性成為最迫切解決的問題[1]。目前高可用解決方案有集群和雙機(jī)熱備兩種。集群技術(shù)將多臺服務(wù)器虛擬成一臺服務(wù)器并對外提供服務(wù),具有負(fù)載均衡能力,適合大型和超大型系統(tǒng)[2]。雙機(jī)熱備系統(tǒng)以其低成本、操作簡潔的優(yōu)勢成為中小系統(tǒng)的首要選擇。
2.1 雙機(jī)熱備簡介
雙機(jī)熱備是在互為備份的兩臺服務(wù)器上共同執(zhí)行同一服務(wù),一臺服務(wù)器處于服務(wù)的工作狀態(tài)(主機(jī)),另一臺服務(wù)器處于備用狀態(tài)(備機(jī))[3]。正常情況下,主機(jī)對外提供服務(wù),備機(jī)監(jiān)視主機(jī)的狀態(tài)。當(dāng)主機(jī)因某種故障而不能繼續(xù)提供服務(wù)時(shí),備機(jī)接管主機(jī)的工作。
是否采用雙機(jī)熱備,取決于服務(wù)的重要性以及中斷對服務(wù)的影響。關(guān)鍵服務(wù)不容忍長時(shí)間的服務(wù)中斷,需要通過雙機(jī)熱備來保證系統(tǒng)長期、可靠的運(yùn)行[4]。
2.2 雙機(jī)熱備系統(tǒng)工作模式分析
雙機(jī)熱備系統(tǒng)一般有雙工、主從和雙機(jī)互備三種工作模式[5]。
在雙工模式中,兩臺服務(wù)器同時(shí)運(yùn)行同樣的應(yīng)用,對外提供同樣的服務(wù),彼此獨(dú)立運(yùn)行。當(dāng)一臺服務(wù)器出現(xiàn)故障時(shí),對外服務(wù)也不會中斷。因?yàn)閮煞?wù)器都實(shí)時(shí)運(yùn)行,不存在服務(wù)切換問題,但是需要增加I/O設(shè)備通信開銷。由于兩臺服務(wù)器相互獨(dú)立,難以保證邏輯控制的統(tǒng)一,也不符合“數(shù)出一源”的原則。
主從模式是指使用兩臺或兩臺以上的服務(wù)器,一臺作為主機(jī),對外提供服務(wù)。其他作為備機(jī),運(yùn)行與主機(jī)一樣的應(yīng)用,但是處于備用狀態(tài)。當(dāng)主機(jī)出現(xiàn)故障時(shí),備機(jī)變?yōu)橹鳈C(jī),使對外服務(wù)在短時(shí)間內(nèi)恢復(fù)。
雙機(jī)互備模式中,兩臺服務(wù)器分別運(yùn)行不同的應(yīng)用,彼此互為備機(jī)[6]。當(dāng)一臺服務(wù)器出現(xiàn)故障時(shí),另一臺服務(wù)器接管應(yīng)用,同時(shí)運(yùn)行兩個(gè)應(yīng)用。這是主從模式的擴(kuò)展,避免了兩個(gè)應(yīng)用使用四臺服務(wù)器。此方式存在性能瓶頸,即一臺服務(wù)器同時(shí)運(yùn)行兩個(gè)應(yīng)用,負(fù)載過大。
2.3 雙機(jī)熱備系統(tǒng)數(shù)據(jù)存儲方式分析
數(shù)據(jù)是服務(wù)的基礎(chǔ),是服務(wù)遷移的前提。在雙機(jī)熱備系統(tǒng)中,數(shù)據(jù)存儲方式有存儲共享和存儲隔離兩種方式[7]。
在存儲共享方式中,兩臺服務(wù)器所有數(shù)據(jù)存儲在一個(gè)公共的存儲空間。通過權(quán)限控制及策略,兩臺服務(wù)器可訪問所有的數(shù)據(jù)。數(shù)據(jù)源的單一性確保了兩臺服務(wù)器數(shù)據(jù)的一致性。
在存儲隔離方式中,兩臺服務(wù)器使用私有的存儲空間存儲各自的數(shù)據(jù),服務(wù)器通過數(shù)據(jù)鏈路將新產(chǎn)生的數(shù)據(jù)同步到備機(jī)。
3.1 Linux系統(tǒng)簡介
Linux系統(tǒng)是一個(gè)開源的、與Unix兼容的操作系統(tǒng)。經(jīng)過多年發(fā)展,Linux已成為一個(gè)功能強(qiáng)大性能穩(wěn)定的通用操作系統(tǒng),大部分Unix上的應(yīng)用程序都已經(jīng)移植到Linux之上[8]。由于它的成熟和開放性,Linux在服務(wù)器市場占有較大份額。
3.2 Linux內(nèi)核架構(gòu)分析
Linux內(nèi)核只是Linux操作系統(tǒng)一部分,運(yùn)行在內(nèi)核空間,具有最高的級別,管理系統(tǒng)的所有硬件設(shè)備;應(yīng)用程序運(yùn)行在用戶態(tài),級別最低,不能直接訪問硬件資源,只能通過系統(tǒng)調(diào)用來間接訪問硬件資源,如圖1所示。
圖1 Linux內(nèi)核結(jié)構(gòu)
Linux內(nèi)核主要包含進(jìn)程管理、內(nèi)存管理、虛擬文件系統(tǒng)、網(wǎng)絡(luò)系統(tǒng)、IPC、設(shè)備驅(qū)動(dòng)程序等幾個(gè)部分[9]。進(jìn)程管理負(fù)責(zé)管理CPU資源,按照策略讓各個(gè)進(jìn)程都能使用CPU資源;內(nèi)存管理負(fù)責(zé)管理內(nèi)存資源,以便各個(gè)進(jìn)程都能使用有限的內(nèi)存資源;虛擬文件系統(tǒng)管理將外設(shè)(硬盤、磁盤、軟盤、打印機(jī)等設(shè)備)抽象成為文件,通過統(tǒng)一的文件操作接口訪問;網(wǎng)絡(luò)服務(wù)負(fù)責(zé)管理網(wǎng)絡(luò)設(shè)備,支持多種網(wǎng)絡(luò)標(biāo)準(zhǔn);IPC負(fù)責(zé)Linux系統(tǒng)中進(jìn)程間的通信。此外,Linux系統(tǒng)支持模塊編程,可以將軟件作為一個(gè)模塊插入Linux內(nèi)核,進(jìn)行內(nèi)核級的開發(fā)[10]。
在主從模式下,主機(jī)不斷地發(fā)送心跳包給備機(jī),若備機(jī)或心跳線路出現(xiàn)故障,主機(jī)無法察覺。在這種情況下主機(jī)故障,系統(tǒng)服務(wù)無法遷移到備機(jī)。雙心跳線路可避免單條線路失效的風(fēng)險(xiǎn)。
為了保持對外服務(wù)接口的一致性,系統(tǒng)采用虛擬IP技術(shù)。兩臺服務(wù)器都有獨(dú)立的IP地址,但是對外服務(wù)公用一個(gè)虛擬IP地址。虛擬IP由主機(jī)擁有,當(dāng)服務(wù)遷移時(shí),虛擬IP也隨之漂移到新的主機(jī)上。硬件連接如圖2所示。
圖2 基于Linux雙機(jī)熱備系統(tǒng)硬件拓?fù)鋱D
在軟件設(shè)計(jì)上,將雙機(jī)熱備設(shè)計(jì)成多個(gè)功能模塊。利用Linux模塊加載原理,將模塊加載到內(nèi)核,完成雙機(jī)熱備功能。從功能上看,軟件包括基礎(chǔ)服務(wù)、故障診斷與處理、數(shù)據(jù)管理、對外接口四個(gè)功能模塊,如圖3所示。
圖3 軟件結(jié)構(gòu)
5.1 基礎(chǔ)服務(wù)模塊設(shè)計(jì)
基礎(chǔ)服務(wù)模塊負(fù)責(zé)建立并維護(hù)兩臺服務(wù)器的主備狀態(tài),雙機(jī)熱備系統(tǒng)狀態(tài)結(jié)構(gòu)如下所示
typedef struct _DUP_STATUS{
unsigned char StatusOfThis; //本機(jī)狀態(tài)
unsigned char StatusOfOther;//另一臺服務(wù)器狀態(tài)
unsigned char Line1Status;//心跳線路1狀態(tài)
unsigned char Line2Status;//心跳線路2狀態(tài)
unsigned char Line3Status;//數(shù)據(jù)線路狀態(tài)
unsigned char SoftStatusOfThis;//本機(jī)關(guān)鍵軟件狀態(tài)
unsigned char NetStatusOfThis;//本機(jī)網(wǎng)絡(luò)連接狀態(tài)
unsigned char Mode;//雙工模式
unsigned char SoftStatusOfOther;//另一臺服務(wù)器關(guān)鍵軟件狀態(tài)
unsigned char NetStatusOfOther;//另一臺服務(wù)器網(wǎng)絡(luò)連接狀態(tài)
}DUP_STATUS, *PDUP_STATUS;
服務(wù)器啟動(dòng)時(shí),雙機(jī)熱備基礎(chǔ)服務(wù)模塊根據(jù)配置信息及另一臺服務(wù)器的狀態(tài)確定本機(jī)的狀態(tài)。一臺服務(wù)器可配置為主機(jī)、備機(jī)或先啟動(dòng)者為主機(jī)。當(dāng)一臺服務(wù)器配置為主機(jī)或先啟動(dòng)者為主機(jī)時(shí),若另一臺服務(wù)器的狀態(tài)不是主機(jī),則它啟動(dòng)后就為主機(jī),否則就為副機(jī)。當(dāng)一臺服務(wù)器配置為副機(jī)時(shí),若另一臺服務(wù)器的狀態(tài)不是副機(jī),則它啟動(dòng)后就為副機(jī),否則就為主機(jī)。
主備機(jī)通過定期發(fā)送心跳包來確定彼此的狀態(tài),心跳包格式如圖4所示,各字段含義如下:
總長:表示心跳包總長度,心跳包長度固定為10B。
源ID和目的ID:標(biāo)識主機(jī)與備機(jī)的心跳線路1、線路2。
序號:用于心跳包和數(shù)據(jù)包的計(jì)數(shù)。
SGS:表示本機(jī)的雙工熱備狀態(tài),包括主用、備用和雙工三種狀態(tài)。
XL1、XL2、XL3:表示心跳線路1、線路2和數(shù)據(jù)傳輸線路的狀態(tài)。
網(wǎng)絡(luò)狀態(tài):表示服務(wù)器連接網(wǎng)絡(luò)狀態(tài)。
關(guān)鍵事件狀態(tài):表示服務(wù)器上系統(tǒng)服務(wù)的狀態(tài)。
圖4 心跳協(xié)議包格式
5.2 故障監(jiān)測模塊設(shè)計(jì)與實(shí)現(xiàn)
為了能及時(shí)發(fā)現(xiàn)各種錯(cuò)誤,提高服務(wù)的可用性,采用基于雙心跳線路的心跳監(jiān)測協(xié)議機(jī)制,如圖5所示。本模塊會記錄所有心跳信息,作為故障診斷的依據(jù)。
圖5 雙機(jī)熱備心跳線路
本模塊會啟動(dòng)三個(gè)監(jiān)聽線程,線程1與關(guān)鍵服務(wù)構(gòu)成服務(wù)器系統(tǒng)內(nèi)部的心跳鏈路,線程2和線程3分別維護(hù)一條主機(jī)與備機(jī)之間的心跳鏈路,心跳包發(fā)送周期和故障診斷周期由配置文件確定;通過監(jiān)測心跳包,可獲得本機(jī)和它機(jī)的綜合狀態(tài),從而進(jìn)行故障定位和處理。本模塊可以定位和處理的故障有心跳線路故障、網(wǎng)絡(luò)連接故障、服務(wù)器故障和關(guān)鍵服務(wù)故障四類。
心跳線路故障:當(dāng)服務(wù)器在故障診斷周期內(nèi)只能收到一條來自另一臺服務(wù)器的心跳包,則另一條心跳鏈路故障,主備機(jī)重啟心跳線程,替代故障線程。
網(wǎng)絡(luò)連接故障:主機(jī)定期向交換機(jī)發(fā)送ICMP數(shù)據(jù)包,若主機(jī)故障診斷周期內(nèi)沒有收到應(yīng)答,則認(rèn)為網(wǎng)絡(luò)連接故障,進(jìn)行主備機(jī)服務(wù)切換。
服務(wù)器故障:服務(wù)器在故障診斷周期內(nèi)收不到另一臺服務(wù)器的心跳包,則認(rèn)為服務(wù)器故障,進(jìn)行雙工切換。
關(guān)鍵服務(wù)故障:在一個(gè)故障診斷周期內(nèi),通過解析心跳包,發(fā)現(xiàn)關(guān)鍵服務(wù)字段為異常,則主機(jī)關(guān)鍵服務(wù)故障,進(jìn)行主備機(jī)服務(wù)切換。
5.3 數(shù)據(jù)管理模塊設(shè)計(jì)
在關(guān)鍵服務(wù)軟件運(yùn)行過程中,會產(chǎn)生很多重要數(shù)據(jù)。借助這些數(shù)據(jù),關(guān)鍵服務(wù)可恢復(fù)到故障前的狀態(tài),降低主副機(jī)切換的損失。本模塊通過數(shù)據(jù)定期同步技術(shù)實(shí)現(xiàn)備機(jī)與主機(jī)間重要數(shù)據(jù)的一致。傳輸數(shù)據(jù)的格式如圖6所示,各字段含義如下:
總長:表示數(shù)據(jù)包總長度,心跳包長度不固定。
源ID和目的ID:標(biāo)識主機(jī)與備機(jī)的數(shù)據(jù)線路。
序號:用于數(shù)據(jù)包的計(jì)數(shù)。
ACK、SYN、ERR:數(shù)據(jù)傳輸?shù)目刂茦?biāo)志。
圖6 數(shù)據(jù)協(xié)議包格式
數(shù)據(jù)傳輸采用文件緩存技術(shù),具體流程如圖7所示。將獲取的數(shù)據(jù)構(gòu)造成傳輸數(shù)據(jù)包,發(fā)送到對方。若數(shù)據(jù)鏈路異常,則將數(shù)據(jù)放入緩存區(qū),當(dāng)緩存區(qū)滿時(shí),將緩存區(qū)數(shù)據(jù)存入磁盤臨時(shí)文件,并清空緩存區(qū)數(shù)據(jù);等鏈路修復(fù)后,再將臨時(shí)文件和緩存區(qū)數(shù)據(jù)依次發(fā)送出去。
圖7 數(shù)據(jù)傳輸流程
5.4 對外接口模塊設(shè)計(jì)
雙機(jī)熱備軟件為應(yīng)用程序提供了編程接口,應(yīng)用程序可通過編程接口訪問雙機(jī)熱備軟件,下面給出三類主要的接口。
1) 獲取雙工狀態(tài)
int DupGetStatus(DUP_PS_STATUS *pPSStatus);
通過這一接口可獲取系統(tǒng)的雙工狀態(tài),關(guān)鍵軟件確定自身的運(yùn)行狀態(tài)。
2) 狀態(tài)切換
int DupSwitch(void);//請求狀態(tài)切換
int DupSetStatus(unsigned int iStatus);//強(qiáng)制狀態(tài)切換
在運(yùn)行過程中,關(guān)鍵軟件感知本機(jī)的主要部件、主要進(jìn)程運(yùn)行不正?;虬l(fā)生了故障,通過請求切換功能改變系統(tǒng)的雙工狀態(tài)。
3) 等待雙工事件
等待主/副機(jī)狀態(tài)改變編程接口等待主/副機(jī)狀態(tài)改變事件。接口函數(shù)定義如下:
int DupWaitStatusChg(unsigned int *pStatusChanged, DUP_STATUS *pDupStatus, DWORD msTimeOut);
當(dāng)主副機(jī)狀態(tài)改變時(shí),關(guān)鍵軟件通過該接口可獲取系統(tǒng)的雙工狀態(tài)改變信息,從而改變本身的工作狀態(tài)。
雙機(jī)熱備是提高系統(tǒng)高可用性的技術(shù)。本文設(shè)計(jì)并實(shí)現(xiàn)了Linux系統(tǒng)下主從模式的雙機(jī)熱備系統(tǒng)。該系統(tǒng)支持主備機(jī)間數(shù)據(jù)傳輸,為關(guān)鍵服務(wù)的快速恢復(fù)和數(shù)據(jù)備份提供了條件。
[1] 林曉東,劉心松.高可用性系統(tǒng)的研究與實(shí)現(xiàn)[J].電子科技大學(xué)學(xué)報(bào),1997(5):533-538. LIN Xiaodong, LIU Xinsong. Research and implementation of high availability system. Journal of University of Electronic Science and technology of China,1997(5):533-538.
[2] 胡兵全.基于Windows的雙機(jī)熱備系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D].武漢:華中科技大學(xué),2004:12-13. HU Bingquan. Design and implementation of dual computer hot standby system based on [D]. Wuhan: Huazhong University of Science and Technology,2004(5):12-13.
[3] 任振芳.基于Xen虛擬機(jī)的雙機(jī)熱備可用性研究[D].鄭州:鄭州大學(xué),2012:16-17. REN Zhenfang. Research on availability of dual computer hot standby based on Xen virtual machine [D]. Zhengzhou: Zhengzhou University,2012:16-17.
[4] 弗洛伊德.皮耶達(dá)德.高可用性:設(shè)計(jì)、技術(shù)與運(yùn)作過程[M].高廣卿,何鋮,譯.北京:社會科學(xué)文獻(xiàn)出版社,2003:32-33. Freud. Piedade. High availability: design, technology and operation process [M]. Gao Guangqing, osmium, translated. Beijing: Social Science Literature Publishing House,2003:32-33.
[5] 李勝廣,張其善.實(shí)現(xiàn)Linux防火墻系統(tǒng)雙機(jī)熱備的方法[J].計(jì)算機(jī)與數(shù)字工程,2006,34(3):77-78. LI Shengguang, ZHANG Qishan. The method of dual computer hot standby in the Linux firewall system [J]. Computer and digital engineering,2006,34(3):77-78.
[6] 謝斌,高揚(yáng).Linux高可用集群心跳機(jī)制研究[J].計(jì)算機(jī)工程與應(yīng)用,2004(1):67-68. XIE Bin, GAO yang.high availability cluster heartbeat mechanism Linux. Computer engineering and applications,2004(1):67-68.
[7] 姚耀文,茹建斌,繆炯燁.基于Linux的服務(wù)器群集方案[J].計(jì)算機(jī)工程,2001,27(4):139-140. YAO Yaowen, RU Jianbin, MIAO Jiongye. Linux server cluster scheme based on [J]. Computer Engineering,2001,27(4):139-140.
[8] 毛德操,胡希明.Linux內(nèi)核源代碼情景分析[M].杭州:浙江大學(xué)出版社,2003:273-274. MAO Decao, HU Ximing.Linux kernel source code scenario analysis[M]. Hangzhou: Zhejiang University press,2003:273-274.
[9] 賴娟.Linux內(nèi)核分析及實(shí)時(shí)性改造[D].武漢:華中科技大學(xué),2007:32-33. LAI Juan.Linux kernel analysis and real time transformation of [D]. Wuhan: Huazhong University of Science and Technology,2007:32-33.
[10] 孫海彬,傅謙,徐良賢.Linux內(nèi)核模塊的實(shí)現(xiàn)機(jī)制[J].微型機(jī)與應(yīng)用,2000,11(2):10-11. SUN Haibin, FU Qian, XU Liangxian.Linux kernel module implementation mechanism [J]. Microcomputer and application,2000,11(2):10-11.
Research and Design of Dual Computer Hot Standby System Based on Linux
LI Yong
(Unit 96, No 92941 Troops of PLA, Huludao 125001)
In order to improve the high availability of software based on Linux system, the hot standby technology is studied, the mechanism of Linux kernel is analyzed, the architecture of dual machine hot standby system based on Linux system is designed, the modular design is completed, and the call interface of the system is provided.
hot standby, high availability, Linux, modularization
2016年5月4日,
2016年6月25日
李勇,男,碩士研究生,工程師,研究方向:計(jì)算機(jī)應(yīng)用軟件、系統(tǒng)安全。
TP319
10.3969/j.issn.1672-9722.2016.11.041