一种分布式软件系统可靠性加强模块设计
2019-09-19孙晓冬
孙晓冬
摘要:针对分布式的软件系统,设计了一种可靠性加强模块。该模块监控分布式软件各个处理单元的运行状态,并记录关键内存数据和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 结束语
本文论述了一种针对分布式软件系统设计的可靠性加强模块,该模块分为主守护模块与分布式模块两个部分。主守护模块单独运行于一个运算节点上,分布式模块运行于分布式软件系统的各个软件配置项之中。可靠性加强模块监视各软件配置项的运行状态,同时记录各配置项的关键内存数据和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).
【通联编辑:谢媛媛】