摘要:為了提高分布應(yīng)用的健壯性,通常需要開(kāi)發(fā)人員編寫(xiě)相應(yīng)的容錯(cuò)代碼?,F(xiàn)有的CORBA構(gòu)件模型通過(guò)定義構(gòu)件的端口特征,以組裝的方式實(shí)現(xiàn)代碼的二進(jìn)制級(jí)復(fù)用,它使用戶能夠快速開(kāi)發(fā)和部署分布應(yīng)用。在此基礎(chǔ)上,如何在構(gòu)件模型下快速靈活地建立容錯(cuò)應(yīng)用成為一個(gè)令人關(guān)注的話題。通過(guò)設(shè)計(jì)構(gòu)件模型下的容錯(cuò)體系結(jié)構(gòu),提供了快速靈活開(kāi)發(fā)容錯(cuò)應(yīng)用的機(jī)制,并提出了解決兩種失效類型的容錯(cuò)策略和算法。
關(guān)鍵詞:分布構(gòu)件;容錯(cuò);策略
中圖分類號(hào):TP311.52文獻(xiàn)標(biāo)志碼:A
文章編號(hào):1001-3695(2007)12-0134-03
隨著分布式應(yīng)用的發(fā)展,CORBA作為一種成熟的中間件技術(shù),具有跨操作系統(tǒng)、跨平臺(tái)、跨語(yǔ)言等強(qiáng)大的互操作性,但其復(fù)雜性成為它在企業(yè)中應(yīng)用的主要障礙。分布構(gòu)件技術(shù)以降低中間件平臺(tái)的復(fù)雜性、支持分布式企業(yè)應(yīng)用和代碼的二進(jìn)制重用[1,2]為目標(biāo),已成為中間件技術(shù)的主要發(fā)展方向。1997年6月,CORBA平臺(tái)上的構(gòu)件模型(CORBA component model,CCM )被正式提入OMG組織的研究日程,OMG組織發(fā)布了CCM的RFP;2002年6月,CCM正式成為CORBA 3.0規(guī)范的一部分。在此期間,許多大學(xué)和組織均對(duì)CORBA構(gòu)件技術(shù)進(jìn)行了研究,并開(kāi)發(fā)出了相應(yīng)的原型平臺(tái),如OpenCCM[3,4]、MicoCCM[5]、K2-CCM、EJCCM等。CORBA構(gòu)件模型作為一種企業(yè)計(jì)算中間件還需要具備高可用性,因此,如何在CORBA構(gòu)件模型上建立高可用的系統(tǒng)成為一個(gè)重要的課題。20世紀(jì)90年代,許多大學(xué)設(shè)計(jì)和實(shí)現(xiàn)了基于CORBA平臺(tái)的容錯(cuò)系統(tǒng)。例如Piranha[6]系統(tǒng)通過(guò)在ORB中使用組通信機(jī)制提供冗余對(duì)象的服務(wù);Eternal[7]系統(tǒng)通過(guò)使用截取器(interceptor)來(lái)實(shí)現(xiàn)容錯(cuò);容錯(cuò)CORBA規(guī)范[8]通過(guò)在一個(gè)IOR中封裝多個(gè)profile提供primary-backup容錯(cuò)策略。但是,如何充分利用CORBA構(gòu)件模型的優(yōu)勢(shì),靈活、快速地建立一個(gè)容錯(cuò)系統(tǒng)的研究還很少。
本文從分析構(gòu)件模型的優(yōu)勢(shì)入手,闡述了在分布構(gòu)件模型下快速建立容錯(cuò)系統(tǒng)的主要思想。在此基礎(chǔ)上提出了AARC(assembly architecture based on replicated component)容錯(cuò)體系結(jié)構(gòu),詳細(xì)地描述了如何在AARC結(jié)構(gòu)上建立容錯(cuò)應(yīng)用。最后給出了該結(jié)構(gòu)下的四種實(shí)用的容錯(cuò)算法。
1AARC體系結(jié)構(gòu)
分布構(gòu)件技術(shù)將一個(gè)應(yīng)用劃分為構(gòu)件和容器兩部分。其中構(gòu)件是應(yīng)用的業(yè)務(wù)邏輯,容器提供了應(yīng)用的運(yùn)行和管理環(huán)境。容器概念的引入為應(yīng)用服務(wù)器對(duì)象的容錯(cuò)策略和機(jī)制提供了良好的空間。基于構(gòu)件平臺(tái)的容錯(cuò)策略和機(jī)制的實(shí)現(xiàn)應(yīng)當(dāng)使構(gòu)件的開(kāi)發(fā)者不必編寫(xiě)與容錯(cuò)相關(guān)的代碼就可以選擇多種容錯(cuò)策略,并按照要求生成各種容錯(cuò)代碼。這樣,CCM用戶就可以快速地開(kāi)發(fā)容錯(cuò)應(yīng)用,并聲明他需要使用的由容器提供的容錯(cuò)策略。
基于上述思想,筆者提出了一種基于CCM平臺(tái)的容錯(cuò)體系結(jié)構(gòu)。為方便建模首先給出相關(guān)定義。
定義1管理域Domain=∪ni=0ComponentServeri。應(yīng)用涉及的構(gòu)件服務(wù)器構(gòu)成一個(gè)管理域。
定義2構(gòu)件服務(wù)器ComponentServer={〈Container,Component〉i|0≤i<n|}。構(gòu)件服務(wù)器由多個(gè)容器和構(gòu)件的序偶組成。
定義3容器Container={Policyi|0≤i<n}。容器管理了相應(yīng)構(gòu)件的各種運(yùn)行時(shí)策略。
定義4組裝件Assembly={Componenti,Connectionjk|0≤i, j,k<n}。組裝件由一系列構(gòu)件以及它們之間的連接構(gòu)成。構(gòu)件的組裝是CCM代碼復(fù)用的集中體現(xiàn)。
組裝件是構(gòu)成用戶應(yīng)用的基石,建立具有容錯(cuò)功能的組裝件可以增強(qiáng)應(yīng)用的可用性。因此,在筆者的CCM系統(tǒng)中定義了與容錯(cuò)相關(guān)的策略集FPolicie。其中FPolicies={fail-silent,LMRT-fail-silent,Byzantine,F(xiàn)PoliciesContainer,LMRT-Byzantine}。
定義5容錯(cuò)構(gòu)件ReplicatedComponent={Agent,Componenti|0≤i<n,Componentj=Componentk,0≤j,k<n}。
2AARC的容錯(cuò)研究
在AARC中,利用冗余的構(gòu)件來(lái)提高組裝件的可用性對(duì)CCM的調(diào)用機(jī)制提出了新的要求。對(duì)于處理Byzantine類型的失效需要同時(shí)將請(qǐng)求發(fā)送到多個(gè)冗余的構(gòu)件中才能發(fā)現(xiàn)這種失效并進(jìn)行恢復(fù)。因此,需要將一個(gè)同步的請(qǐng)求分解為多個(gè)異步請(qǐng)求來(lái)達(dá)到多個(gè)請(qǐng)求并行執(zhí)行的目的。文獻(xiàn)[7]中使用了CORBA的異步消息調(diào)用機(jī)制來(lái)完成請(qǐng)求的并行激發(fā)。但是,CORBA的異步調(diào)用機(jī)制由ORB內(nèi)核提供,應(yīng)答處理對(duì)象由ORB管理,這樣很難將一個(gè)冗余的請(qǐng)求與多個(gè)應(yīng)答對(duì)應(yīng)起來(lái)。基于異步消息的冗余機(jī)制需要內(nèi)核的支持,這會(huì)影響系統(tǒng)的互操作性。
筆者提出了一個(gè)基于one way調(diào)用和構(gòu)件事件端口的容錯(cuò)機(jī)制。首先引入一個(gè)特殊的構(gòu)件稱做代理構(gòu)件,它負(fù)責(zé)接收其他構(gòu)件發(fā)送過(guò)來(lái)的調(diào)用請(qǐng)求,并將請(qǐng)求同時(shí)發(fā)送給多個(gè)冗余的服務(wù)構(gòu)件以達(dá)到多個(gè)冗余請(qǐng)求的并行執(zhí)行。代理構(gòu)件還負(fù)責(zé)收集所有的應(yīng)答并進(jìn)行過(guò)濾,最后將正確的結(jié)果返回給調(diào)用者構(gòu)件。例如下面的構(gòu)件描述構(gòu)成組裝件的一部分。組裝件中的其他構(gòu)件會(huì)使用math構(gòu)件的the_comp刻面來(lái)進(jìn)行對(duì)數(shù)運(yùn)算。
interface Compute {
double ln(in long val);
};
component Maths {
privodes Compute the_comp;
};
通過(guò)一個(gè)特殊的容錯(cuò)構(gòu)件編譯器,筆者將這個(gè)構(gòu)件描述映射為一個(gè)容錯(cuò)的IDL 3.0的描述。映射后的構(gòu)件描述如下:
eventtype Ret_Compute_ln {
public CORBA::Cookie cookie;
public double ret;
factory create(in CORBA::Cookie id, in long ret);
};
interface Compute {
oneway void ln(in CORBA::Cookie id, in long val);
};
component Maths {
privodes Compute the_comp;
publishes Ret_Compute_ln
the_ Ret_Compute_ln;
};
此外還要為該容錯(cuò)版本的構(gòu)件映射一個(gè)代理構(gòu)件的描述,代理構(gòu)件封裝了容錯(cuò)邏輯的細(xì)節(jié)。其描述如下:
eventtype Ret_Compute_ln {
public CORBA::Cookie cookie;
public double ret;
factory create(in CORBA::Cookie id, in long ret);
};
interface Compute {
double ln(in CORBA::Cookie id, in long val);
};
component Maths {
privodes Compute the_comp;
consumes Ret_Compute_ln
the_ Ret_Compute_ln;
};
容錯(cuò)應(yīng)用的開(kāi)發(fā)者只需要按照通常方式描述一個(gè)構(gòu)件,并通過(guò)容錯(cuò)工具為構(gòu)件生成容錯(cuò)的IDL 3.0映射和為容錯(cuò)構(gòu)件生成構(gòu)件實(shí)現(xiàn)的包裝類,來(lái)簡(jiǎn)化和加速容錯(cuò)應(yīng)用的開(kāi)發(fā)。在代理構(gòu)件的生成代碼中,容錯(cuò)工具為構(gòu)件的各種策略均生成了相應(yīng)的代碼。容錯(cuò)構(gòu)件在部署和組裝后就可以從容器中獲取相應(yīng)的容錯(cuò)策略來(lái)執(zhí)行相應(yīng)的容錯(cuò)算法。
3AARC的容錯(cuò)算法
本節(jié)討論代理構(gòu)件針對(duì)上述四種容錯(cuò)策略提供的容錯(cuò)算法。為了方便算法描述,本文進(jìn)行如下定義:
a)容錯(cuò)構(gòu)件由n個(gè)副本構(gòu)成,它們刻面的引用分別為 refi。其中0≤i<n。
b)容錯(cuò)構(gòu)件的客戶請(qǐng)求為request,代理構(gòu)件的應(yīng)答為reply。
c)每一個(gè)構(gòu)件的副本應(yīng)答為replyi。其中0≤i<n。
此外,算法中還需要一個(gè)同步變量,它由event標(biāo)志。
3.1針對(duì)fail-silence失效的容錯(cuò)算法
Fail-silence失效也稱做fail-stop失效。當(dāng)一個(gè)構(gòu)件不能工作時(shí),該構(gòu)件不會(huì)對(duì)相應(yīng)的請(qǐng)求給出應(yīng)答。針對(duì)這種失效,筆者提出了相應(yīng)的溫備份算法FSR(fail-silence recovery)。FSR算法如下:
input request, replicated components group
G={refi|0≤i output reply for each replicated component refi∈G create Event send request to refi wait Event if has no system exception then reply ← replyi return reply end if end for throw exception 相應(yīng)的代理構(gòu)件接收應(yīng)答算法RR(reply receive)如下: input notification service event, Event output replyi if no exception received then replyi←retrieve reply form notification service event set Event else exceptioni←system exception set Event end if 算法FSR和RR共同完成單個(gè)構(gòu)件的fail-silence失效恢復(fù)。之所以稱為溫備份是由于處于備份狀態(tài)的構(gòu)件,通常情況下在一次調(diào)用中不接收和處理請(qǐng)求,只有在主構(gòu)件失效時(shí)才參加到處理請(qǐng)求的任務(wù)中。該算法可以處理多個(gè)構(gòu)件副本發(fā)生fail-silence失效的情況。其中失效的同類構(gòu)件副本書(shū)不能大于n-1;否則算法拋出構(gòu)件失效異常。 3.2減少fail-silence失效的平均恢復(fù)時(shí)間 LMRT-fail-silence容錯(cuò)策略針對(duì)fail-silence失效提供了一種最小平均恢復(fù)時(shí)間的容錯(cuò)算法LMRT-FSR(least mean recovery time-Fail-silence recovery),其描述如下: input request, replicated components group G={refi| 0≤ i output reply for each replicated component refi ,refj∈G create Event send request to refi send request to refj wait Event if replyi is not 1 then reply←replyi else if replyj is not 1 reply←replyj end if if reply is not 1 then return reply end if end for throw exception 相應(yīng)的代理構(gòu)件接收應(yīng)答的算法也使用上述RR算法。算法LMRT-FSR和RR 結(jié)合使用,通過(guò)同時(shí)將請(qǐng)求發(fā)送給兩個(gè)構(gòu)件副本的熱備份方法進(jìn)行容錯(cuò)。處理請(qǐng)求的兩個(gè)構(gòu)件副本在本次請(qǐng)求中稱為活躍構(gòu)件。處理請(qǐng)求的兩個(gè)副本中,只要有一個(gè)給出應(yīng)答,代理構(gòu)件就可以將應(yīng)答返回給實(shí)際的調(diào)用者。LMRT-FSR算法在一個(gè)活躍構(gòu)件副本fail-silence失效時(shí)仍然能夠繼續(xù)工作,并且它的平均恢復(fù)時(shí)間t≈0。這是通過(guò)花費(fèi)額外的計(jì)算資源得到的。實(shí)際應(yīng)用中,可以根據(jù)應(yīng)用的需求擴(kuò)大活躍備份構(gòu)件的數(shù)目。 3.3針對(duì)Byzantine失效的容錯(cuò)算法 通常在軟件中,常見(jiàn)的失效除了fail-silence外,還可能發(fā)生Byzantine失效。當(dāng)一個(gè)構(gòu)件發(fā)生Byzantine失效時(shí),它不會(huì)發(fā)生任何異常,也不會(huì)拒絕請(qǐng)求。相反,它會(huì)針對(duì)其請(qǐng)求偶然地給出一個(gè)錯(cuò)誤的應(yīng)答,構(gòu)件的使用者很難發(fā)現(xiàn)構(gòu)件的失效。上述FSR和LMRT-FSR算法不能解決Byzantine失效帶來(lái)的問(wèn)題。針對(duì)前面定義的Byzantine策略,設(shè)計(jì)了一個(gè)恢復(fù)Byzantine失效的容錯(cuò)算法BR,其描述如下: input request, replicated components group G={refi| 0≤i output reply for each replicated component refi ,refj∈G create Event1 create Event2 send request to refi send request to refj wait Event1 wait Event2 if has no exception then if replyi equals replyj then reply←replyi return reply end if end if end for throw exception 算法BR與RR一起可以發(fā)現(xiàn)和恢復(fù)Byzantine失效的構(gòu)件請(qǐng)求。BR通過(guò)比較來(lái)自兩個(gè)活躍構(gòu)件副本的應(yīng)答來(lái)發(fā)現(xiàn)Byzantine失效。一旦發(fā)生失效,則重新執(zhí)行處理過(guò)程。BR算法與LMRT-Fail-silence算法相比,使用了等量的計(jì)算資源。盡管帶來(lái)了額外的應(yīng)答處理開(kāi)銷,但是它卻能夠發(fā)現(xiàn)和恢復(fù)更高級(jí)的失效類型。 3.4降低Byzantine失效容錯(cuò)算法的恢復(fù)時(shí)間 為了達(dá)到更少的平均恢復(fù)時(shí)間,構(gòu)件平臺(tái)提供了一種LMRT-Byzantine策略。這種策略供構(gòu)件的部署者使用,通過(guò)它聲明在失效管理中使用LMRT-BR容錯(cuò)算法。LMRT-BR算法如下: input request, replicated components group G={refi|0≤i output reply for each replicated component refi,refj,refk∈G create Event1, Event2, Event3 send request to refi send request to refj send request to refk wait Event1, Event2,Event3 if has no more than one exception then if replyi equals replyj then reply←replyi return reply else if replyj equals replyk then reply ← replyj return reply else if replyk equals replyi then reply ← replyk return reply end if end if end for throw exception 對(duì)應(yīng)LMRT-BR的應(yīng)答處理算法同RR算法。它通過(guò)增加一次請(qǐng)求中活躍副本的個(gè)數(shù)達(dá)到減少平均恢復(fù)時(shí)間的目的。只要有至少兩個(gè)副本給出應(yīng)答,并且應(yīng)答的結(jié)果相同就可以認(rèn)為執(zhí)行成功。這樣,不僅在最多只有一個(gè)活躍構(gòu)件發(fā)生Byzantine失效的情況恢復(fù)了正確的應(yīng)答,而且平均恢復(fù)時(shí)間t≈0。這極大地提高了系統(tǒng)的可用性。實(shí)際應(yīng)用中,可以通過(guò)修改和配置算法的參數(shù)對(duì)多個(gè)活躍構(gòu)件發(fā)生Byzantine失效的情況進(jìn)行恢復(fù)。 4結(jié)束語(yǔ) 本文提出了一個(gè)在分布構(gòu)件模型下快速建立容錯(cuò)應(yīng)用的AARC體系結(jié)構(gòu)。以對(duì)數(shù)計(jì)算構(gòu)件的例子闡述了該模型下,通過(guò)IDL描述隱式地將構(gòu)件普通定義轉(zhuǎn)換為容錯(cuò)定義的方法。使用構(gòu)件的事件端口,在將一個(gè)同步請(qǐng)求分解為多個(gè)異步請(qǐng)求的基礎(chǔ)上,給出四種高可用的容錯(cuò)算法,并對(duì)它們的特點(diǎn)進(jìn)行了詳細(xì)的分析。在進(jìn)一步研究中,將這些容錯(cuò)結(jié)構(gòu)和算法與負(fù)載均衡綜合考慮,從而推動(dòng)CCM構(gòu)件技術(shù)逐步走向?qū)嵱煤统墒臁?/p> 參考文獻(xiàn): [1]EDDON G,EDDON H.Inside distributed COM[M].Redmond,WA:Microsoft Press,1998. [2]BOX D.Essential COM[M].Mass:Addison-Wesley,1998. [3]MARVIE R,MERLE P. CORBA component model: discussion and use with OpenCCM[EB/OL].[2006].http://corbaweb.lifl.fr/OpenCCM/CCM.html. [4]MERLE P. OpenCCM[C]//Proc of the 1st Object Web Conference.Paris: [s.n.],2001:30-31. [5]The MICO CORBA component project[EB/OL].[2006].http://www.fpx.de/MicoCCM. [6]MAFFIES S. Piranha: a CORBA tool for high availability[J].IEEE Computer, 1997,30(4): 59-66. [7]NARASIMHAN P,MOUSER L E,MELLIAR-Smith P M.Exploiting the Internet inter-ORB protocol to provide CORBA with fault-tolerance[C]//Proc of the 3rd USENIX Conference on object-Oriented Technologies and Systems(COOTS). Oregon:[s.n.],1997. [8]OMG. Fault tolerant CORBA specification v1.0[S].2000. “本文中所涉及到的圖表、注解、公式等內(nèi)容請(qǐng)以PDF格式閱讀原文”