利用Python语言实现软件系统准热备的一种方法—以JOPENS0.5.2流服务器为例

2021-10-18 02:55马士振林向东苏柱金赵祖虎白永福
华北地震科学 2021年4期
关键词:台网台站备份

马士振,林向东,苏柱金,梁 芳,赵祖虎,白永福

(1. 北京市地震局,北京 100080;2. 广东省地震局,广州 510070;3. 河南省地震局 郑州地震台,郑州 450062)

0 引言

数字地震台网中心(以下简称“台网中心”)是数字地震台网的重要组成部分,负责数据的接收与转发、处理、存储和信息发布等工作。为了实现上述功能,台网中心部署了与之对应的多个软件系统。一般而言,台网中心的各软件系统要求24 h不停机地运行。然而,由于软件系统的运行往往与硬件、网络及其自身的稳定性相关,这3个环节中的任何一个出现故障都有可能导致该软件系统失效,无法发挥其应有的作用。因此,如何做好软件系统的热备成为台网中心运维工作必须面对的一个重要问题。

以北京市测震台网为例,目前在线运行的数字地震台网中心数据处理软件系统(以下简称JOPENS系统)[1]0.4和0.5版,是在“中国数字地震观测网络”项目中或其后发布的。由于系统运行稳定可靠,这两个版本的JOPENS系统目前依然在线运行。预警项目的JOPENS6系统目前也在测试运行中,其核心功能、软件启动方法与旧版本基本一致。因此,本文以JOPENS0.5.2系统中流服务器的准热备实现途径为例介绍一种软件系统热备的实现方法。

流服务器是JOPENS系统中的一个重要组成部分,该服务器负责接收、转发测震台站的观测数据,处于整个JOPENS系统的最前端,对于省级测震台网中心而言具有举足轻重的作用。为了保障流服务器的接入安全,目前各台网主要采用以下几种方式:①除主服务器外,再安装一台在软件配置上与主服务器完全相同的流服务器,在主服务器发生故障时,人工启动备份流服务器,使之接替主服务器工作;②安装两台流服务器,各自接收部分测震台站数据,这样在其中一台流服务器故障时,不会影响整个台网的数据接收;③采用第三方软件保障JOPENS系统的安全[2]。

上述3种方式各具特点,其中第一、二种解决方案在响应时间上相对较慢,第三种需要在经费上有所投入。为了保障流服务器安全运行,本文在第一种方案的基础上进行改进,采用Python语言编写了监视程序,在主服务器故障时,可以自动启动备份服务器,切换工作在几分钟内即可完成。

1 功能与结构

接收台站数据的流服务器是否正常主要体现在3个方面:①网络是否正常,即该服务器是否可以通过网口与台站数采或其他服务器正常通信,可以通过ping命令进行检查;②基础流服务(以下简称jopens-sss服务)是否正常,即可否通过telnet方式与服务器的5 000端口建立连接;③接收台站数据的jopens-comserv服务是否正常,可以通过相关指令进行检查。

北京市测震台网的JOPENS0.5版流服务器安装在SUSE Linux Enterprise Server 11(以下简称SLES11)操作系统上。根据对流服务的上述认识,本文使用SLES11系统自带的Python语言,结合Python内置的一些模块开展了准热备程序的开发工作。程序工作流程前4步见图1,第5步进程检查见图2。

图1 准热备软件工作流程

图2 备份服务器启动进程示意

1)备份服务器ping主服务器,检查主服务器网络是否正常;

2)如果主服务器网络正常,备份服务器使用telnet命令登录主服务器5 000端口,检查jopens-sss服务是否正常;

3)如果telnet登录主服务器5 000端口成功,则执行stat monitor命令,检查流服务器能否正常收到台站数据,台站数据传输正常的状态为1,反之为0;

4)如果以上3个步骤在任何一步出现失败,则启动备份服务器的相关进程,接替主服务器接收、转发台站数据;同时向运维人员发送邮件,提醒运维人员及时维护服务器,尽快排除故障;

5)在启动备份服务器流服务进程前,还需对备份服务器现有进程进行检查,以避免重复启动进程。

2 模块

为了实现准热备软件的预期功能,需要多个模块的共同协作,主要包括网络测试模块、远程登录模块、台站状态检查模块、进程检查模块、邮件发送模块。各模块相互协作,在SLES11系统的cron定时服务管理下定期执行。

2.1 网络测试模块

网络畅通是流服务器正常工作的先决条件。在本模块中,导入Python的subprocess库,使用subprocess的Popen函数实现对ping命令的调用。如果返回结果为0,则说明ping服务器网络端口成功;如果返回结果为1,说明ping服务器端口失败。关键代码如下:

#导入subprocess库

import subprocess

#ping 流服务器3次,如果5 s内没反应就定义为ping不通

2.2 远程登录模块

