一种有序系统发生软件故障的重演恢复方法与流程

文档序号:20917250发布日期:2020-05-29 13:41阅读:298来源:国知局
一种有序系统发生软件故障的重演恢复方法与流程

【技术领域】

本发明涉及在linux操作系统环境下的有序系统发生软件故障的技术领域,具体涉及一种有序系统发生软件故障的重演恢复方法。



背景技术:

目前在证券期货行业最流行的快速交易系统——多活内存交易系统就是典型的有序系统,利用基于内存而非磁盘数据库进行业务处理以提升处理速度,多活和有序性则用来确保高可用和数据零丢失。多活集群由多个系统实例组成,每个实例接受完全相同的输入序列,进行完全相同的业务逻辑处理并产生完全相同的输出。这使得多活集群具备极高的可用性和故障恢复能力,任一实例发生故障都不会造成业务中断和数据丢失,并且在任何时候都可以通过重演来无损地恢复已发生故障的实例。此处的“无损”是指故障前已发生的业务在重演恢复后仍然有效,相关数据不会丢失,这对金融领域关键业务系统而言至关重要。

但这类有序系统存在一个致命问题:一个由特定输入触发的软件故障(例如段错误、浮点异常等),会导致多活集群的全部实例同时崩溃,并且无法通过重演来恢复。这是因为所有实例共用相同的代码逻辑,因此也共有相同的代码缺陷,而有序系统的特点导致系统重演到触发缺陷的输入(称为“肇事者”)时,总是会再次触发缺陷,导致系统崩溃。这是包括多活有序系统在内的所有有序系统的灾难性问题。

导致这类软件故障的代码缺陷通常较为常见,尤其是在c/c++语言开发的系统中。虽然可以通过加强测试来尽量避免,但在实际生产环境中仍然时有发生。特别是对开放服务接口的有序系统(比如证券或期货经纪商的交易平台等系统)而言,可能有许多不同的外部厂商或个人开发的异构系统或终端,通过开放接口访问系统提供的服务,在系统测试阶段很难对各家外部系统各种可能的输入进行全面覆盖。

如果外部系统的某个输入导致有序系统发生了故障,常规的做法是先尝试重启系统并重演输入序列,发现无法恢复后,立即组织开发人员迅速进行故障定位和紧急修复、升级。恢复服务的周期很长(短则几个小时,长则几天甚至几周都有可能),这对于关键业务系统而言是完全无法接受的。软件缺陷是无法完全避免的,但发生故障后不能迅速恢复是不能接受的。



技术实现要素:

本发明的目的在于针对现有技术的缺陷和不足,提供一种有序系统发生软件故障的重演恢复方法。

本发明所述的一种有序系统发生软件故障的重演恢复方法,采用如下步骤:

步骤一:针对有序系统中的业务执行流,对输入在各级业务流水线,有序系统对输入进行编号,形成在有序系统内的唯一序号,形成识别各级业务流水线身份的线程序号数据库;

步骤二:针对于linux环境下软件缺陷所引发的进程异常退出,会伴随信号的产生,形成代码缺陷数据库;

步骤三:根据步骤二中的利用代码缺陷数据库,针对于不同的异常信号,形成异常信号数据任务表;

步骤四:在有序系统中安装有,针对步骤三中的不同的异常信号处理的信号处理函数,形成信号处理函数数据库;

步骤五:在有序系统中,设置能够实时刷新的业务线程的当前任务表,当前任务表用来存放每个业务线程当前正在处理的输入信息,输入信息为序号及其他的输入信息;

步骤六:当出现步骤三中的异常信号时,步骤四中的信号处理函数数据库中相对应的信号处理函数被调用,获得触发信号的线程序号,线程序号与步骤五中的当前任务表实现查找,如果找到则为触发异常信号的输入,触发异常信号的输入为“肇事者”输入;

步骤七:将步骤六中的“肇事者”输入,将其对应的序号信息写入磁盘文件中,该磁盘文件为“肇事者”输入信息记录表;然后再进行信号处理,信号处理完毕,进程继续异常退出;

步骤八:针对步骤七中的进程继续异常退出后,实现系统重新启动,从“肇事者”记录文件中载入“肇事者”输入的序号信息,然后开始重演输入序列,系统在入口处检查接收到的输入,如果序号与“肇事者”输入匹配,则立即拦截并向外部系统返回拒绝服务的信息,形成序号过滤识别;

