馬士振,林向東,蘇柱金,梁 芳,趙祖虎,白永福
(1. 北京市地震局,北京 100080;2. 廣東省地震局,廣州 510070;3. 河南省地震局 鄭州地震臺,鄭州 450062)
數(shù)字地震臺網(wǎng)中心(以下簡稱“臺網(wǎng)中心”)是數(shù)字地震臺網(wǎng)的重要組成部分,負責數(shù)據(jù)的接收與轉(zhuǎn)發(fā)、處理、存儲和信息發(fā)布等工作。為了實現(xiàn)上述功能,臺網(wǎng)中心部署了與之對應的多個軟件系統(tǒng)。一般而言,臺網(wǎng)中心的各軟件系統(tǒng)要求24 h不停機地運行。然而,由于軟件系統(tǒng)的運行往往與硬件、網(wǎng)絡及其自身的穩(wěn)定性相關,這3個環(huán)節(jié)中的任何一個出現(xiàn)故障都有可能導致該軟件系統(tǒng)失效,無法發(fā)揮其應有的作用。因此,如何做好軟件系統(tǒng)的熱備成為臺網(wǎng)中心運維工作必須面對的一個重要問題。
以北京市測震臺網(wǎng)為例,目前在線運行的數(shù)字地震臺網(wǎng)中心數(shù)據(jù)處理軟件系統(tǒng)(以下簡稱JOPENS系統(tǒng))[1]0.4和0.5版,是在“中國數(shù)字地震觀測網(wǎng)絡”項目中或其后發(fā)布的。由于系統(tǒng)運行穩(wěn)定可靠,這兩個版本的JOPENS系統(tǒng)目前依然在線運行。預警項目的JOPENS6系統(tǒng)目前也在測試運行中,其核心功能、軟件啟動方法與舊版本基本一致。因此,本文以JOPENS0.5.2系統(tǒng)中流服務器的準熱備實現(xiàn)途徑為例介紹一種軟件系統(tǒng)熱備的實現(xiàn)方法。
流服務器是JOPENS系統(tǒng)中的一個重要組成部分,該服務器負責接收、轉(zhuǎn)發(fā)測震臺站的觀測數(shù)據(jù),處于整個JOPENS系統(tǒng)的最前端,對于省級測震臺網(wǎng)中心而言具有舉足輕重的作用。為了保障流服務器的接入安全,目前各臺網(wǎng)主要采用以下幾種方式:①除主服務器外,再安裝一臺在軟件配置上與主服務器完全相同的流服務器,在主服務器發(fā)生故障時,人工啟動備份流服務器,使之接替主服務器工作;②安裝兩臺流服務器,各自接收部分測震臺站數(shù)據(jù),這樣在其中一臺流服務器故障時,不會影響整個臺網(wǎng)的數(shù)據(jù)接收;③采用第三方軟件保障JOPENS系統(tǒng)的安全[2]。
上述3種方式各具特點,其中第一、二種解決方案在響應時間上相對較慢,第三種需要在經(jīng)費上有所投入。為了保障流服務器安全運行,本文在第一種方案的基礎上進行改進,采用Python語言編寫了監(jiān)視程序,在主服務器故障時,可以自動啟動備份服務器,切換工作在幾分鐘內(nèi)即可完成。
接收臺站數(shù)據(jù)的流服務器是否正常主要體現(xiàn)在3個方面:①網(wǎng)絡是否正常,即該服務器是否可以通過網(wǎng)口與臺站數(shù)采或其他服務器正常通信,可以通過ping命令進行檢查;②基礎流服務(以下簡稱jopens-sss服務)是否正常,即可否通過telnet方式與服務器的5 000端口建立連接;③接收臺站數(shù)據(jù)的jopens-comserv服務是否正常,可以通過相關指令進行檢查。
北京市測震臺網(wǎng)的JOPENS0.5版流服務器安裝在SUSE Linux Enterprise Server 11(以下簡稱SLES11)操作系統(tǒng)上。根據(jù)對流服務的上述認識,本文使用SLES11系統(tǒng)自帶的Python語言,結(jié)合Python內(nèi)置的一些模塊開展了準熱備程序的開發(fā)工作。程序工作流程前4步見圖1,第5步進程檢查見圖2。
圖1 準熱備軟件工作流程
圖2 備份服務器啟動進程示意
1)備份服務器ping主服務器,檢查主服務器網(wǎng)絡是否正常;
2)如果主服務器網(wǎng)絡正常,備份服務器使用telnet命令登錄主服務器5 000端口,檢查jopens-sss服務是否正常;
3)如果telnet登錄主服務器5 000端口成功,則執(zhí)行stat monitor命令,檢查流服務器能否正常收到臺站數(shù)據(jù),臺站數(shù)據(jù)傳輸正常的狀態(tài)為1,反之為0;
4)如果以上3個步驟在任何一步出現(xiàn)失敗,則啟動備份服務器的相關進程,接替主服務器接收、轉(zhuǎn)發(fā)臺站數(shù)據(jù);同時向運維人員發(fā)送郵件,提醒運維人員及時維護服務器,盡快排除故障;
5)在啟動備份服務器流服務進程前,還需對備份服務器現(xiàn)有進程進行檢查,以避免重復啟動進程。
為了實現(xiàn)準熱備軟件的預期功能,需要多個模塊的共同協(xié)作,主要包括網(wǎng)絡測試模塊、遠程登錄模塊、臺站狀態(tài)檢查模塊、進程檢查模塊、郵件發(fā)送模塊。各模塊相互協(xié)作,在SLES11系統(tǒng)的cron定時服務管理下定期執(zhí)行。
網(wǎng)絡暢通是流服務器正常工作的先決條件。在本模塊中,導入Python的subprocess庫,使用subprocess的Popen函數(shù)實現(xiàn)對ping命令的調(diào)用。如果返回結(jié)果為0,則說明ping服務器網(wǎng)絡端口成功;如果返回結(jié)果為1,說明ping服務器端口失敗。關鍵代碼如下:
#導入subprocess庫
import subprocess
#ping 流服務器3次,如果5 s內(nèi)沒反應就定義為ping不通
jopens-sss服務是否正常是服務器能否正常收取臺站觀測數(shù)據(jù)的基礎。為了檢查該服務的狀態(tài),可以通過測試telnet能否成功建立與流服務器5 000端口的連接來實現(xiàn)。在本文軟件中,使用了Python的telnetlib庫(https://docs.Python.org/2/ library/telnetlib.html)。如果可以成功登錄,則繼續(xù)執(zhí)行檢查臺站狀態(tài)的指令;否則,返回False。關鍵代碼如下:
收取臺站數(shù)據(jù)的服務是jopens-comserv。為了檢查該服務的狀態(tài),可以在建立telnet連接后,通過檢查stat monitor命令的執(zhí)行結(jié)果獲得服務的工作狀態(tài)。如果jopens-comserv服務正常,則絕大部分臺站的狀態(tài)應該為1;反之,則全部為0。本文軟件即利用jopens-comserv服務的這個特點進行檢查。此處沿用2.2建立的telnet連接tn,關鍵代碼如下:
tn.read_until('ready.') #等待服務器返回”ready.”
tn.write('user ' + USER + ' ') #向服務器輸入 ‘user登錄用戶名’,并回車
tn.read_until(USER + '.') #等待服務器返回”登錄用戶名.”
tn.write('pass ' + PASS + ' ') #向服務器輸入”pass用戶的口令”,并回車
tn.read_until('logged in.') #等待服務 器 返 回”logged in.”
tn.write(‘stat monitor’ + ' ') #向服務器輸入”stat monitor”命令,并回車
checkresult = tn.read_until('211 End') #將服務器返回的命令執(zhí)行結(jié)果存入checkresult
tn.write("quit ") #退出telnet登錄
tn.close() #關閉telnet連接
返回的checkresult內(nèi)容類似如下一個字符串
211-Begin
BJ/CIQ 1
……
TJ/XZZ 0
211 End
為了獲得臺站狀態(tài)為1和為0的個數(shù),可以將checkresult從字符串轉(zhuǎn)換為列表,然后統(tǒng)計狀態(tài)為1或0的臺站數(shù)量。通過判斷狀態(tài)為1的臺站數(shù)量是否大于一定的數(shù)值,即可判斷jopens-comserv服務是否正常。
本文軟件采取周期性方式對主服務器進行檢查,當主服務器工作不正常時開啟備份服務器相關流服務進程。為了避免備份服務器重復啟動進程,在啟動進程前,需要執(zhí)行進程檢查工作。其主要流程是:執(zhí)行ps命令,對返回結(jié)果進行檢查,若返回結(jié)果中含有擬啟動進程的關鍵字,則不啟動進程;反之,啟動進程。關鍵代碼如下:
在流服務器發(fā)生故障時,需要讓運維人員第一時間獲得消息,以加快故障解決進度。本文軟件采用向運維人員的139郵箱發(fā)送電子郵件實現(xiàn)故障告知。使用139郵箱的主要原因是該郵箱在收到新郵件后會向在郵箱注冊的手機上發(fā)送提示短信。本文軟件采用運維人員的139郵箱向自己發(fā)送郵件,本部分關鍵代碼如下:
表1 流服務進程關鍵字
#導入smtplib庫[3]
import smtplib
BODY = string.join(("From: %s" % “發(fā)送郵箱”,"To: %s" % “139郵箱”, "Subject: %s" % “郵件主題”,"",”郵件內(nèi)容”)," ") #構(gòu)建郵件標題、內(nèi)容等
server = smtplib.SMTP() #新建一個SMTP對象
server.connect("smtp.10086.cn","25") #建立與139郵箱的連接
server.starttls() #設置TLS傳輸模式
server.login("XXX@139.com","郵箱登錄密碼")#登錄郵箱
server.sendmail(“發(fā)送郵箱”,[“139郵箱”],BODY) #發(fā)送郵件
server.quit() #退出郵箱登錄
為檢驗軟件的工作效率,準備兩臺軟硬件配置完全一致的服務器,其硬件配置為Intel Xeon CPU E5-2 603 1.70 GHz,內(nèi)存32G;其操作系統(tǒng)為SLES11 SP4,JOPENS版本為0.5.2。其中一臺作為主服務器,另一臺作為備份服務器。主服務器運行jopenssss、jopens-s2s、jopens-comserv服務,備份服務器運行本文軟件。在操作系統(tǒng)定時任務的管理下,本文軟件在備份服務器上每隔3 min運行一次。
本文模擬了主服務器網(wǎng)絡通信中斷、jopens-sss服務故障和jopens-comserv服務故障3種情景,這3種情景的任何一種都意味著臺網(wǎng)中心無法正常接收和轉(zhuǎn)發(fā)臺站觀測數(shù)據(jù)。在上述3種情景下,本文檢驗了備份服務器可否按照預期進行切換,并對其切換時長進行了記錄。
在主服務器網(wǎng)絡通信正常、jopens各服務工作正常的情況下,備份服務器對主服務器的狀態(tài)檢查用時在4 s左右;當主服務器出現(xiàn)上述3種之中的任一情景,都需要在備份服務器上先后啟動上述的3個jopens服務。根據(jù)日志記錄,從對主服務器檢查開始到jopens各服務完成啟動,其用時在30 s左右。
備份服務器切換上線用時大約分為3種情景。情景1:即主服務器恰好于檢測周期開始時發(fā)生故障,備份服務器則按流程啟動相應服務,其用時最短,大約30 s左右,即啟動3個jopens服務的時間;情景2:即一個檢測周期剛剛結(jié)束而下一個檢測時刻尚未到來時主服務器發(fā)生了故障,備份服務器切換上線的用時應為定時任務間隔時間與前述30 s之和,約為210 s,即在4 min內(nèi)可以完成備份服務器切換上線工作;情景3:即主服務器故障發(fā)生于上一次檢測結(jié)束之后,而下一次檢測尚未開始之前,則備份服務器切換上線用時在30~210 s之間。
相對而言,采用人工方式對流服務器進行故障處理及切換,其用時大概包括如下幾個部分,即值班人員發(fā)現(xiàn)數(shù)據(jù)流中斷,值班人員通知服務器運維人員,運維人員檢查流服務器,運維人員啟動備份服務器進程。根據(jù)經(jīng)驗估算,其用時大約在20~30 min左右。如果故障發(fā)生在夜間,其用時可能會更長。自動切換與人工操作用時的對比見圖3。其中,情景2用時取情景1、3的平均值,人工操作用時采用估算的最短用時。
圖3 流服務不同切換方式用時對比
通過上述各模塊的組合使用,構(gòu)建了一套簡易、免費的流服務準熱備軟件。當主服務器工作正常時,對主服務器的檢查工作一般在4 s左右即可完成;當主服務器工作不正常時,備份服務器切換上線的整體用時在30~210 s之間。經(jīng)估算,本文所采用的流服務故障解決方法其用時較人工處理具有較大優(yōu)勢,一般可從幾十分鐘降低到幾分鐘,從而盡可能縮短流服務器故障對臺網(wǎng)運行的影響。此外,該軟件采用主動通知方式,提高了運維人員對流服務器故障的響應速度。
對JOPENS系統(tǒng)流服務器的準熱備嘗試基本達到了預期目標,即在一定程度上提高了測震臺網(wǎng)數(shù)據(jù)流接收、轉(zhuǎn)發(fā)的安全性,降低了故障解決時間。因此,對于其他需要備份運行的軟件,也可考慮采用本文的思路開展嘗試,以進一步改善軟件系統(tǒng)運行的安全性。