孫曉冬


摘要:針對分布式的軟件系統,設計了一種可靠性加強模塊。該模塊監控分布式軟件各個處理單元的運行狀態,并記錄關鍵內存數據和I/O數據,當處理單元失效時重啟該處理單元,載入關鍵內存數據和I/O數據以恢復重啟前的狀態,達到提高分布式軟件系統的可靠性的目的。
關鍵詞:分布式軟件系統;軟件可靠性;故障恢復
中圖分類號:TP311? ? ? 文獻標識碼:A
文章編號:1009-3044(2019)20-0067-03
開放科學(資源服務)標識碼(OSID):
1 背景
分布式軟件系統(Distributed Software Systems)分布式系統就是由多個相互連接的處理資源組成的軟件系統,合作執行一個共同的任務[1-2]。依靠分布式軟件系統,我們可以把數據放到最合理的地方去處理[3]。而分布式軟件系統常見的一個問題就是如果一部分處理單元因各種原因崩潰,將導致整體性能下降甚至失效。軟件在運行中一旦失效有可能導致嚴重的后果,有時甚至是致命的[4]。為提升分布式軟件系統的可靠性,需要有模塊專門監控各處理單元的運行狀態,記錄關鍵內存數據和I/O數據,當發生處理單元意外崩潰時,及時重啟處理單元,并將記錄的關鍵內存數據和I/O數據輸入到重啟后的處理單元中[5],達到提高軟件可靠性的目的。
2 軟件架構
可靠性加強模塊REM(Reliability Enhanced Module/Middleware)是增加分布式軟件系統可靠性的一個軟件模塊,以達到降低軟件失效率,保障分布式軟件系統整體正常運行,提高軟件開發、維護效率等目的。REM運行于操作系統OS與軟件配置項CSCI(Computer Software Configuration Item)之間,與通信中間件處于同一層級,參見圖1。本文中的通信中間件使用的是數據分發服務DDS(Data Distribution Service),也可替換成其他支持分布式軟件系統的通信中間件。REM軟件模塊的功能主要包括主守護模塊、狀態監控/看門狗、關鍵內存區域監控、I/O數據監控、日志記錄和統計等。
REM的部署方案如圖 2所示,REM在部署上分為主守護模塊(以下稱為主REM)與分布式模塊(以下稱為分布式REM)。主REM單獨占據一個運算節點,在每個CSCI的運行實例中,均有一個分布式REM,運行于CSCI與操作系統之間。
3 軟件模塊設計
3.1 主守護模塊
負責啟動守護進程,讀取全局配置文件信息并廣播到其他分布式REM上,接收CSCI啟動、停止、重啟、編譯等命令并廣播到分布式REM,接收分布式REM發送的配置項運行狀態信息。主守護模塊只駐留在主節點上,包括為主守護進程和配置項狀態控制兩個子模塊。
1)主守護進程
在操作系統啟動后自動運行,加載全局配置文件,等待其他分布式REM的守護進程啟動后向后者廣播配置信息,至此初始化完成,進入命令輪詢狀態,等待全局控制命令的輸入。全局控制命令由用戶通過命令發送的程序以網絡報文方式將其發送至主守護進程。
全局配置文件包括:
2)配置項狀態控制子模塊
負責和分布式REM進行交互,廣播/分發全局控制命令,收集分布式REM的運行狀態報告等。
3.2 狀態監控/看門狗模塊
負責監控配置項程序的狀態,及時捕獲異常并通知守護模塊恢復配置項程序至異常前的運行狀態,接收并響應全局控制命令等。該模塊屬于分布式REM。
1)守護線程
系統開機時啟動的守護線程,負責接收全局控制命令并產生相應的動作,同時從配置項狀態監視和看門狗子模塊接收其所管轄的配置項的運行狀態,并上報給主守護模塊和日志記錄模塊,同時守護線程還需要根據配置信息決定對出現異常的配置項如何處置(重新啟動,重置或不動作等)。
2)配置項狀態監視
配置項狀態監視子模塊設計為由REM創建的一個進程,該進程負責創建一個子進程并在子進程中啟動各CSCI,并通過waitpid等待子進程的運行結束或異常,捕獲子進程的返回碼,將異常的狀態報告上報給守護線程和數據統計模塊。
3)看門狗
看門狗子模塊的設計原理為:啟動一個進程和一個定時器,進程初始化時睡眠(可采用獲取信號量的方式睡眠),定時器一旦到期即喚醒該進程(釋放信號量),此時認為看門狗餓死,即軟件異常;另有一進程負責接收配置項發來的狀態報告,接收到報告后重置定時器,即執行喂狗動作,定時器重新計數。
3.3 關鍵內存區域監控模塊
該模塊負責維護配置項程序的關鍵內存區域,響應配置項的關鍵內存申請請求,并在重新啟動配置項程序后將保存的關鍵數據加載至其內存地址空間等。需要注意的是,該模塊除了流程圖所示的業務邏輯外,還應當提供給配置項若干接口,包括:
l 注冊關鍵內存區域
配置項通過此接口來注冊所有需要用到的空間,該接口需要配置項程序員嚴格考慮好數據的相關性,如果需要恢復一個完整的數據結構,需要該數據結構實例化的結構池和其相關的所有數據結構。
l 申請關鍵內存區域
本接口輸入參數為內存ID號和內存大小,則根據內存大小參數開辟出共享內存空間,將空間首地址返回給調用者,記錄該ID下已分配了內存。
l 釋放關鍵內存區域
釋放制定ID的內存空間,記錄該ID下的內存已被釋放。
3.4 I/O數據監控模塊
按時間序記錄近一段時間內系統定制的I/O數據,如狀態修改命令、操作等,在配置項重啟后將這些命令的恢復給配置項。
該模塊分為I/O數據注冊、I/O數據監控和I/O數據恢復三個子模塊。
1)I/O數據注冊
配置項在啟動時向本模塊發送的注冊請求,注冊成功后,本模塊則會對已注冊的I/O數據進行統計和記錄,而對未注冊的數據不進行該處理。
注冊的數據類型包括兩種:序列型和唯一型。序列型數據表示該數據的所有歷史均需要按照時間序保存下來,在執行配置項的I/O數據恢復時按照時間序將這些數據序貫到配置項;唯一型數據則表示該數據只需要保存最新一次的記錄即可,在執行配置項的I/O數據恢復時將這個最新記錄恢復給配置項。
2)I/O數據監控
該子模塊位于配置項的DDS中間層,監控I/O數據的流入流出,包括:
l DDS數據接收
從DDS接收到報文,如果該報文為已注冊報文,則錄入統計信息,將統計信息發送給統計模塊,按照報文的注冊類型(序列型、唯一型)保存下來,最后把該數據返回給配置項。
l DDS數據發送
配置項需要發送的網絡報文,先通過本子模塊處理,如果該報文為已注冊報文,則錄入統計信息,將統計信息發送給統計模塊,按照報文的注冊類型(序列型、唯一型)保存下來,最終通過DDS的數據發送接口將數據發送給目的地。
需要注意的是,所有已注冊的I/O數據直接都需要保存時間序列的關系,在I/O數據恢復時,不同的I/O數據的恢復順序是按照時間序的。
3)I/O數據恢復
在接收到配置項的I/O數據恢復請求后,按照時間序將所有記錄的I/O數據通過DDS報文方式發送至配置項重置命令。
本模塊也需要向配置項提供接口,包括:
l I/O數據注冊接口
配置項在啟動時對需要關注的I/O數據進行注冊;
l I/O數據發送和接收
配置項通過這些接口發送和接收網絡I/O數據,I/O數據監控子模塊根據注冊信息處理I/O數據,并最終通過DDS的接口將數據接收或發送。
l I/O數據恢復請求
配置項在執行路徑上需要顯式的調用一次I/O數據恢復請求接口來觸發恢復動作。配置項設計人員在設計時應當考慮調用此接口的時機,即要保證在此處的I/O數據恢復是有效且安全的。
3.5 日志記錄模塊
該模塊負責記錄各配置項程序的運行情況,以及各配置項注冊的I/O數據或軟件內部數據等。分為記錄信息注冊和數據記錄兩個子模塊。
1)記錄信息注冊
接收從主守護線程發送來的全局配置信息的記錄信息等級,本子模塊根據記錄信息等級決定數據記錄子模塊在接收到某數據時是否記錄。
2)數據記錄
接收各分布式REM守護線程的運行狀態報告,各配置項的I/O數據、軟件內部數據等予以記錄。
3.6 統計模塊
該模塊用來統計出各配置項I/O、負載等情況,供操作或維護人員參考分析用。模塊接收分布式REM的狀態監控模塊和I/O數據監控模塊發來的統計信息并按照時間順序保存到本地文件中。
通過全局配置文件指定統計周期,在每個周期內統計:
1)CPU使用率,內存使用率;
2)I/O吞吐率,包括網絡發送多少次,共多少字節,接收多少次,共多少字節;文件讀取多少次,共多少字節,寫入多少次,共多少字節;
3)故障周期,故障次數,故障間隔時間。
4 結束語
本文論述了一種針對分布式軟件系統設計的可靠性加強模塊,該模塊分為主守護模塊與分布式模塊兩個部分。主守護模塊單獨運行于一個運算節點上,分布式模塊運行于分布式軟件系統的各個軟件配置項之中??煽啃约訌娔K監視各軟件配置項的運行狀態,同時記錄各配置項的關鍵內存數據和I/O數據。在配置項因故退出時自動重啟配置項并恢復成退出前的狀態,為提高分布式軟件系統的可靠性提供了一種可行的方法。
參考文獻:
[1] Gheith A Abandah, Edward S Davidson. Characterizing Distributed Shared Memory Performance:A Case Study of the Convex SPP1000[J]. IEEE Trans on Parallel and Distributed Systems, 1998, 9(2): 206-216.
[2] 朱海濱, 蔡開裕, 樊愛華, 等. 分布式系統原理與設計[M].長沙: 國防科技大學出版社, 1997.
[3] Fred Barell, Richard Blair, et al. VB.NET高級編程[M]. 北京: 清華大學出版社, 2002.
[4] 李勇, 黃志球, 王勇, 等. 數據驅動的軟件缺陷預測研究綜述[J].電子學報, 2017, 45(4).
[5] 戈應安, 劉松強, 王硯方. 采用分布式實時操作系統的容錯系統的設計與實現[J].核電子學與探測技術, 1999, 19(5).
[6] 徐光俠, 陳蜀宇, 常光輝, 等. 分布式實時系統的軟件故障注入[J].重慶大學學報, 2010, 33(2).
【通聯編輯:謝媛媛】