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

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

马士振,林向东,苏柱金,等. 利用Python语言实现软件系统准热备的一种方法—以JOPENS0.5.2流服务器为例[J]. 华北地震科学,2021, 39(4):63-67. doi:10.3969/j.issn.1003−1375.2021.04.010.
引用本文: 马士振,林向东,苏柱金,等. 利用Python语言实现软件系统准热备的一种方法—以JOPENS0.5.2流服务器为例[J]. 华北地震科学,2021, 39(4):63-67. doi:10.3969/j.issn.1003−1375.2021.04.010.
MA Shizhen,LIN Xiangdong,SU Zhujin,et al. Software System Quasi-hot Standby Using Python: Taking the JOPENS0.5.2 Streaming Server as an Example[J]. North China Earthquake Sciences,2021, 39(4):63-67. doi:10.3969/j.issn.1003−1375.2021.04.010.
Citation: MA Shizhen,LIN Xiangdong,SU Zhujin,et al. Software System Quasi-hot Standby Using Python: Taking the JOPENS0.5.2 Streaming Server as an Example[J]. North China Earthquake Sciences,2021, 39(4):63-67. doi:10.3969/j.issn.1003−1375.2021.04.010.

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

基金项目: 北京市地震局面上项目“地震台网多维监控服务软件研制”(BJMS-2021005);国家自然科学基金青年基金项目(41604045);中国地震局地震科技星火计划攻关项目(XH200103)
详细信息
    作者简介:

    马士振(1976—),男,北京市人,高级工程师,主要从事地震监测工作. E-mail:13651367490@139.com

  • 中图分类号: P315-391

