《電子技術應用》
您所在的位置:首頁 > 通信與網(wǎng)絡 > 設計應用 > 中間件異常事務狀態(tài)恢復設計與實現(xiàn)
中間件異常事務狀態(tài)恢復設計與實現(xiàn)
2015《電子技術應用》智能電網(wǎng)增刊
董愛強,齊志超,馮 揚,張立新
(北京中電普華信息技術有限公司, 北京 100192)
摘要: 設計了一種Jboss中間件異常事務恢復功能,并實現(xiàn)了maven工程中交易服務的異常事務處理和恢復過程,該過程能在斷電、宕機、程序故障等異常情況發(fā)生時,及時恢復最近一次正常工作的交易服務狀態(tài)和數(shù)據(jù)庫數(shù)據(jù)。并通過日志記錄整個異常狀態(tài)的發(fā)生和恢復過程。通過測試證明,該設計與實現(xiàn)是一種有效的中間件異常事務狀態(tài)恢復的過程,能夠為中間件正常運行提供可靠支持和日志依據(jù)。
Abstract:
Key words :

  董愛強,齊志超,馮  揚,張立新

  (北京中電普華信息技術有限公司, 北京 100192)

  摘  要: 設計了一種Jboss中間件異常事務恢復功能,并實現(xiàn)了maven工程交易服務的異常事務處理和恢復過程,該過程能在斷電、宕機、程序故障等異常情況發(fā)生時,及時恢復最近一次正常工作的交易服務狀態(tài)和數(shù)據(jù)庫數(shù)據(jù)。并通過日志記錄整個異常狀態(tài)的發(fā)生和恢復過程。通過測試證明,該設計與實現(xiàn)是一種有效的中間件異常事務狀態(tài)恢復的過程,能夠為中間件正常運行提供可靠支持和日志依據(jù)。

  關鍵詞: 中間件;maven工程;交易服務;異常事務;數(shù)據(jù)恢復

0 引言

  中間件作為國網(wǎng)云建設的支持性項目,根據(jù)云建設采用的X86集群模式[1],分析了目前采用較多的weblogic等其他類型中間件的利弊。國網(wǎng)公司自主開發(fā)的具有自主知識產(chǎn)權的新一代Jboss中間件產(chǎn)品,可以適應云建設和管理的要求,實現(xiàn)集群資源共享,降低成本,提高資源利用率。

  在中間件運行期間出現(xiàn)異常事務狀態(tài),例如宕機等導致中間件不能正常工作,從而對云平臺的使用帶來安全隱患。讓故障設備盡快恢復到正常狀態(tài)是本文設計和實現(xiàn)的主要內容。

1 技術背景

  1.1 交易服務與恢復

  交易服務屬于中間件的一個重要功能模塊,開啟此功能可以處理因異常運行狀態(tài)產(chǎn)生的中斷事務(transaction)。當服務器再次重新啟動后,交易服務模塊會分析故障前的日志記錄,根據(jù)日志復原事務現(xiàn)場工作狀況,再次提交故障前中斷的事務,恢復之前事務和沒有保存的數(shù)據(jù)[2],從而實現(xiàn)對交易的恢復。

  1.2 功能設計

  交易服務恢復主要兩個重要功能模塊:事務日志記錄和事務恢復的功能。該功能模塊需要無縫接入到當前中間件模塊中,所以需要實現(xiàn)org.jboss.as.controller.Extension擴展接口。這是中間件啟動時加載擴展模塊的必要條件。業(yè)務在接口的initialize()方法中實現(xiàn),相當于一個入口方法。為了不影響中間件的啟動進程,需要另開一個線程實現(xiàn)業(yè)務邏輯,用戶獲取數(shù)據(jù)庫連接需要讀取配置文件。連接分兩種:

  第一種是用戶配置連接信息,程序讀取配置信息后創(chuàng)建連接即可;第二種是配置jndi獲取連接,通過jndi名獲取數(shù)據(jù)庫連接。第二種方式由于獲取連接時中間件數(shù)據(jù)源模塊還沒加載完成,獲取不到連接,此時可設計一個循環(huán)等待的過程,直到中間件數(shù)據(jù)源模塊加載完成后才能通過jndi獲得連接,然后跳出循環(huán),執(zhí)行恢復操作??紤]到性能原因,如果jndi數(shù)據(jù)源本身存在問題,可能永遠獲取不到,最好設置一個超時參數(shù),表示通過jndi獲取數(shù)據(jù)源的最長等待時間,超出這個時間就直接跳出循環(huán)。對于有可能出現(xiàn)重復啟動問題,事務會重新提交,要解決這個問題,需要在處理完事務后做結束標記處理,并標記事務是正常提交還是重啟服務后的事務提交。對于添加事務日志功能,因為涉及到多線程操作,所以將日志的id以線程id表示。

  1.3 數(shù)據(jù)恢復

  數(shù)據(jù)恢復時,首先需要定義一個TradeExtension類實現(xiàn)org.jboss.as.controller.Extension擴展接口,業(yè)務在接口的initialize()方法中實現(xiàn),為了不影響中間件的啟動進程,需要另開一個線程實現(xiàn)業(yè)務邏輯,用戶獲取數(shù)據(jù)庫連接需要讀取配置文件,連接分兩種。其實現(xiàn)方法與上節(jié)的實現(xiàn)方法相同。定義Conn類和ConnManager類主要是讀取配置文件獲取連接信息,適合單個長事務[3]的恢復。

