摘要:提出一種對(duì)象事務(wù)服務(wù)器備份恢復(fù)模型,并結(jié)合CORBA的OTS標(biāo)準(zhǔn)實(shí)現(xiàn)了一個(gè)具有恢復(fù)管理功能的CORBA對(duì)象事務(wù)服務(wù)器。結(jié)果表明,該事務(wù)服務(wù)器除了具有OMG規(guī)范規(guī)定的功能外,還具有事務(wù)數(shù)據(jù)在線備份及意外失敗后恢復(fù)的功能。
關(guān)鍵詞:分布式計(jì)算; 公共對(duì)象請(qǐng)求代理體系結(jié)構(gòu); 對(duì)象事務(wù)服務(wù); 備份與恢復(fù); 事務(wù); 兩階段提交協(xié)議
中圖分類號(hào):TP311文獻(xiàn)標(biāo)志碼:A
文章編號(hào):1001-3695(2007)12-0220-03
CORBA是由對(duì)象管理組所提出的一種規(guī)范[1]。OMG的COSS標(biāo)準(zhǔn)[2]定義了大約16種公共對(duì)象服務(wù)。這些服務(wù)是CORBA為使用和維護(hù)對(duì)象系統(tǒng)而提供的基本服務(wù)集合。它們獨(dú)立于應(yīng)用領(lǐng)域,是分布式對(duì)象程序使用的接口。OTS[3]是OMG組織推出的一種COSS服務(wù),它保證了企業(yè)應(yīng)用中事務(wù)性操作的原子性和持久性,對(duì)構(gòu)建高可靠性應(yīng)用,特別是要求并發(fā)訪問共享數(shù)據(jù)的分布式應(yīng)用起著關(guān)鍵作用。
在事務(wù)服務(wù)器處理事務(wù)的過程中,可能會(huì)因?yàn)閿嚯姷裙收隙鴮?dǎo)致事務(wù)服務(wù)器的崩潰。為了維護(hù)數(shù)據(jù)的一致性,就應(yīng)該有一種完善的機(jī)制保證事務(wù)的重新啟動(dòng)和恢復(fù)。文獻(xiàn)[4~6]實(shí)現(xiàn)了幾種不同特點(diǎn)的事務(wù)服務(wù)器,但是實(shí)現(xiàn)的事務(wù)服務(wù)器沒有考慮恢復(fù)功能;文獻(xiàn)[7]討論了分布式事務(wù)處理中的事務(wù)失敗恢復(fù),但是沒有給出具體的實(shí)現(xiàn)。本文提出了一種事務(wù)服務(wù)器意外失敗恢復(fù)模型,并且結(jié)合OTS規(guī)范在Orbas[8]的ORB上實(shí)現(xiàn)了一個(gè)具有恢復(fù)管理功能的事務(wù)服務(wù)器。
1總體設(shè)計(jì)
如圖1所示,org.omg.CosTransactions包中是OTS各接口的POA框架類和碼根類。Orbas.OTS中的類均繼承自該包的POA框架類。Orbas.OTS包還要調(diào)用org.omg.CORBA包和orb內(nèi)核子系統(tǒng)。Orbas.TransRecovery包是備份恢復(fù)管理模塊,事務(wù)服務(wù)器在進(jìn)行事務(wù)處理的過程中須與該模塊聯(lián)系進(jìn)行事務(wù)數(shù)據(jù)的動(dòng)態(tài)備份;同樣,當(dāng)事務(wù)服務(wù)器失敗后重啟時(shí),備份恢復(fù)模塊主導(dǎo)整個(gè)事務(wù)服務(wù)器的恢復(fù)過程,在此過程要頻繁地與OTS模塊交換信息。
2OTS模塊的設(shè)計(jì)與實(shí)現(xiàn)
2.1OTS接口定義
圖2描述了OTS接口:
Current 接口中定義了控制和管理事務(wù)的操作,可以開始和結(jié)束一個(gè)事務(wù),通過Current 可以獲得當(dāng)前事務(wù)的相關(guān)信息。
TransactionFactory 接口中定義了兩個(gè)操作,即create和recreate。前者可以生成一個(gè)新的頂層事務(wù);后者可以生成一個(gè)PropagationContext,定義已存在事務(wù)的新代表,并返回一個(gè)Control 對(duì)象。
Control 接口允許一個(gè)程序顯式地管理或者隱式地傳播一個(gè)事務(wù)上下文。該接口定義了兩種操作,即get_terminator和get_coordinator。前者返回一個(gè)Terminator對(duì)象,該對(duì)象支持結(jié)束事務(wù)的操作;后者返回一個(gè)Coordinator 對(duì)象,以支持相關(guān)資源參與到事務(wù)所需要的操作。
Terminator接口提供提交和回退事務(wù)的操作。一般由事務(wù)的發(fā)起者調(diào)用這些操作。
Coordinator接口提供一個(gè)分布式對(duì)象參與到事務(wù)所需要的操作。這些參與者既可以是可恢復(fù)對(duì)象,又可以是可恢復(fù)對(duì)象的代理。
RecoveryCoordinator提供了可恢復(fù)對(duì)象恢復(fù)自身的接口。
Resource接口是資源接口,可恢復(fù)服務(wù)器繼承此接口,以參與兩階段提交協(xié)議。
Synchronization接口是繼承自TransactionalObject接口,因此它是個(gè)特殊的事務(wù)對(duì)象,它的某些數(shù)據(jù)依賴資源對(duì)象。如果一個(gè)事務(wù)對(duì)象的數(shù)據(jù)本身雖然不是資源,但是它需要在資源中改變數(shù)據(jù)時(shí)得到通知,這時(shí),該事務(wù)對(duì)象可以實(shí)現(xiàn)Synchronization接口,并將自己注冊(cè)在Coordinator上。這樣在兩階段協(xié)議開始或者結(jié)束時(shí),分別調(diào)用Synchronization中的before_completion和after_completion操作進(jìn)行相應(yīng)的處理。
2.2OTS實(shí)現(xiàn)
OTS靜態(tài)類圖如圖3所示。
CurrentImpl是事務(wù)型應(yīng)用程序和OTS交互的橋梁。它提供了事務(wù)服務(wù)中常用的API,是對(duì)事務(wù)進(jìn)行直接管理的基礎(chǔ)。它包括發(fā)起和終止一個(gè)事務(wù),獲得當(dāng)前的事務(wù)狀態(tài),獲得與設(shè)置事務(wù)的上下文、設(shè)置事務(wù)的超時(shí)、掛起和恢復(fù)一個(gè)事務(wù)等。TransactionFactoryImpl用于創(chuàng)建ControlImpl,這樣就構(gòu)建起整個(gè)事務(wù)處理的上下文。ControlImpl在其構(gòu)造函數(shù)中根據(jù)傳入的time_out等各個(gè)參數(shù)創(chuàng)建CoordinatorImpl和TerminatorImpl。CoordinatorImpl用來登記資源和同步對(duì)象,用兩個(gè)向量分別存儲(chǔ)注冊(cè)到該Coordinator的資源和同步對(duì)象。
TerminatorImpl是兩階段提交協(xié)議的具體執(zhí)行者。當(dāng)事務(wù)型應(yīng)用程序發(fā)出commit操作時(shí),將使所有與事務(wù)相關(guān)的資源執(zhí)行兩階段提交協(xié)議。圖4展示了兩階段提交的整個(gè)過程。
TimeOutControl用于控制事務(wù)的超時(shí),它繼承于java.lang.Thread。在事務(wù)上下文被創(chuàng)建時(shí)設(shè)置啟動(dòng),然后線程休眠time_out設(shè)定的時(shí)間。如果在規(guī)定的時(shí)間內(nèi)事務(wù)還沒有對(duì)其進(jìn)行提交,定時(shí)器將執(zhí)行回退操作。
org.omg.CosTransactions.Resource和org.omg.CosTransactions.Synchronizations是資源對(duì)象和同步對(duì)象在其客戶端的對(duì)象引用,它們注冊(cè)到CoordinatorImpl上并被其管理。
3備份恢復(fù)模塊設(shè)計(jì)與實(shí)現(xiàn)
在OTS服務(wù)器進(jìn)行事務(wù)處理的過程中,可能會(huì)出現(xiàn)斷電等故障而導(dǎo)致意外失敗。為了維護(hù)數(shù)據(jù)的一致性,OTS服務(wù)器應(yīng)具有意外失敗后自我恢復(fù)的能力。本文提出了OTS服務(wù)器的一種備份恢復(fù)模型,如圖5所示。具體分為兩個(gè)階段:a)在OTS服務(wù)器運(yùn)行過程中,OTS模塊與備份模塊協(xié)作,采用事務(wù)日志的方式動(dòng)態(tài)地記錄事務(wù)運(yùn)行的過程,即OTS的動(dòng)態(tài)備份階段;b)當(dāng)事務(wù)服務(wù)器意外失敗而重啟后,恢復(fù)管理模塊根據(jù)動(dòng)態(tài)備份的事務(wù)日志信息與OTS模塊協(xié)作進(jìn)行事務(wù)的恢復(fù),即OTS的恢復(fù)階段。
3.1事務(wù)數(shù)據(jù)的動(dòng)態(tài)備份
事務(wù)在運(yùn)行的過程中,每當(dāng)進(jìn)行狀態(tài)的轉(zhuǎn)換和其他重要的事件,如注冊(cè)資源、提交資源、準(zhǔn)備好資源等時(shí)都將必要的信息通過LogWriter寫入日志。如圖5所示,OTS在適當(dāng)?shù)臅r(shí)機(jī)調(diào)用LogWriter寫入日志。問題的關(guān)鍵是寫入日志的時(shí)機(jī)及日志的格式。
3.1.1日志寫入時(shí)機(jī)
要確定日志寫入的時(shí)機(jī),需要分析事務(wù)服務(wù)器運(yùn)行過程中的重要的狀態(tài)點(diǎn)。事務(wù)的九種狀態(tài)及其變遷過程如圖6所示。
應(yīng)用程序開始一個(gè)事務(wù),創(chuàng)建事務(wù)上下文,事務(wù)的狀態(tài)變?yōu)镾tatusActive;OTS和參與事務(wù)的各個(gè)資源聯(lián)系,進(jìn)入兩階段提交協(xié)議的prepare階段,事務(wù)的狀態(tài)轉(zhuǎn)變?yōu)镾tatusPreparing;如果各個(gè)資源投票通過,事務(wù)狀態(tài)轉(zhuǎn)變?yōu)镾tatusPrepared;接著將進(jìn)入兩階段提交協(xié)議的commit階段,事務(wù)狀態(tài)轉(zhuǎn)變?yōu)镾tatusCommitting;如果提交成功,事務(wù)狀態(tài)變?yōu)镾tatusCommitted;在準(zhǔn)備階段出現(xiàn)某個(gè)資源投票未通過,事務(wù)狀態(tài)變?yōu)镾tatusRollingBack;回退結(jié)束,事務(wù)狀態(tài)變?yōu)镾tatusRolledBack;如果事務(wù)標(biāo)記為回退,事務(wù)狀態(tài)變?yōu)镾tatusMarkedRollback。
參照以上事務(wù)的狀態(tài)變遷過程,根據(jù)各個(gè)狀態(tài)點(diǎn),給出事務(wù)日志記錄的時(shí)機(jī)如表1所示。
3.1.2日志格式
事務(wù)日志的格式如下:transcation_id,nested_trans_id,phase,resource,vote,status,time。其中,phase是表1中的14個(gè)可能值中的一個(gè);而transaction_id是事務(wù)的惟一性標(biāo)志;nes-ted_trans_id為嵌套事務(wù)的惟一性標(biāo)志;resource是該事務(wù)涉及的資源對(duì)象的IOR(interoperable object reference,可互操作對(duì)象引用);vote為事務(wù)投票的結(jié)果;status為事務(wù)相應(yīng)的狀態(tài),取值為圖6中九種狀態(tài)中的一種;time為日志記錄的時(shí)間。
3.2事務(wù)的恢復(fù)
當(dāng)事務(wù)服務(wù)器意外失敗而重新啟動(dòng)后,RecoveryManager負(fù)責(zé)判斷OTS在失敗時(shí)的狀態(tài),而進(jìn)行相應(yīng)的回退或者繼續(xù)提交的操作。RecoveryManager與LogMonitor聯(lián)系得以決定是否進(jìn)行事務(wù)恢復(fù)。如果需要恢復(fù),LogMonitor與LogReader聯(lián)系從Logs中讀出并解析相應(yīng)的信息。RecoveryManager在實(shí)施恢復(fù)的過程中需要與OTS模塊進(jìn)行交互。例如根據(jù)日志中得到的資源IOR調(diào)用CoordinatorImpl中的register_resource操作進(jìn)行注冊(cè)等。RecoveryManager進(jìn)行恢復(fù)的具體過程如圖7所示。它描述了恢復(fù)事務(wù)的整個(gè)過程。從圖7中可以看出,只要當(dāng)事務(wù)服務(wù)器崩潰時(shí),事務(wù)的狀態(tài)是_StatusPrepared或者_(dá)StatusCommitting, 并且日志記錄沒有回退的資源時(shí),恢復(fù)管理器
才執(zhí)行事務(wù)的繼續(xù)提交。因?yàn)榇藭r(shí)能肯定事務(wù)已經(jīng)成功完成了兩階段提交協(xié)議,在別的情況下要執(zhí)行事務(wù)的回退。
4結(jié)束語(yǔ)
事務(wù)處理是分布式應(yīng)用中特別是企業(yè)應(yīng)用中需要處理的一個(gè)重要問題。在開發(fā)機(jī)械第九設(shè)計(jì)院協(xié)同設(shè)計(jì)管理系統(tǒng)的過程中,一個(gè)重要的問題就是解決事務(wù)的處理。要求在整個(gè)系統(tǒng)所應(yīng)用的事務(wù)處理模塊不僅能保證事務(wù)的ACID準(zhǔn)則,并且應(yīng)具有事務(wù)服務(wù)意外失敗后能進(jìn)行自我恢復(fù)的能力。本文所實(shí)現(xiàn)的具有失敗恢復(fù)能力的OTS系統(tǒng)能很好地應(yīng)用在協(xié)同設(shè)計(jì)管理系統(tǒng)中,作為一個(gè)分布式事務(wù)處理中間件,承擔(dān)著在整個(gè)系統(tǒng)中協(xié)調(diào)分布式對(duì)象之間的事務(wù)處理的功能。
參考文獻(xiàn):
[1]Object Management Group. The common object request broker: architecture and specification: 3.0 edition[EB/OL].[2006-08-27].http://www.omg.org.
[2]Object Management Group. CORBAServices: common object services specification[EB/OL].[2006-08-27].http://www.omg.org.
[3]Object Management Group. Object transaction service specification: 1.3 edition[EB/OL].[2006-08-27].http://www.omg.org.
[4]陳良銀,李志蜀,鄧麗華,等.CORBA對(duì)象事務(wù)服務(wù)的實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用與軟件,2005,22(2):57-58,87.
[5]徐海淵,吳泉源.基于StarBus的對(duì)象事務(wù)服務(wù)的設(shè)計(jì)與實(shí)現(xiàn)[J].國(guó)防科技大學(xué)學(xué)報(bào),1999,21(1):76-79.
[6]楊濤,鄭曉霞,劉錦德.CORBA中對(duì)象事務(wù)服務(wù)研究與實(shí)現(xiàn)[J].電子科技大學(xué)學(xué)報(bào),2001,30(6):590-595.
[7]齊勇,馬莉,趙季中,等.分布式事務(wù)處理技術(shù)及其模型[J].計(jì)算機(jī)工程與應(yīng)用,2001,37(9):60-62.
[8]王克波.The orbas project: CORBA implementation project[EB/OL].[2006-08-27].http://labs.huihoo.com/orbas/index.html.
“本文中所涉及到的圖表、注解、公式等內(nèi)容請(qǐng)以PDF格式閱讀原文”