劉曉萍 劉利 曹紀(jì)東 胡湘華 黃雙臨 胡光明
北京環(huán)球應(yīng)用開(kāi)發(fā)中心 北京 100094
為提高軟件運(yùn)行的可靠性,通常采用的方法是將軟件分別部署在兩臺(tái)或多臺(tái)計(jì)算機(jī)上,利用專用雙工軟件構(gòu)成雙工系統(tǒng)或計(jì)算機(jī)集群系統(tǒng),在單臺(tái)計(jì)算機(jī)出現(xiàn)故障時(shí),雙工軟件進(jìn)行故障判斷并進(jìn)行切換,以保障軟件能夠不間斷運(yùn)行。群機(jī)冗余是提高計(jì)算機(jī)系統(tǒng)可靠性的有效途徑。在工程實(shí)現(xiàn)中,雙機(jī)熱備是性能價(jià)格比最理想的方案,被廣泛應(yīng)用在航天、軍事、金融等關(guān)鍵任務(wù)領(lǐng)域。
實(shí)現(xiàn)雙工熱備有兩種選擇,一種是采購(gòu)目前市場(chǎng)上銷(xiāo)售的商用雙工熱備軟件(如RoseHA等),另一種是自行設(shè)計(jì)開(kāi)發(fā)。比較典型的商用雙機(jī)容錯(cuò)系統(tǒng),如Compaq Trucluster系統(tǒng)、HP雙機(jī)雙控容錯(cuò)系統(tǒng)、LEGATO Co-Standby Server系統(tǒng)、SteelEye LifeKeeper系統(tǒng)和Rose HA系統(tǒng)等,其關(guān)鍵結(jié)構(gòu)均采用雙機(jī)系統(tǒng)的熱備方式,在通過(guò)高速網(wǎng)絡(luò)或磁盤(pán)陣列進(jìn)行互聯(lián)的基礎(chǔ)上,實(shí)現(xiàn)基于磁盤(pán)鏡像或磁盤(pán)陣列的軟硬件容錯(cuò)系統(tǒng),提供通用的可靠性解決方案。但是,這些系統(tǒng)的故障檢測(cè)時(shí)間比較長(zhǎng)(根據(jù)應(yīng)用和故障類(lèi)型的不同,時(shí)間有所不同):通過(guò)實(shí)際應(yīng)用和測(cè)試,當(dāng)系統(tǒng)出現(xiàn)故障時(shí),雙機(jī)切換時(shí)間都在10秒級(jí)、甚至數(shù)分鐘,從而導(dǎo)致系統(tǒng)處理的“斷流”現(xiàn)象。商用的雙工熱備軟件不是針對(duì)我們這種高實(shí)時(shí)的應(yīng)用開(kāi)發(fā)的,其實(shí)時(shí)性較低,切換時(shí)間較長(zhǎng)。
因此,針對(duì)衛(wèi)星導(dǎo)航定位系統(tǒng)這種對(duì)實(shí)時(shí)性、可靠性要求高,需要不間斷進(jìn)行數(shù)據(jù)處理的關(guān)鍵任務(wù)系統(tǒng),如何保證雙機(jī)容錯(cuò)系統(tǒng)的強(qiáng)實(shí)時(shí)性、高可靠性和服務(wù)“不斷流”,是其中的關(guān)鍵技術(shù)難點(diǎn)。
在衛(wèi)星導(dǎo)航系統(tǒng)中,由于系統(tǒng)的可靠性要求很高,必然需要利用雙工技術(shù)來(lái)保障系統(tǒng)的連續(xù)運(yùn)行。但是由于衛(wèi)星導(dǎo)航系統(tǒng)數(shù)據(jù)處理量大、實(shí)時(shí)性要求高,所以對(duì)專用雙工切換軟件提出了更高的要求。
服務(wù)器的故障可能由各種原因引起,如硬件設(shè)備故障、操作系統(tǒng)故障、業(yè)務(wù)軟件故障等等。為了達(dá)到系統(tǒng)的可用性和可靠性指標(biāo),商用軟件這顯然是不能滿足要求的,我們采用雙機(jī)自行開(kāi)發(fā)的冗余互為熱備容錯(cuò)方案。
雙機(jī)熱備系統(tǒng)的硬件組成如圖1所示。兩臺(tái)服務(wù)器通過(guò)兩條專用連接進(jìn)行互連。專用連接用于傳輸服務(wù)器的心跳信息,以及雙機(jī)交互信息(特征碼、雙機(jī)切換請(qǐng)求和應(yīng)答以及在系統(tǒng)恢復(fù)時(shí)傳送恢復(fù)計(jì)算所需的數(shù)據(jù))。
圖1 雙機(jī)熱備的系統(tǒng)組成
服務(wù)器心跳信息和雙機(jī)間交互信息的數(shù)據(jù)量不大,但實(shí)時(shí)性要求高,因此雙機(jī)專用連接需要選用帶寬高、延遲小的產(chǎn)品。千兆以太網(wǎng)和基于InfiniBand標(biāo)準(zhǔn)的主機(jī)通道適配器(HCA)都具有帶寬高、延遲小的特點(diǎn)。但由于InfiniBand HCA的帶寬更高、延遲更小(數(shù)據(jù)如表1所示),并且占用的CPU資源更少,因此作為首選。同時(shí),可以采用兩條千兆以太網(wǎng)連接作為備份鏈路,當(dāng)InfiniBand HCA發(fā)生故障時(shí)切換使用以太網(wǎng)線發(fā)送心跳信息和雙機(jī)交互信息。
表1 千兆以太網(wǎng)與InfiniBand HCA性能比較
針對(duì)系統(tǒng)的數(shù)據(jù)庫(kù)應(yīng)用需求,結(jié)合數(shù)據(jù)庫(kù)集群的雙機(jī)熱備系統(tǒng)如圖2所示。數(shù)據(jù)庫(kù)集群可以采用Oracle 10g的RAC(Real Application Cluster)軟件及Oracle Cluster Ready軟件等,使用共享磁盤(pán)陣列進(jìn)行數(shù)據(jù)存儲(chǔ)。系統(tǒng)正常工作狀態(tài)下,兩臺(tái)服務(wù)器同時(shí)接收并處理待存檔的數(shù)據(jù),由主機(jī)負(fù)責(zé)數(shù)據(jù)入庫(kù)、數(shù)據(jù)備案及向外提供數(shù)據(jù)服務(wù)等工作,由數(shù)據(jù)庫(kù)集群負(fù)責(zé)數(shù)據(jù)庫(kù)本身負(fù)載均衡。當(dāng)主機(jī)出現(xiàn)故障時(shí),所有任務(wù)由備機(jī)獨(dú)立承擔(dān),實(shí)現(xiàn)數(shù)據(jù)服務(wù)的連續(xù)運(yùn)行。因?yàn)閮膳_(tái)服務(wù)器共享同一數(shù)據(jù)庫(kù),因此在故障時(shí)能保證入庫(kù)數(shù)據(jù)的一致性。
圖2 結(jié)合數(shù)據(jù)庫(kù)集群的雙機(jī)熱備系統(tǒng)組成
在雙機(jī)熱備工作模式下,兩臺(tái)配置相同的服務(wù)器構(gòu)成一個(gè)機(jī)組,一臺(tái)為主機(jī),另一臺(tái)為備機(jī)(如圖 3所示)。雙機(jī)運(yùn)行相同的軟件,使用相同的參數(shù)配置,接收相同的數(shù)據(jù),進(jìn)行相同的數(shù)據(jù)處理,Oracle數(shù)據(jù)庫(kù)集群負(fù)責(zé)數(shù)據(jù)庫(kù)本身負(fù)載均衡。但只有主機(jī)才能輸出計(jì)算結(jié)果,備機(jī)不向外輸出。主機(jī)故障后,備機(jī)接替主機(jī)的工作成為新主機(jī),獨(dú)立承擔(dān)所有實(shí)時(shí)任務(wù),實(shí)現(xiàn)數(shù)據(jù)服務(wù)的連續(xù)運(yùn)行,主機(jī)切出并在修復(fù)后切入成為新備機(jī)。備機(jī)故障后,主機(jī)狀態(tài)不發(fā)生改變,備機(jī)切出并在修復(fù)后切入。
圖3 雙機(jī)熱備軟件組成
1.2.1 狀態(tài)切換
在主機(jī)發(fā)生故障的情況下,雙機(jī)熱備系統(tǒng)自動(dòng)切換原副機(jī)為主機(jī),接替原主機(jī)完成任務(wù)。當(dāng)故障機(jī)修復(fù)后,可重新加入雙機(jī)系統(tǒng)。
在副機(jī)發(fā)生故障的情況下,主機(jī)仍維持主機(jī)狀態(tài),其處理不受影響,繼續(xù)完成任務(wù),雙機(jī)熱備軟件將告警,但不發(fā)生切換。當(dāng)副機(jī)修復(fù)后,可重新加入雙機(jī)系統(tǒng)。
狀態(tài)切換策略可通過(guò)狀態(tài)管理進(jìn)行設(shè)置。
1.2.2 實(shí)時(shí)性
雙機(jī)熱備方案的實(shí)時(shí)性由兩部分構(gòu)成:故障檢測(cè)的實(shí)時(shí)性和狀態(tài)切換的實(shí)時(shí)性。單機(jī)故障的情況很多,歸納起來(lái)有三種:服務(wù)器硬件故障,網(wǎng)絡(luò)設(shè)備故障以及應(yīng)用軟件故障。
服務(wù)器硬件故障可以細(xì)分為部件故障和整機(jī)故障。本方案采用心跳機(jī)制來(lái)檢測(cè)整機(jī)故障。備機(jī)上的熱備服務(wù)模塊每隔10ms在兩個(gè)專用連接上監(jiān)測(cè)主機(jī)的心跳。當(dāng)備機(jī)在50ms內(nèi)收不到主機(jī)的應(yīng)答時(shí),認(rèn)為主機(jī)已故障,備機(jī)就切換為主機(jī),接管向外輸出信息的任務(wù)。這樣可以保證故障檢測(cè)時(shí)間≤50ms。部件故障是通過(guò)系統(tǒng)監(jiān)護(hù)模塊檢測(cè)的,通過(guò)定期對(duì)系統(tǒng)部件、進(jìn)程的檢測(cè),可以獲取各部件、進(jìn)程的狀態(tài),檢測(cè)周期定為30ms。系統(tǒng)監(jiān)護(hù)模塊判斷故障的時(shí)間<1ms,這樣故障檢測(cè)時(shí)間≤50ms。
網(wǎng)絡(luò)設(shè)備故障會(huì)引起進(jìn)程無(wú)法獲得數(shù)據(jù)或發(fā)送數(shù)據(jù),通過(guò)特征碼機(jī)制,可以在<50ms的周期里判斷出接收數(shù)據(jù)失敗,發(fā)送數(shù)據(jù)失敗可以立即判斷出來(lái),加上重發(fā)超時(shí),也可以保證檢測(cè)時(shí)間≤50ms。
業(yè)務(wù)軟件的故障包括軟件崩潰、計(jì)算錯(cuò)誤、CPU占用過(guò)高、內(nèi)存占用過(guò)高、磁盤(pán)占用過(guò)高等。系統(tǒng)監(jiān)護(hù)和業(yè)務(wù)管理通過(guò)定期握手、狀態(tài)查詢等手段,收集業(yè)務(wù)軟件的狀態(tài)信息,檢測(cè)周期定為30ms。系統(tǒng)監(jiān)護(hù)模塊判斷故障的時(shí)間<1ms,這樣故障檢測(cè)時(shí)間≤50ms。
雙機(jī)狀態(tài)切換分兩種情況:服務(wù)器整機(jī)故障被檢測(cè)出來(lái)時(shí),由備機(jī)的雙機(jī)熱備服務(wù)模塊直接切換,并將雙機(jī)狀態(tài)通知業(yè)務(wù)管理,由于是本地調(diào)用,切換時(shí)間<1ms;其它故障被檢測(cè)出來(lái)時(shí),由系統(tǒng)監(jiān)護(hù)模塊發(fā)送軟硬件故障信息到相應(yīng)的熱備服務(wù)模塊,延遲<0.5ms,熱備服務(wù)模塊向備機(jī)的熱備服務(wù)模塊發(fā)送切換請(qǐng)求,并獲得答復(fù),延遲<1ms,熱備服務(wù)模塊將雙機(jī)狀態(tài)通知業(yè)務(wù)管理執(zhí)行信息輸出切換,切換時(shí)間<0.5ms。由于備機(jī)是一直正常運(yùn)行,切換后數(shù)據(jù)直接發(fā)送,存在的延遲主要是因?yàn)樵诠收洗_認(rèn)的期間,可能會(huì)有部分待發(fā)送數(shù)據(jù)因沒(méi)有收到特征碼而緩存在待發(fā)送隊(duì)列,這時(shí)需要將其全部發(fā)送出去。信息處理平臺(tái)的業(yè)務(wù)計(jì)算是數(shù)據(jù)驅(qū)動(dòng)的,產(chǎn)生的數(shù)據(jù)量與接收的數(shù)據(jù)量在同一個(gè)數(shù)量級(jí)上,即每個(gè)分系統(tǒng)產(chǎn)生的數(shù)據(jù)小于10包/秒,因此,在50ms內(nèi)產(chǎn)生的待發(fā)送數(shù)據(jù)不會(huì)大于10包,發(fā)送耗時(shí)<10ms。
1.2.3 數(shù)據(jù)同步
為了減少系統(tǒng)對(duì)錯(cuò)誤的響應(yīng)時(shí)間,雙機(jī)之間通訊采用InfiniBand高速通訊卡,通訊卡由PCI直接和總線通訊,可采用MPI庫(kù),比千兆以太網(wǎng)具備更高的帶寬和更小的延遲,可以用于雙機(jī)之間狀態(tài)的一致性檢查、同步以及消息的發(fā)送。
雙機(jī)切換過(guò)程不可避免的引入延遲,在高實(shí)時(shí)、高可靠性系統(tǒng)中,必須保證系統(tǒng)服務(wù)的連續(xù)和完整,即不會(huì)因?yàn)榍袚Q引起數(shù)據(jù)的丟失。在本方案中,通過(guò)特征碼機(jī)制來(lái)保證數(shù)據(jù)一致性。熱備服務(wù)負(fù)責(zé)接收業(yè)務(wù)管理發(fā)送來(lái)的特征碼并發(fā)送到對(duì)方。業(yè)務(wù)管理根據(jù)特征碼,確認(rèn)接收數(shù)據(jù)是否完整和發(fā)送數(shù)據(jù)是否成功。
當(dāng)服務(wù)器切入時(shí),重建計(jì)算環(huán)境需要一定的配置數(shù)據(jù)和累積一定時(shí)間的業(yè)務(wù)數(shù)據(jù)。為了保證切入的服務(wù)器的計(jì)算能盡快和主機(jī)保持同步,熱備服務(wù)負(fù)責(zé)根據(jù)業(yè)務(wù)管理的需求來(lái)傳送配置數(shù)據(jù)和業(yè)務(wù)數(shù)據(jù),寫(xiě)入本機(jī)的動(dòng)態(tài)數(shù)據(jù)區(qū)和靜態(tài)數(shù)據(jù)區(qū)。
1.2.4 時(shí)間同步
在系統(tǒng)狀態(tài)的保持和恢復(fù)過(guò)程中,時(shí)間同步是非常重要的,為此系統(tǒng)采用了專門(mén)硬件時(shí)鐘(原子鐘)為基準(zhǔn)的時(shí)間信號(hào),通過(guò)時(shí)頻信號(hào)送達(dá)計(jì)算機(jī),供計(jì)算機(jī)校準(zhǔn)本地時(shí)鐘,高精準(zhǔn)的時(shí)鐘為雙工同步提供了很好的時(shí)間信號(hào),可以為主備機(jī)切換和恢復(fù)提供精準(zhǔn)的時(shí)間戳,給系統(tǒng)狀態(tài)時(shí)間定位以及實(shí)時(shí)容錯(cuò)、快速恢復(fù)提供可能。
實(shí)時(shí)時(shí)鐘和定時(shí)器能夠提供極小的時(shí)間間隔來(lái)控制與調(diào)度任務(wù)和事件的執(zhí)行和發(fā)生。系統(tǒng)實(shí)時(shí)時(shí)鐘能提供微妙或納秒級(jí)的時(shí)間分辨率,從而可以控制應(yīng)用軟件中的進(jìn)程或線程在精確的時(shí)間間隔內(nèi)激活運(yùn)行。同時(shí)還可以利用實(shí)時(shí)時(shí)鐘和定時(shí)器并結(jié)合采用信號(hào)機(jī)制,對(duì)應(yīng)用軟件中有關(guān)時(shí)間間隔要求嚴(yán)格的軟件接口和程序進(jìn)行控制。
(1)模擬副機(jī)軟件故障,殺死副機(jī)運(yùn)行的某個(gè)進(jìn)程,如數(shù)據(jù)接收進(jìn)程RCV。
測(cè)試結(jié)果:主機(jī)正常工作。
(2)模擬主機(jī)硬件故障,殺死主機(jī)上運(yùn)行的所有進(jìn)程。
測(cè)試結(jié)果:副機(jī)雙工進(jìn)程報(bào)警:“未收到心跳信息,請(qǐng)檢查”,同時(shí)自動(dòng)將本機(jī)設(shè)為“主機(jī)”,并向?qū)Ψ桨l(fā)送含有奪權(quán)信息的心跳信息。
(3)模擬主機(jī)軟件故障,殺死主機(jī)上運(yùn)行的某個(gè)進(jìn)程,如數(shù)據(jù)接收進(jìn)程RCV。
測(cè)試結(jié)果:主機(jī)雙工進(jìn)程檢測(cè)到本機(jī)軟件故障,自動(dòng)將本機(jī)設(shè)為“副機(jī)”,同時(shí)向原副機(jī)發(fā)送委托信息,副機(jī)收到心跳信息中有委托變換工作狀態(tài)信息,將自己設(shè)為“主機(jī)”,完成一次主副切換;數(shù)據(jù)庫(kù)中存儲(chǔ)的數(shù)據(jù)內(nèi)容完整。
經(jīng)過(guò)多次測(cè)試,該雙工熱備模塊的可靠性和實(shí)時(shí)性都能滿足系統(tǒng)的要求,能夠在服務(wù)器發(fā)生軟、硬件故障或收到來(lái)自系統(tǒng)監(jiān)控程序的切換命令時(shí),在要求時(shí)間內(nèi)完成服務(wù)器的切換,保證系統(tǒng)連續(xù)正常工作,數(shù)據(jù)入庫(kù)不中斷。因此,這種雙工熱備策略在系統(tǒng)上的應(yīng)用是成功的。
[1]曾碧卿,陳志剛.服務(wù)器集群系統(tǒng)研究[J].計(jì)算機(jī)應(yīng)用研究.2004.
[2]王晉鵬,潘龍法,李降龍.LVS 集群中的動(dòng)態(tài)反饋調(diào)度[J].計(jì)算機(jī)工程.2005.
[3]章文嵩.Linux服務(wù)器集群技術(shù).[EB/OL].http://www. chinaitlab.com/www/special/juqun.asp.2006.