步骤九:针对“肇事者”输入被步骤八中的序号过滤识别多次拦截,可设定具有相同特征的“肇事者”输入的拦截次数,形成临界阈值;从而实现对符合“肇事者”特征且到达临界阈值的异常输入实现系统服务拒绝,形成防御机制。

进一步地,步骤一中的有序系统是指输入、处理和输出都是确定有序的软件系统;其中,处理是指其内部状态迁移。

进一步地,步骤一中的业务执行流为有序系统处理输入相关的线程。

本发明有益效果为:本发明所述的一种有序系统发生软件故障的重演恢复方法,它提出了一种通过抓取“肇事者”输入的特征信息,借助有序系统的重演机制和预设的防御策略来迅速恢复服务的方法,从而能够保证系统在出现问题后,能够快速恢复,保证了系统的正常使用,以及也保护了数据的安全。

【附图说明】

此处所说明的附图是用来提供对本发明的进一步理解,构成本申请的一部分,但并不构成对本发明的不当限定,在附图中:

图1是本发明中的有序系统的典型模型拓扑图;

图2是本发明中的有序系统的简化模型拓扑图;

图3是本发明中的有序系统业务处理模块内部的流水线架构拓扑图。

【具体实施方式】

下面将结合附图以及具体实施例来详细说明本发明,其中的示意性实施例以及说明仅用来解释本发明,但并不作为对本发明的限定。

如图1-图3所示,本具体实施方式所述的一种有序系统发生软件故障的重演恢复方法,采用如下步骤:

步骤一:针对有序系统中的业务执行流,对输入在各级业务流水线,有序系统对输入进行编号,形成在有序系统内的唯一序号,形成识别各级业务流水线身份的线程序号数据库;

步骤二:针对于linux环境下软件缺陷所引发的进程异常退出,会伴随信号的产生,形成代码缺陷数据库;

步骤三:根据步骤二中的利用代码缺陷数据库,针对于不同的异常信号,形成异常信号数据任务表;

步骤四:在有序系统中安装有,针对步骤三中的不同的异常信号处理的信号处理函数,形成信号处理函数数据库;

步骤五:在有序系统中,设置能够实时刷新的业务线程的当前任务表,当前任务表用来存放每个业务线程当前正在处理的输入信息,输入信息为序号及其他的输入信息;

步骤六:当出现步骤三中的异常信号时,步骤四中的信号处理函数数据库中相对应的信号处理函数被调用,获得触发信号的线程序号,线程序号与步骤五中的当前任务表实现查找,如果找到则为触发异常信号的输入,触发异常信号的输入为“肇事者”输入;

步骤七:将步骤六中的“肇事者”输入,将其对应的序号信息写入磁盘文件中,该磁盘文件为“肇事者”输入信息记录表;然后再进行信号处理,信号处理完毕,进程继续异常退出;

步骤八:针对步骤七中的进程继续异常退出后,实现系统重新启动,从“肇事者”记录文件中载入“肇事者”输入的序号信息,然后开始重演输入序列,系统在入口处检查接收到的输入,如果序号与“肇事者”输入匹配,则立即拦截并向外部系统返回拒绝服务的信息,形成序号过滤识别;

步骤九:针对“肇事者”输入被步骤八中的序号过滤识别多次拦截,可设定具有相同特征的“肇事者”输入的拦截次数,形成临界阈值;从而实现对符合“肇事者”特征且到达临界阈值的异常输入实现系统服务拒绝,形成防御机制。

进一步地,步骤一中的有序系统是指输入、处理和输出都是确定有序的软件系统;其中,处理是指其内部状态迁移。

进一步地,步骤一中的业务执行流为有序系统处理输入相关的线程。

本发明中的有序系统是指输入、处理(内部状态迁移)和输出都是确定有序的软件系统。基于相同的初始状态和输入序列,对有序系统进行无论多少次重演,每次重演发生的状态迁移和产生的输出序列总是不变的(参见附图1、附图2)。