2 系統(tǒng)啟動

  2.1 Maven工程構建

  中間件中所有的模塊都需要構建成maven工程,maven工程構建必須滿足特定的條件才能在中間件啟動過程中正確加載。jboss中自帶maven程序,啟動maven工程是第一步工作。

  2.2 加載事務模塊

  中間件啟動后需要加載事務模塊和處理事務日志。加載模塊先執(zhí)行standealone的啟動腳本,執(zhí)行jboss-modules.jar,然后執(zhí)行jboss.as.standalone模塊,解析此模塊的描述文件,執(zhí)行jboss.as.server的Main類的main方法,此模塊調用jboss.as.controller模塊解析standalone的配置文件,加載擴展模塊,并調用每個擴展模塊的擴展接口方法。對于交易模塊來說,實現(xiàn)了擴展接口的初始化方法initalize(),此方法中新開啟一個子線程處理交易恢復業(yè)務。

  2.3 處理事務日志

  處理事務日志先調用日志工具類的getNearFileName()方法獲得離當前時間最近的日志文件,如果此文件不存在,則直接返回,調用getExeSqlList()方法獲取所有要執(zhí)行的記錄包含sql語句以及連接信息,遍歷每一條記錄獲取sql語句以及連接信息,創(chuàng)建數(shù)據(jù)庫連接,用sql語句創(chuàng)建事務,然后提交事務。創(chuàng)建文件輸出流FileWriter修復每一條執(zhí)行的記錄,最后強制關閉文件流。

  2.4 添加事務日志

  事務日志記錄可實現(xiàn)日志模塊配置、日志級別設置、日志輪轉設置、日志輸出方式配置,并可實現(xiàn)自定義日志擴展。日志管理內容包括執(zhí)行日志記錄、獲取模塊描述、讀取xml文件元素、解析日志元素、解析根日志元素、添加資源屬性描述、添加設置參數(shù)描述、覆蓋服務。

  首先定義一個日志類TradeLog,包含的屬性有projectName:項目名稱,id:日志唯一編號,sql:事務執(zhí)行的sql語句,result:是事務前日志還是事務后日志,connid:對應數(shù)據(jù)庫連接信息。定義一個處理日志的工具類LogTool,其主要作用是添加日志,初始化日志路徑,獲得當前日志文件名稱(如果當前文件不存在,就會創(chuàng)建當前日志文件),讀取距離當前時間最近的日志文件,獲取文件中需要執(zhí)行的sql語句[5]。

  2.4.1 日志格式

  日志文件名稱:yyyymmddhh.log

  日志格式:

  ([a-z]|[A-Z][0-9])*\|[0-9]{1,19}\|([a-z]|[A-Z][0-9])*\|[0-9]{1,10}

  ([a-z]|[A-Z][0-9])*\|[0-9]{1,19}\|ready-commit

  ([a-z]|[A-Z][0-9])*\|[0-9]{1,19}\|commit

  第一條日志表示事務開始后提交前的日志,后面的日志表示提交后的日志。

  日志狀態(tài):用戶請求數(shù)據(jù)庫操作,如果存在事務開始日志、事務準備提交日志以及事務提交日志,則為正常狀態(tài);如果只存在事務開始日志,則不進行恢復操作;如果存在事務開始日志和事務準備提交日志,則進行恢復操作。

  日志周期:一個小時生成一個文件。每次讀取與當前時間最近的文件。

  日志路徑:%JBOSS_HOME%\standalone\log\trade_log。

  2.4.2 日志添加過程

  日志添加,包含事務提交前添加日志和事務提交后添加日志。

  事務提交前添加日志,首先定義一個日志類TradeLog,包含的屬性有projectName:項目名稱,id:日志唯一編號,sql:事務執(zhí)行的sql語句,result:是事務前日志還是事務后日志,connid:對應數(shù)據(jù)庫連接信息。定義一個處理日志的工具類LogTool,主要作用是添加日志,初始化日志路徑,獲得當前日志文件名稱(如果當前文件不存在,就會創(chuàng)建當前日志文件),讀取離當前時間最近的日志文件,獲取文件中需要執(zhí)行的sql語句。

  在事務開始后,創(chuàng)建一個Log對象,將要執(zhí)行的sql語句賦值到Log對象中,將當前線程的id賦值到Log對象的id屬性中,創(chuàng)建一個文件輸出流FileWriter,用于追加文件信息,將日志信息轉化為固定格式的字符串,調用FileWriter的write()方法將這條記錄寫入到文件中,然后強制關閉文件流。待用戶提交事務后,創(chuàng)建Log對象,將當前線程id賦值到id屬性中,創(chuàng)建事務結束字符串信息,調用文件輸出流將信息追加到文件中。

  2.4.3 日志加載類型

  用戶在添加事務日志時需要添加三種類型的日志,在LogType枚舉類型中有定義,分別為START-COMMIT、READY-COMMIT以及DONE-COMMIT。在事務開始后需要添加START-COMMIT類型的日志,此日志主要記錄了所要執(zhí)行的sql集,在事務恢復時執(zhí)行。在事務準備提交的時候需要添加READY-COMMIT類型的日志,表示此事務準備提交,主要作用是保證事務的原子性。事務提交完成后,添加DONE-COMMIT類型的日志,表示提交完成。