jopens-sss服务是否正常是服务器能否正常收取台站观测数据的基础。为了检查该服务的状态,可以通过测试telnet能否成功建立与流服务器5 000端口的连接来实现。在本文软件中,使用了Python的telnetlib库(https://docs.Python.org/2/ library/telnetlib.html)。如果可以成功登录,则继续执行检查台站状态的指令;否则,返回False。关键代码如下:

2.3 台站状态检查模块

收取台站数据的服务是jopens-comserv。为了检查该服务的状态,可以在建立telnet连接后,通过检查stat monitor命令的执行结果获得服务的工作状态。如果jopens-comserv服务正常,则绝大部分台站的状态应该为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') #将服务器返回的命令执行结果存入checkresult

tn.write("quit ") #退出telnet登录

tn.close() #关闭telnet连接

返回的checkresult内容类似如下一个字符串

211-Begin

BJ/CIQ 1

……

TJ/XZZ 0

211 End

为了获得台站状态为1和为0的个数,可以将checkresult从字符串转换为列表,然后统计状态为1或0的台站数量。通过判断状态为1的台站数量是否大于一定的数值,即可判断jopens-comserv服务是否正常。

2.4 进程检查模块

本文软件采取周期性方式对主服务器进行检查,当主服务器工作不正常时开启备份服务器相关流服务进程。为了避免备份服务器重复启动进程,在启动进程前,需要执行进程检查工作。其主要流程是:执行ps命令,对返回结果进行检查,若返回结果中含有拟启动进程的关键字,则不启动进程;反之,启动进程。关键代码如下:

2.5 邮件发送模块

在流服务器发生故障时,需要让运维人员第一时间获得消息,以加快故障解决进度。本文软件采用向运维人员的139邮箱发送电子邮件实现故障告知。使用139邮箱的主要原因是该邮箱在收到新邮件后会向在邮箱注册的手机上发送提示短信。本文软件采用运维人员的139邮箱向自己发送邮件,本部分关键代码如下:

表1 流服务进程关键字

#导入smtplib库[3]

import smtplib

BODY = string.join(("From: %s" % “发送邮箱”,"To: %s" % “139邮箱”, "Subject: %s" % “邮件主题”,"",”邮件内容”)," ") #构建邮件标题、内容等

server = smtplib.SMTP() #新建一个SMTP对象

server.connect("smtp.10086.cn","25") #建立与139邮箱的连接

server.starttls() #设置TLS传输模式

server.login("XXX@139.com","邮箱登录密码")#登录邮箱

server.sendmail(“发送邮箱”,[“139邮箱”],BODY) #发送邮件

server.quit() #退出邮箱登录

3 测试与结果

为检验软件的工作效率,准备两台软硬件配置完全一致的服务器,其硬件配置为Intel Xeon CPU E5-2 603 1.70 GHz,内存32G;其操作系统为SLES11 SP4,JOPENS版本为0.5.2。其中一台作为主服务器,另一台作为备份服务器。主服务器运行jopenssss、jopens-s2s、jopens-comserv服务,备份服务器运行本文软件。在操作系统定时任务的管理下,本文软件在备份服务器上每隔3 min运行一次。

本文模拟了主服务器网络通信中断、jopens-sss服务故障和jopens-comserv服务故障3种情景,这3种情景的任何一种都意味着台网中心无法正常接收和转发台站观测数据。在上述3种情景下,本文检验了备份服务器可否按照预期进行切换,并对其切换时长进行了记录。

在主服务器网络通信正常、jopens各服务工作正常的情况下,备份服务器对主服务器的状态检查用时在4 s左右;当主服务器出现上述3种之中的任一情景,都需要在备份服务器上先后启动上述的3个jopens服务。根据日志记录,从对主服务器检查开始到jopens各服务完成启动,其用时在30 s左右。

备份服务器切换上线用时大约分为3种情景。情景1:即主服务器恰好于检测周期开始时发生故障,备份服务器则按流程启动相应服务,其用时最短,大约30 s左右,即启动3个jopens服务的时间;情景2:即一个检测周期刚刚结束而下一个检测时刻尚未到来时主服务器发生了故障,备份服务器切换上线的用时应为定时任务间隔时间与前述30 s之和,约为210 s,即在4 min内可以完成备份服务器切换上线工作;情景3:即主服务器故障发生于上一次检测结束之后,而下一次检测尚未开始之前,则备份服务器切换上线用时在30~210 s之间。

相对而言,采用人工方式对流服务器进行故障处理及切换,其用时大概包括如下几个部分,即值班人员发现数据流中断,值班人员通知服务器运维人员,运维人员检查流服务器,运维人员启动备份服务器进程。根据经验估算,其用时大约在20~30 min左右。如果故障发生在夜间,其用时可能会更长。自动切换与人工操作用时的对比见图3。其中,情景2用时取情景1、3的平均值,人工操作用时采用估算的最短用时。

图3 流服务不同切换方式用时对比

4 讨论

通过上述各模块的组合使用,构建了一套简易、免费的流服务准热备软件。当主服务器工作正常时,对主服务器的检查工作一般在4 s左右即可完成;当主服务器工作不正常时,备份服务器切换上线的整体用时在30~210 s之间。经估算,本文所采用的流服务故障解决方法其用时较人工处理具有较大优势,一般可从几十分钟降低到几分钟,从而尽可能缩短流服务器故障对台网运行的影响。此外,该软件采用主动通知方式,提高了运维人员对流服务器故障的响应速度。

对JOPENS系统流服务器的准热备尝试基本达到了预期目标,即在一定程度上提高了测震台网数据流接收、转发的安全性,降低了故障解决时间。因此,对于其他需要备份运行的软件,也可考虑采用本文的思路开展尝试,以进一步改善软件系统运行的安全性。

猜你喜欢
台网台站备份
浅谈数字化条件下的数据备份管理
中国科学院野外台站档案工作回顾
地震台站基础信息完善及应用分析
地球物理台网仪器维修信息管理的研究与实现
一种适用于高铁沿线的多台站快速地震预警方法
铁路无线电干扰监测和台站数据管理系统应用研究
创建vSphere 备份任务
Windows10应用信息备份与恢复
旧瓶装新酒天宫二号从备份变实验室
澜沧江流域小湾、糯扎渡水库地震台网震级完备性初探