本发明的应用范围为:基于linux操作系统环境下的有序系统发生软件故障的重演恢复方法,适用于证券行业快速交易系统提升软件故障恢复能力的场景,也可推广到金融领域或其他领域的关键业务系统中使用,只要这些系统符合有序系统的特点,都在本发明的应用范围之内。

本发明中,要解决的问题只有一个:有序系统发生由“肇事者”输入触发的软件故障而导致系统崩溃时,无法通过重启系统并重演输入序列达到迅速、无损地恢复服务的目的。其设计思路如下:本设计是针对有序系统发生崩溃时,准确捕捉到“肇事者”输入的特征信息,然后重启系统进行重演,重演到“肇事者”输入时,在入口处对该输入进行拦截处理,防止崩溃重演,并在后续正常运行过程中,根据预设的防御策略,继续对符合“肇事者”特征的输入进行防御处理,防范系统再次发生崩溃。其主要的技术难点在于如何准确捕捉到“肇事者”输入,尤其是在多线程的系统中。本方案基于linux的信号(signal,符合posix标准)机制,结合有序系统内部执行流的设计特征,设计了捕捉“肇事者”输入的机制。

本发明的工作原理如下:

1、有序系统内部执行流的设计特征:有序系统是由单一输入驱动的业务处理系统,其内部的执行流(即线程)可分成两类,一类是与处理输入相关的,称为业务执行流;另一类是与处理输入无关的,例如如写日志的线程,定时上报监控信息的线程;本发明仅关注业务执行流。

由于业务处理的严格有序性,业务执行流是由多条流水线的构成(参见附图3),每条流水线可分为多级,每一级流水线对应一个线程。极端简化的模型中,业务执行流可能只有一条且仅有一级的流水线。

有序系统必然对输入进行编号,每个输入都对应一个系统内唯一的序号;本方案要求一个输入在各级业务流水线中流动时,必须一直携带其序号(及其他特征),这是捕捉“肇事者”输入的前提。

2、二、“肇事者”输入捕捉机制:linux环境下软件缺陷所引发的进程异常退出,往往都会伴随信号的产生,进程可以捕捉这些信号,在异常退出发生之前执行一些自定义的操作,例如打印错误日志和堆栈信息等。

本发明针对常见的代码缺陷,安装相关信号的处理函数。同时在系统中设置一张实时刷新的业务线程当前任务表,用来存放每个业务线程当前正在处理的输入信息(序号及其他特征)。本方案认为相应的信号被触发时,极大可能是某一个输入正在被业务线程处理时,触发了代码缺陷(例如非法内存访问,浮点异常等)。此时信号处理函数被调用,首先获取触发信号的线程id,然后用线程id去任务表中查找,找到的输入即为触发异常信号的输入,即“肇事者”输入。找到“肇事者”输入后,将其序号等相关信息写入磁盘文件(称为“肇事者”记录表)。信号处理完毕,进程继续异常退出。

3、重演恢复机制与防御策略:系统重新启动,从“肇事者”记录文件中载入“肇事者”输入的序号等信息,此后开始重演输入序列,系统在入口处检查接收到的输入,如果序号与“肇事者”输入匹配,则立即拦截并向外部系统返回拒绝服务的信息。这就避免了“肇事者”输入再次导致进程异常退出。此方法称为序号过滤。

序号过滤完成(即“肇事者”输入的序号全部被拦截)后,表示系统通过重演已经成功地恢复了服务。但在继续处理后续输入时,依然可能再次发生崩溃。针对这种更复杂的情况,可以预设更灵活的防御策略来应对。系统在发生多次崩溃后,记录了一系列“肇事者”输入的特征信息,例如输入来源的外部系统标识,输入的命令字等等,系统可以根据这些特征继续进行防御性的拦截处理。例如,如果发现来自同一外部系统、同一命令字的“肇事者”输入个数已经超过了预设的阈值,对来自该外部系统的该命令字的输入,一律拒绝服务。此方法则称为特征过滤。特征过滤必须在序号过滤完成后方能启用,否则不能保证重演前后的数据一致性。特征过滤还可以引入更多的特征字段,根据系统可用性的要求,设计更严格或更宽松的防御策略。通过重演甚至多次重演来恢复服务,对有序系统的重演速度(即吞吐量)有较高要求,恢复服务的时间取决于待重演的业务量和重演速度。例如证券行业的快速交易系统,完全基于内存(区别于磁盘数据库)的业务处理和高度优化的并发设计,可以达到数十万笔每秒的峰值处理速度,即使重演当日的全部交易,可能也仅需要几十秒甚至更少而已。