3 事務恢復

  中間件可選擇是否開啟交易服務,開啟交易服務后,交易管理器動態(tài)監(jiān)控當前正在執(zhí)行的交易,并以日志的方式記錄在系統(tǒng)中。在全局事務沒有完成提交之前,如果系統(tǒng)出現(xiàn)故障,則重啟中間件應用服務,交易管理器將根據(jù)日志記錄的故障發(fā)生時交易的狀態(tài),不僅僅恢復數(shù)據(jù),還要對交易的異常事務進行恢復[4]。事務恢復過程如圖1所示。

001.jpg

  3.1 實現(xiàn)過程

  事務恢復實現(xiàn)過程,首先定義一個TradeExtension類實現(xiàn)org.jboss.as.controller.Extension擴展接口(這是sg-aps啟動時加載擴展模塊的必要條件),業(yè)務在接口的initialize()方法中實現(xiàn)。為了不影響中間件的啟動進程,需要另開一個線程實現(xiàn)業(yè)務邏輯,用戶獲取數(shù)據(jù)庫連接需要讀取配置文件。連接分兩種:第一種是用戶配置連接信息,程序讀取配置信息后創(chuàng)建連接即可;第二種是配置jndi獲取連接,通過jndi名獲取數(shù)據(jù)庫連接。第二種方式由于獲取連接時中間件數(shù)據(jù)源模塊還沒加載完成,肯定獲取不到連接,此時設計一個循環(huán)等待的過程,直到中間件數(shù)據(jù)源模塊加載完成后才能通過jndi獲得連接,然后跳出循環(huán),執(zhí)行恢復操作??紤]到性能原因,如果jndi數(shù)據(jù)源本身存在問題,則可能永遠獲取不到,因此最好設置一個超時參數(shù),表示通過jndi獲取數(shù)據(jù)源的最長等待時間,超出這個時間就直接跳出循環(huán)。定義Conn類和ConnManager類主要是讀取配置文件獲取連接信息。

  3.2 日志記錄

  根據(jù)添加日志的方法先添加日志,初始化日志路徑,獲得當前日志文件名稱,讀取事務恢復前最近的日志文件,獲取文件中需要執(zhí)行的sql語句,執(zhí)行該語句恢復數(shù)據(jù),生成新的日志記錄。默認情況下是在%JBOSS_HOME%\trade_log下,也可自行配置。

