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