4、本发明中的附图说明如下:

图1是有序系统的典型模型:单一输入流,多输出流。基于相同的初始状态,相同的输入序列进行多次重演,其每个输出流的序列总是保持不变。其中输入排队模块会将完成排队的输入序列保存到磁盘,业务处理模块重启后可以依次获取已排队的输入序列,进行重演并追赶至最新状态。

图2是有序系统的简化模型:单一输入流,单一输出流。

图3是有序系统业务处理模块内部的流水线架构,每条流水线对应一个输入序列(通过某种确定的静态分配策略分发)和输出序列,重演时均保持不变。每一级流水线对应一个线程。

5、本发明的具体实施如下:需要在有序系统的业务处理模块实现如下功能:

(1)安装信号处理函数:主要关注表1中的信号,可以覆盖绝大多数导致进程异常退出的软件缺陷。在模块初始化时通过系统调用sigaction()安装所关注信号的信号处理函数(函数的具体实现描述参见3)。

本发明中,sigaction()是posix标准定义的信号处理接口,具有较好的可移植性,并且可以安装参数信息更丰富的信号处理函数:voidsa_sigaction(intsignum,siginfo_t*siginfo,void*ucontext),在捕获信号时可以获得更多的相关信息(通过参数siginfo)。更详细的说明请参见linux帮助手册。

(2)实时刷新业务线程当前任务表

设置一个业务线程当前任务表(存放在内存中),用来存放每个业务线程当前正在处理的输入的序号及其他特征(根据具体情况选取)。表主键为业务线程的tid(通过系统调用syscall(sys_gettid)获取)。表2提供了任务表的一个示例。业务线程在从队列中取出一个输入后,应立即更新业务线程当前任务表中自己的记录,表示当前正在处理该输入。

(3)实现信号处理函数捕捉“肇事者”输入:

首先,先排除用户通过kill()或raise()发送的信号,判断siginfo->si_code==si_user是否为真,为真则该信号与模块自身的缺陷无关,结束处理流程;其次,获取信号处理函数的当前线程tid(通过系统调用syscall(sys_gettid)获取)。表1中信号,如果是由某线程执行代码触发的,则信号也会被投递到该线程,因此获取到当前线程tid就是“肇事者”线程tid【注:在linux内核2.6.32及以上版本测试通过】;再次,用获取到的tid在业务线程当前任务表中查询,如未查到记录,则结束处理流程;如查到,则认为是“肇事者”输入;然后,将“肇事者”输入的序号等信息与当前时间戳、触发的信号等信息追加写入当日(或者自定义的时间周期内)的“肇事者”记录文件;最后,打印错误日志,结束处理流程。

(4)实现输入统一入口处的防御过滤器:模块初始化时载入当日(或自定义的时间周期内)的“肇事者”记录文件,根据载入的记录,生成两个防御过滤器:序号过滤器和特征过滤器。序号过滤器很简单,仅包含所有“肇事者”输入的序号集合。特征过滤器则需根据预设的特征或特征组合,对“肇事者”记录进行合并计数,把超过预设阈值的特征记录集合加入特征过滤器。在模块统一的输入入口处设置这两个过滤器,首先启用序号过滤器,对依次进入的输入(序号从小到大)按序号进行过滤,对序号匹配的输入进行拦截并拒绝服务,同时将过滤器中该序号删除。直到序号过滤器为空,表示序号过滤已经完成;此后启用特征过滤器,对特征匹配的输入进行拦截并拒绝服务,直到系统结束运行。

本发明所述的一种有序系统发生软件故障的重演恢复方法,它克服了有序系统(尤其是多活有序系统)的致命缺陷,大大提升了系统可用性。在有序系统发生由“肇事者”输入触发的软件故障而导致系统崩溃时,可以通过本方案迅速、无损地恢复服务,并可对系统后续运行可能出现的同类故障提供一定的防御功能。

以上所述仅是本发明的较佳实施方式,故凡依本发明专利申请范围所述的构造、特征及原理所做的等效变化或修饰,均包括于本发明专利申请范围内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1