4 實現(xiàn)與測試

  4.1 構建環(huán)境

  構建系統(tǒng)測試實現(xiàn)環(huán)境,采用junit測試,總共測試4個場景:

  (1)maven編譯過程;

  (2)集成到整個工程的發(fā)布過程;

 ?。?)客戶端添加日志過程;

 ?。?)中間件重啟恢復數(shù)據(jù)過程。

  4.2 交易編譯

  首先,編譯maven工程打開命令窗口,接著進入到模塊根目錄,再運行mvn celan install。如果命令窗口沒有報錯,根目錄下生成target目錄,進入目錄可以看到編譯好的jar包,如圖2所示。

  4.3 交易模塊發(fā)布

  首先打開命令窗口,接著進入到aserver根目錄,再運行build clean install。在aserver/build/target/目錄下生成發(fā)布版本,進入到發(fā)布版本模塊的modules/org/jboss/as/目錄下有發(fā)布成功的交易模塊代碼,如圖3所示。

003.jpg

  4.4 交易日志生成

  安裝客戶端代碼后執(zhí)行代碼控制臺沒有報錯,打開到指定的日志目錄(目錄位置在程序運行時打印出來),有當前日志生成,日志里有一天未完成的事務記錄。日志生成界面如圖4所示。

004.jpg

  4.5 異常事務狀態(tài)恢復

  首先,打開數(shù)據(jù)庫確認日志中未完成的記錄不存在,接著在配置文件standalone.xml中添加交易服務,之后運行standalone模式的的啟動腳本。打開數(shù)據(jù)庫客戶端,查詢數(shù)據(jù)庫記錄,未完成的記錄被添加到數(shù)據(jù)庫中了。圖5為數(shù)據(jù)庫恢復前結果,圖6為數(shù)據(jù)庫恢復后結果。

005.jpg

  以上測試結果初步證明交易服務的恢復功能設計有效可行,在Windows和Linux平臺下測試,均能靈活實現(xiàn)跨平臺可移植[6]。能夠滿足國家電網(wǎng)對中間件應用服務器集群數(shù)據(jù)恢復功能性能等的整體要求。實現(xiàn)便捷在嵌套事務處理上具有一定優(yōu)勢[7],適合云平臺建設。

  根據(jù)國家電網(wǎng)的要求,該設計和實現(xiàn)還需要進一步在安全性[8]和兼容性,大數(shù)據(jù)壓力測試等方面進行進一步的測試,以及與本系統(tǒng)其他功能的聯(lián)調。在和其他系統(tǒng)聯(lián)調后,關鍵功能、性能指標還需多次在不同單位進行測試和評估。

5 結束語

  異常事務處理和恢復作為中間件應用服務器的交易服務設計和開發(fā)的重要內容,在整個中間件系統(tǒng)的運行中起到了關鍵作用,為整個中間件的正常運行提供了可靠支持。該功能的穩(wěn)定性和可靠性直接關系到中間件產(chǎn)品的性能。

  本文提供的異常事務狀態(tài)恢復和管理的設計和實現(xiàn)方式,對中間件這類問題的解決提供了參考和借鑒。

參考文獻

  [1]馮揚.云安全技術研究.電力信息與通信技術[J].2014,12(1).

  [2]魏茂喜,賀貴明,吳元保.事務管理器的事務恢復處理[J]. 微型機與應用,2004,23(4):14-17.

  [3]李建,羅軍.一種基于工作流的長事務恢復方法的研究[J]. 信息技術,2009(7):152-155.

  [4]陳國寧,李陶深,廖國瓊.基于Savepoint機制和日志的協(xié)作設計事務的恢復方法[J].計算機工程,2004,30(9):58-60.

  [5]王耀飛,李林,康衛(wèi).實時數(shù)據(jù)庫主動計算的設計與實現(xiàn)[J].電子技術應用,2014,40(8):134-139.

  [6]鐘舟.對象交易中間件的設計與實現(xiàn)[D].成都:電子科技大學,2008.

  [7]肖迎元,劉云生,廖國瓊.基于嵌套事務模型的實時數(shù)據(jù)庫系統(tǒng)故障恢復模式[D].武漢:華中科技大學計算機學院,2005.

  [8]李珊珊,陳運,姚文斌.基于加密中間件的iSCSI遠程鏡像方法的研究與實現(xiàn)[J].電子技術應用,2011,37(9):


此內容為AET網(wǎng)站原創(chuàng),未經(jīng)授權禁止轉載。