Software System Quasi-hot Standby Using Python: Taking the JOPENS0.5.2 Streaming Server as an Example

  • 摘要: 为提升数字地震台网中心软件系统运行的安全性,降低故障排除时间,以JOPENS0.5.2系统的流服务器为例,介绍了一种利用Python语言实现流服务器准热备的方法。经实际检验,采用该流服务准热备方法后,其服务器切换用时在30~210 s之间,较人工处理具有较大优势。该方法还可在一定程度上推广至其他需要热备的软件系统。
    Abstract: In order to improve the software system operation safety of the seismic network and reduce the troubleshooting time, we introduce an implementation method for quasi-hot standby of streaming servers using Python—taking the streaming server of JOPENS 0.5.2 system as an example. The test results show that the server switching time is between 30 to 210 seconds, which is better than manual processing. This approach may be extended to other software systems that require hot standby.
  • 数字地震台网中心(以下简称“台网中心”)是数字地震台网的重要组成部分,负责数据的接收与转发、处理、存储和信息发布等工作。为了实现上述功能,台网中心部署了与之对应的多个软件系统。一般而言,台网中心的各软件系统要求24 h不停机地运行。然而,由于软件系统的运行往往与硬件、网络及其自身的稳定性相关,这3个环节中的任何一个出现故障都有可能导致该软件系统失效,无法发挥其应有的作用。因此,如何做好软件系统的热备成为台网中心运维工作必须面对的一个重要问题。

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

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

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

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

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

    图  1  准热备软件工作流程
    图  2  备份服务器启动进程示意

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

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

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

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

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

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

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

    #导入subprocess库

    import subprocess

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

    ret_info = subprocess.Popen('ping -c 3 -w 5' + ' ' +              server_ip,shell=True,\

    stdout=subprocess.PIPE)

    #ret_info_flag为ping的结果,0为通,1为不通

    ret_info_flag = ret_info.wait()

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

    #导入telnetlib库

    import telnetlib

    tn = telnetlib.Telnet() # 新建一个telnet对象

    try:

    tn.open(‘SSS服务器IP’,’5000’) # 使用telnet打开SSS服务器的5000端口

    except:

    return False # 若5000端口打开失败,则返回False

    收取台站数据的服务是jopens-comserv。为了检查该服务的状态,可以在建立telnet连接后,通过检查stat monitor命令的执行结果获得服务的工作状态。如果jopens-comserv服务正常,则绝大部分台站的状态应该为1;反之,则全部为0。本文软件即利用jopens-comserv服务的这个特点进行检查。此处沿用2.2建立的telnet连接tn,关键代码如下:

    tn.read_until('ready.') #等待服务器返回”ready.”

    tn.write('user ' + USER + '\n') #向服务器输入 ‘user 登录用户名’,并回车

    tn.read_until(USER + '.') #等待服务器返回”登录用户名.”

    tn.write('pass ' + PASS + '\n') #向服务器输入”pass 用户的口令”,并回车

    tn.read_until('logged in.') #等待服务器返回”logged in.”

    tn.write(‘stat monitor’ + '\n') #向服务器输入”stat monitor”命令,并回车

    checkresult = tn.read_until('211 End') #将服务器返回的命令执行结果存入checkresult

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

    tn.close() #关闭telnet连接

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

    211-Begin

    BJ/CIQ 1

    ……

    TJ/XZZ 0

    211 End

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

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

    #在备份服务器上执行ps命令,返回执行结果

    res_ps = subprocess.Popen(r'ps -ef|grep java ',\ shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE,)

    res_ps_cont = res_ps.stdout.read().decode('utf-8')

    res_ps_cont_list = res_ps_cont.strip().split('\n') #将返回的全部进程结果拆分为列表

    for ires in res_ps_cont_list:

    # 对每一个进程结果拆分为列表

    tmp_res_list = ires.strip().split(' ')

    # 如果进程关键字在拆分的列表中存在

    if proc_flag in tmp_res_list:

    # 如果该进程的所有者是jopens用户,则    说明该进程存在

    if tmp_res_list[0] == u'jopens':

    proc_count = proc_count + 1

    上述进程关键字详见表1

    表  1  流服务进程关键字
    序号进程名称进程关键字
    1jopens-ssscn.org.gddsn.liss.server.Server
    2jopens-s2scn.org.gddsn.liss.box.Server2Server
    3jopens-comservcn.org.gddsn.liss.box.ComServ2Server
    下载: 导出CSV 
    | 显示表格

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

    #导入smtplib库[3]

    import smtplib

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

    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() #退出邮箱登录

    为检验软件的工作效率,准备两台软硬件配置完全一致的服务器,其硬件配置为Intel Xeon CPU E5-2603 1.70 GHz,内存32G;其操作系统为SLES11 SP4,JOPENS版本为0.5.2。其中一台作为主服务器,另一台作为备份服务器。主服务器运行jopens-sss、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 s左右即可完成;当主服务器工作不正常时,备份服务器切换上线的整体用时在30~210 s之间。经估算,本文所采用的流服务故障解决方法其用时较人工处理具有较大优势,一般可从几十分钟降低到几分钟,从而尽可能缩短流服务器故障对台网运行的影响。此外,该软件采用主动通知方式,提高了运维人员对流服务器故障的响应速度。

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

  • 图  1   准热备软件工作流程

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

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

    表  1   流服务进程关键字

    序号进程名称进程关键字
    1jopens-ssscn.org.gddsn.liss.server.Server
    2jopens-s2scn.org.gddsn.liss.box.Server2Server
    3jopens-comservcn.org.gddsn.liss.box.ComServ2Server
    下载: 导出CSV
  • [1] 吴永权, 黄文辉. 数据处理系统软件JOPENS的架构设计与实现[J]. 地震地磁观测与研究, 2010, 31(6): 59-63. doi: 10.3969/j.issn.1003-3246.2010.06.011
    [2] 张炳, 王琐琛, 杨波, 等. 双机热备在安徽测震台网的应用[J]. 电脑编程技巧与维护, 2019(9): 44-46. doi: 10.3969/j.issn.1006-4052.2019.09.015
    [3] 刘天斯. Python自动化运维: 技术与最佳实践[M]. 北京: 机械工业出版社, 2016: 27-33.
图(3)  /  表(1)
计量
  • 文章访问数:  2367
  • HTML全文浏览量:  1321
  • PDF下载量:  29
  • 被引次数: 0
出版历程
  • 收稿日期:  2021-05-28
  • 网络出版日期:  2021-09-25
  • 刊出日期:  2021-10-19

目录

/

返回文章
返回