CN113220407B - 故障演练的方法和装置 - Google Patents

故障演练的方法和装置 Download PDF

Info

Publication number
CN113220407B
CN113220407B CN202010079834.1A CN202010079834A CN113220407B CN 113220407 B CN113220407 B CN 113220407B CN 202010079834 A CN202010079834 A CN 202010079834A CN 113220407 B CN113220407 B CN 113220407B
Authority
CN
China
Prior art keywords
fault
exercised
exercise
class
request
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN202010079834.1A
Other languages
English (en)
Other versions
CN113220407A (zh
Inventor
张玉
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Jingdong Zhenshi Information Technology Co Ltd
Original Assignee
Beijing Jingdong Zhenshi Information Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Beijing Jingdong Zhenshi Information Technology Co Ltd filed Critical Beijing Jingdong Zhenshi Information Technology Co Ltd
Priority to CN202010079834.1A priority Critical patent/CN113220407B/zh
Publication of CN113220407A publication Critical patent/CN113220407A/zh
Application granted granted Critical
Publication of CN113220407B publication Critical patent/CN113220407B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45504Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/366Software debugging using diagnostics

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明公开了故障演练的方法和装置,涉及计算机技术领域。该方法的一具体实施方式包括:接收故障演练请求,确定请求对应的待演练故障和需要演练待演练故障的目标实例;获取待演练故障对应的待演练故障类,利用待演练故障类在目标实例上演练待演练故障;在待演练故障演练成功的情况下,获取故障演练结果,并根据故障演练结果进行预警。该实施方式能够将故障精细管理,提供较多的场景,易于扩展,并且采用故障类的技术手段,可以克服现有技术中硬编码开发成本大的技术问题,达到以可控的成本在线上或测试环境演练故障,以持续性的演练和回归方式来暴露问题,大幅缩减演练的成本。

Description

故障演练的方法和装置
技术领域
本发明涉及计算机技术领域,尤其涉及一种故障演练的方法和装置。
背景技术
信息技术的不断发展,系统工具和架构已经高度垂直化,达到了比较大的体量。这意味着随时的变化,需求不断的迭代,系统不断的规划及发布,整个链条上的系统都可能发生故障。如果某个系统整体发生故障或者系统某个局部发生故障,对上下游的影响程度和范围无法考量,因此对系统进行故障演练具有重大意义。
现有技术采用以下方法进行人为干预模拟故障:一、采用硬编码的方式,在原有代码上添加故障模拟代码,上线发布后故障生效,再次上线,移除故障模拟代码后,故障才失效;二、暴力模拟,比如,拔出网线、杀死进程、或者停止数据库服务等。
在实现本发明过程中,发明人发现现有技术中至少存在如下问题:一、硬编码的方式有一定的开发成本,考虑不周可能会造成更严重的故障发生,故障生效或失效不及时,会影响环境稳定;二、暴力模拟的方式影响较大,可供模拟的场景不全,只能粗粒度的模拟部分故障场景,与真实故障场景存在差异。
发明内容
有鉴于此,本发明实施例提供一种故障演练的方法和装置,能够将故障精细管理,提供较多的场景,易于扩展,降低故障演练的成本。
为实现上述目的,根据本发明实施例的第一方面,提供了一种故障演练的方法。
本发明实施例的一种故障演练的方法,包括:接收故障演练请求,确定所述请求对应的待演练故障和需要演练所述待演练故障的目标实例;获取所述待演练故障对应的待演练故障类,利用所述待演练故障类在所述目标实例上演练所述待演练故障;在所述待演练故障演练成功的情况下,获取故障演练结果,并根据所述故障演练结果进行预警。
可选地,所述获取所述待演练故障对应的待演练故障类,利用所述待演练故障类在所述目标实例上演练所述待演练故障,包括:根据所述待演练故障的类型信息,获取所述待演练故障类;将所述待演练故障类重启加载至所述目标实例的类加载器中,调用所述待演练故障类对应的模拟方法,且对调用的模拟方法进行验证;在验证通过的情况下,根据所述待演练故障的参数信息,判断所述请求是否需要故障演练;若是,则确认所述待演练故障演练成功,若否,则确认所述待演练故障演练失败。
可选地,所述对调用的模拟方法进行验证,包括:获取所述待演练故障对应的目标方法和目标类;判断所述模拟方法的调用来源是否为所述目标方法和所述目标类,若是,则确认验证通过,否则,则确认验证不通过。
可选地,在根据所述待演练故障的类型信息,获取所述待演练故障类之前,所述方法还包括:根据故障的类型信息,预先配置所述故障对应的故障类。
可选地,所述接收故障演练请求,确定所述请求对应的待演练故障和需要演练所述待演练故障的目标实例,包括:接收所述故障演练请求,并根据所述请求,确定所述待演练故障;根据所述请求,确定需要演练所述待演练故障的目标应用;从故障管理信息表中,查询在所述目标应用下需要演练所述待演练故障的目标实例。
可选地,在从故障管理信息表中,查询在所述目标应用下需要演练所述待演练故障的目标实例之前,所述方法还包括:构建所述故障管理信息表,所述故障管理信息表中存储应用、实例以及故障之间的对应关系。
为实现上述目的,根据本发明实施例的第二方面,提供了一种故障演练的装置。
本发明实施例的一种故障演练的装置,包括:确定模块,用于接收故障演练请求,确定所述请求对应的待演练故障和需要演练所述待演练故障的目标实例;演练模块,用于获取所述待演练故障对应的待演练故障类,利用所述待演练故障类在所述目标实例上演练所述待演练故障;预警模块,用于在所述待演练故障演练成功的情况下,获取故障演练结果,并根据所述故障演练结果进行预警。
可选地,所述演练模块还用于:根据所述待演练故障的类型信息,获取所述待演练故障类;将所述待演练故障类重启加载至所述目标实例的类加载器中,调用所述待演练故障类对应的模拟方法,且对调用的模拟方法进行验证;在验证通过的情况下,根据所述待演练故障的参数信息,判断所述请求是否需要故障演练;若是,则确认所述待演练故障演练成功,若否,则确认所述待演练故障演练失败。
可选地,所述演练模块还用于:获取所述待演练故障对应的目标方法和目标类;判断所述模拟方法的调用来源是否为所述目标方法和所述目标类,若是,则确认验证通过,否则,则确认验证不通过。
可选地,所述装置还包括:配置模块,用于根据故障的类型信息,预先配置所述故障对应的故障类。
可选地,所述确定模块还用于:接收所述故障演练请求,并根据所述请求,确定所述待演练故障;根据所述请求,确定需要演练所述待演练故障的目标应用;从故障管理信息表中,查询在所述目标应用下需要演练所述待演练故障的目标实例。
可选地,所述装置还包括:构建模块,用于构建所述故障管理信息表,所述故障管理信息表中存储应用、实例以及故障之间的对应关系。
为实现上述目的,根据本发明实施例的第三方面,提供了一种电子设备。
本发明实施例的一种电子设备包括:一个或多个处理器;存储装置,用于存储一个或多个程序,当一个或多个程序被一个或多个处理器执行,使得一个或多个处理器实现本发明实施例的故障演练的方法。
为实现上述目的,根据本发明实施例的第四方面,提供了一种计算机可读介质。
本发明实施例的一种计算机可读介质,其上存储有计算机程序,程序被处理器执行时实现本发明实施例的故障演练的方法。
上述发明中的一个实施例具有如下优点或有益效果:在根据故障演练请求确定故障和需要演练该故障的实例后,可以在实例上利用该故障对应的故障类进行故障演练,并对演练结果进行监控预警,能够将故障精细管理,提供较多的场景,易于扩展,并且采用故障类的技术手段,可以克服现有技术中硬编码开发成本大的技术问题,达到以可控的成本在线上或测试环境演练故障,以持续性的演练和回归方式来暴露问题,大幅缩减演练的成本。
上述的非惯用的可选方式所具有的进一步效果将在下文中结合具体实施方式加以说明。
附图说明
附图用于更好地理解本发明,不构成对本发明的不当限定。其中:
图1是根据本发明实施例的故障演练的方法的主要步骤的示意图;
图2是根据本发明实施例的故障演练的系统的结构示意图;
图3是根据本发明实施例的故障演练的方法的主要流程的示意图;
图4是根据本发明实施例的故障演练的装置的主要模块的示意图;
图5是本发明实施例可以应用于其中的示例性系统架构图;
图6是适于用来实现本发明实施例的终端设备或服务器的计算机系统的结构示意图。
具体实施方式
以下结合附图对本发明的示范性实施例做出说明,其中包括本发明实施例的各种细节以助于理解,应当将它们认为仅仅是示范性的。因此,本领域普通技术人员应当认识到,可以对这里描述的实施例做出各种改变和修改,而不会背离本发明的范围和精神。同样,为了清楚和简明,以下的描述中省略了对公知功能和结构的描述。
当前,采用硬编码或者暴力模拟的方式进行故障演练。但是,硬编码的方式需要开发成本,而且考虑不周可能会造成更严重的故障发生,故障生效或失效不及时,会影响环境稳定;暴力模拟的方式影响较大,可供模拟的场景不全,只能粗粒度的模拟部分故障场景,与真实故障场景存在差异。为了解决上述问题,本发明实施例提供一种故障演练的方法,能够在对系统无侵入的情况下,模拟各种故障,且以可控成本进行故障演练,以持续性的演练和回归方式来暴露问题,大幅缩减演练的成本。图1是根据本发明实施例的故障演练的方法的主要步骤的示意图,如图1所示,本发明实施例的故障演练的方法的主要步骤可以包括:
步骤S101:接收故障演练请求,确定请求对应的待演练故障和需要演练待演练故障的目标实例;
步骤S102:获取待演练故障对应的待演练故障类,利用待演练故障类在目标实例上演练待演练故障;
步骤S103:在待演练故障演练成功的情况下,获取故障演练结果,并根据故障演练结果进行预警。
其中,故障演练请求是指演练某个故障的请求,因此本发明实施例中,可以根据接收的故障演练请求中,确定具体的需要演练的故障,也就是待演练故障。其中,故障可以包括:数据库故障、缓存故障、消息队列故障以及应用故障等。此外,利用故障演练请求还可以得到需要演练该待演练故障的目标实例,其中,实例可以看作是部署应用的机器,目标实例是指需要演练该待演练故障的机器。
通过步骤S101得到待演练故障后,需要获取该待演练故障对应的待演练故障类,这样就可以在需要演练该待演练故障的机器上,利用该待演练故障类演练该待演练故障。类是指具备某些共同特征的实体的集合,它是一种抽象的概念,用程序设计的语言来说,类是一种抽象的数据类型,它是对所具有相同特征实体的抽象。待故障演练类是指需要演练的故障类,相当于是需要演练的故障执行程序,本发明实施例中可以将需要演练的故障执行程序加载至类加载器中,从而可以调用待演练故障对应的模拟方法,比如说,待演练故障类是数据库故障类,则说明需要演练的故障执行程序为数据库故障执行程序,也就是模拟数据库故障,可以将数据库故障执行程序加载至类加载器中,从而可以调用数据库故障对应的模拟方法。本发明实施例中故障类还可以包括:缓存故障类、消息队列故障类以及应用故障类等等,也就是说,可以演练缓存故障、消息队列故障以及应用故障等等。
本发明实施例中,在目标实例上演练待演练故障会出现演练成功和演练失败两种情况,演练成功是指待演练故障在目标实例上演练成功,就是指目标实例上出现待演练故障。假设,某应用A部署在机器S上,待演练故障是数据库故障,因此在机器S上执行应用A,模拟数据库故障,可能出现数据库连接成功和数据库连接失败两种情况。本发明实施例中,如果数据库连接成功说明故障模拟失败,如果数据库连接失败说明故障模拟成功。
本发明实施例在待演练故障演练成功的情况下,需要获取故障演练结果,并根据故障演练结果进行预警,这样应用负责人可以验证故障发生后,研发人员还可以验证监控报警、限流降级、容灾策略、故障处理的有效性等。其中,监控报警是指系统中会针对出现故障的地方设置报警,比如监控是否能获取数据库连接、在数据库上执行的语句是否耗时较长等。现有技术中,如果设置报警,但因为故障不发生,报警是否有效无法验证,接收报警的人是否能及时响应无法验证,本发明实施例可以同步模拟故障,触发报警,来验证以上情景。限流降级是指研发通常需要对高并发、大数据量的服务做限流措施。对服务中的非关键流程(假设会发生故障)做降级措施,限流或降级的措施是否有效也很难验证,而本技术方案可以通过故障模拟,来触发限流或降级措施来验证措施是否有效。容灾策略是指,比如当数据库故障时研发会通过程序来切换到其它无故障的数据源,某个机房故障时会切换到其它无故障的机房,而线上都很难验证切换是否有效,切换的耗时是否快速,本发明实施例可以通过故障演练,模拟数据库故障或机房故障来进行线上验证。
综上,监控报警、限流降级、容灾策略以及故障处理场景都可以通过故障演练来验证。此外,故障演练还可以验证局部故障的影响范围,如缓存故障、数据库故障等发生时系统的可用性及性能表现;还可以验证上下游系统之间的强弱依赖关系,原则上稳定的系统不能依赖不稳定的系统,也就时说稳定系统中如果调用不稳定系统的服务,当不稳定系统的服务出现故障时,稳定系统应该通过降级的方式不受影响或受到很少的影响,在线上也不好验证,因为故障在线上通常很难发生,所以可以通过模拟不稳定系统提供的服务出现故障,来验证稳定系统受到的影响。而且,本发明实施例还可以解决故障复现,帮助研发定位问题。研发定位问题通常需要故障能够反复发生,研发在故障发生时搜集数据,再通过数据分析问题,而线上的问题通常时偶发的,可能触发一次后再也不发生了,所以不好定位,但是通过故障演练来还原场景,有助于研发定位问题。
在上文步骤S101中介绍过,故障演练请求是指演练某个故障的请求,目标实例是指需要演练该待演练故障的机器,且实例可以看作是部署应用的机器,一个应用可以部署多个实例,也就是说,可以在多个机器上部署一个应用。因此,作为一个可参考实施例,步骤S101接收故障演练请求,确定请求对应的待演练故障和需要演练待演练故障的目标实例,可以包括:
步骤S1011:接收故障演练请求,并根据请求,确定待演练故障;
步骤S1012:根据请求,确定需要演练待演练故障的目标应用;
步骤S1013:从故障管理信息表中,查询在目标应用下需要演练待演练故障的目标实例。
本发明实施例中可以按应用发起故障演练请求,又或者是,本发明实施例中可以按系统发起故障演练请求,一个系统包含多个不同的应用,这就相当于该系统下所有应用都将会产生要演练的故障。由于可以在多个机器上部署一个应用,因此,不管是按应用发起故障演练请求还是按系统发起故障请求,实际上是对应用下部署的实例发起故障演练请求。所以在确定目标实例的方法中,首先根据请求确定待演练故障和目标应用,然后在故障管理信息表中,查询该目标应用下需要演练该待演练故障的目标实例,也就是查询部署目标应用且需要演练待演练故障的目标实例。
所以,在从故障管理信息表中,查询在目标应用下需要演练待演练故障的目标实例之前,本发明实施例的故障演练的方法还可以包括:构建故障管理信息表,故障管理信息表中存储应用、实例以及故障之间的对应关系。本发明实施例的故障演练的方法中,需要预先确定应用、实例以及故障三者之间的对应关系,具体地,可以预先确定包含的应用、该应用下部署的实例、以及该应用下部署的实例中可以演练的故障,或者是,可以预先确定需要演练的故障、需要演练该故障的应用、以及该应用下部署的需要演练该故障的实例,这样就建立了应用、实例以及故障三者之间的对应关系。当然,由于本发明实施例中可以按系统发起故障演练请求,也就是向系统下所有应用发起故障演练请求,所以故障管理信息表中还应该存储系统与应用之间的对应关系。
举例说,故障管理信息表中存储:系统W下具有应用A1、A2和A3,应用A1下部署的实例S1至S4,应用A2下部署的实例S5至S9,应用A3下部属的实例S10至S12,S1至S3、S5至S6和S10需要演练故障K1,S2至S4、S5至S9和S11至S12需要演练故障K2。因此,向系统W发起演练故障K1的请求时,就是向实例S1至S3、S5至S6和S10发起演练故障K1的请求。向应用A1发起演练故障K2的请求时,就是向实例S2至S4发起演练故障K2的请求。
本发明实施例中,在目标实例上演练待演练故障是故障演练方法中的重要部分。作为又一个可参考实施例,步骤S102获取待演练故障对应的待演练故障类,利用待演练故障类在目标实例上演练待演练故障,可以包括:
步骤S1021:根据待演练故障的类型信息,获取待演练故障类;
步骤S1022:将待演练故障类重启加载至目标实例的类加载器中,调用待演练故障类对应的模拟方法,且对调用进行验证;
步骤S1023:在验证通过的情况下,根据待演练故障的参数信息,判断请求是否需要故障演练;
步骤S1024:若是,则确认待演练故障演练成功,若否,则确认待演练故障演练失败。
本发明实施例的故障演练方法中,需要根据待演练故障的类型信息,获取待演练故障类。因此,本发明实施例中,在根据待演练故障的类型信息,获取待演练故障类之前,故障演练的方法还可以包括:根据故障的类型信息,预先配置故障对应的故障类。
其中,故障可以包括:数据库故障、缓存故障、消息队列故障以及应用故障。其中,数据库故障的类型信息可以包括:获取不到数据库连接和数据库连接延迟;获取不到数据库连接是指模拟数据库实例故障,应用获取不到数据库连接;数据库连接延迟是指模拟应用到数据库之间的网络故障,表现为应用获取连接延迟。缓存故障的类型信息可以包括:操作延迟、连接超时和缓存穿透;操作延迟是指模拟应用到缓存之间的网络故障,对缓存的操作延迟;连接超时是指模拟缓存进程故障,并且不可自动恢复时,应用对缓存的操作超时;缓存穿透是指模拟缓存穿透现象,应用对Redis的读操作都无值返回。消息队列故障的类型信息可以包括:消费延迟和生产延迟;消费延迟是指模拟应用在消费消息时故障,从而积压;生产延迟是指模拟应用在写消息时超时或延迟。应用故障的类型信息可以包括:内存抢占和CPU消耗;内存抢占是指模拟应用内存消耗;CPU消耗是指模拟应用CPU消耗。
本发明实施例中,可以使用Java Instrument技术(Instrument类似一种更低级、更松耦合的面向切面编程,可以从底层来改变一个类的行为)来实现一个Java Agent程序(Java Agent能够在不影响正常编译的情况下修改字节码,相当于是运行方法之前的拦截器),对应用程序类加载器下的类进行字节码增强(字节码编辑可以使用ASM等技术),在类的每一个方法植入钩子(Hook,是系统消息处理机制的一个平台,应用程序可以在上面设置子程序以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的)程序,该钩子程序默认不需要实现任何逻辑,故障演练请求发起前对应用没有任何影响,而当故障演练请求发起时,钩子程序源代码会被替换成相应的故障模拟逻辑代码,故障模拟逻辑代码中需要判断当前类及方法是否为待演练故障类型涉及的类及方法,比如使用数据库连接池的数据库故障,则需要对BasicDataSource类的getConnection()方法启用故障逻辑。
因此,根据故障演练请求确定目标实例之后,就是将故障演练请求发送至目标实例之后,目标实例可以根据待演练故障的类型信息,将待演练故障对应的Hook类重新加载到类加载器中,这样该待演练故障开始生效。在接收到故障中止请求时,将默认的Hook类加载到类加载器中,故障即可中止。本发明实施例中,为了实现不重启服务器就能实现故障模拟,存在两种形式的钩子程序,一种是默认的不实现任何逻辑的程序,另一种是故障模拟逻辑代码,如果有故障演练请求时,可以将类加载器中的“默认的不实现任何逻辑的程序”替换为“故障模拟逻辑代码”,在有故障中止请求时,将“默认的不实现任何逻辑的程序”加载到类加载其器中,从而将“故障模拟逻辑代码”替换掉。当然,本发明实施例中,如果知道待演练故障对应的待演练故障类,则可以直接修改类,然后重新加载到虚拟机内存中。
在实现类的加载过程中,对可以引起故障的类文件进行字节码增加,将待演练故障对应的Hook类的模拟方法(即,mock方法)植入到方法体开始位置(压入操作栈顶部),默认的Hook.mock方法不执行任何逻辑,所以故障未启动时不会改变原有方法逻辑。mock()是模拟方法名,可以任意单词,在每个类初始化时在每个方法中植入mock()方法,未演练故障时,mock()方法中无任何逻辑,对类来说相当于什么都没发生。故障演练时,mock()方法被替换,重新加载,方法中开始有了故障逻辑,对类的方法来说相当于触发了故障逻辑,因此产生故障。
因此,在目标实例上演练待演练故障的过程中,需要首先根据待演练故障的类型信息,获取故障类型对应的待演练故障Hook类,本发明实施例中将根据不同的类型信息,预先配置该待演练故障对应的待演练故障Hook类,然后将待演练故障Hook类通过类加载器重启加载,相当于在虚拟机内存中覆盖掉默认的Hook行为,被植入Hook类在运行过程中会调用新的mock方法。
考虑到执行在目标实例上部署的应用时,需要调用多个方法和类,因此需要对调用的方法进行验证。在步骤S1021根据待演练故障的类型信息,获取到该待演练故障对应的待演练故障类之后,需要将待演练故障类重启加载至目标实例的类加载器中,调用待演练故障类对应的模拟方法。此外还需要注意的是,本发明实施例中在调用待演练故障类对应的模拟方法后,需要对调用的模拟方法进行验证。
本发明实施例中,对调用的模拟方法进行验证可以实现为:获取待演练故障对应的目标方法和目标类;判断调用的调用来源是否为目标方法和目标类,若是,则确认验证通过,否则,则确认验证不通过。比如使用数据库连接池的数据库故障,则需要对BasicDataSource类的getConnection()方法启用故障逻辑。
在对调用方法的验证通过的情况下,还需要根据待演练故障的参数信息,判断此次故障演练请求是否需要被执行。本发明实施例中,为了更加符合实际情况,在故障演练方法中,需要模拟故障演练的成功比例,其中,故障演练的成功比例是由故障的参数信息决定的。表1是故障信息表,存储故障、故障的类型信息、故障的具体介绍以及故障的参数信息。
表1是故障信息表
为了便于理解,提供具体实施例解释利用Hook类演练故障。
实施例一、演练使用数据库时,获取不到数据库连接的故障。
步骤1:mock方法执行时判断调用来源是否为DasicDataSourc类的getConnection方法,若是,则执行步骤2,否则,结束;
步骤2:根据设置的无法获取连接的比例进行随机算法来控制需要演练故障的请求比例;
步骤3:如果此次请求不需要进行故障演练,则结束,如果此次请求需要进行故障演练,mock方法抛出CannotGetJdbcConnection异常;
步骤4:追加数据到监控日志文件中,触发报警。
实施例二、演练使用数据库时,获取连接延时的故障。
步骤1:mock方法执行时判断调用来源是否为DasicDataSourc类的getConnection方法,若是,则执行步骤2,否则,结束;
步骤2:根据设置的获取连接延迟的比例进行随机算法来控制需要模拟故障的请求比例;
步骤3:如果此次请求不需要模拟故障,则结束,如果此次请求需要模拟故障,mock方法抛出将当前线程休眠指定的时间(根据延迟时间参数来设置),休眠完成后结束mock方法;
步骤4:追加数据到监控日志文件中,触发报警。
实施例三、演练缓存操作延时的故障。
在开发过程中,一般都会对缓存封装成客户端,模拟缓存故障也需要在客户端中植入Hook程序,运行过程中改变客户端行为来模拟故障。
步骤1:mock方法执行时判断调用来源是否为缓存GET封装类及方法(每个系统的客户端不一致,所以可以通过故障参数来指定缓存的客户端类及方法),若是,则执行步骤2,否则,结束;
步骤2:根据故障设置的延迟比例进行随机算法来控制需要模拟故障的请求比例;
步骤3:如果此次请求不需要模拟故障,则结束,如果此次请求需要模拟故障,mock方法抛出将当前线程休眠指定的时间(根据延迟时间参数来设置),休眠完成后结束mock方法;
步骤4:追加数据到监控日志文件中,触发报警。
实施例四、演练缓存操作超时的故障。
步骤1:mock方法执行时判断来源类及方法是否为缓存相关命令的方法,若是,则执行步骤2,否则,结束;
步骤2:根据超时比例进行随机算法来控制请求的故障比例;
步骤3:如果请求需要模拟故障,根据超时时间参数,休眠当前线程,线程休眠结束后,mock方法抛出超时异常
步骤4:追加数据到监控日志中,触发报警。
实施例五、演练缓存穿透的故障。
缓存穿透,也就是无法命中缓存,穿透后一般后请求其它数据源,模拟缓存穿透的意义就在于验证数据源是否能够在大量请求无法命中缓存的情况下抗住压力。
步骤1:mock方法执行时判断来源类及方法是否为Reids GET相关命令的方法,若是,则执行步骤2,否则,结束;
步骤2:根据穿透比例进行随机算法来控制请求的故障比例
步骤3:如果请求需要模拟故障,mock方法直接返回空值,导致客户端无法获取数据,实现穿透效果,从而验证缓存穿透时,全部请求需要回源时的效果;
步骤4:追加数据到监控日志,触发报警。
图2是根据本发明实施例的故障演练的系统的结构示意图。如图2所示,本发明实施例的故障演练的系统可以包括:故障管理端、故障发生器和故障数据采集器。
其中,故障管理端可以用于维护参与演练的系统、应用及部署实例的信息,用户可以按系统发起故障演练请求,在这种模式下系统下所有应用都将会产生要演练的故障;用户也可以按应用发起故障演练请求,在这种模式下只有相应的应用会产生要演练的故障。用户通过故障管理端对应用发起故障请求(启动和中止),实际上是对应用下所有部署实例发送故障演练请求,请求中明确启动或中止故障的实例及端口(默认),故障的类型及故障的参数。
故障管理端在确定需要演练的实例之后,将故障请求分发到相应实例,然后由实例中的故障发生器来执行该故障请求。也就是说,本发明实施例中,可以是在实例上配置有故障发生器,因此故障管理端确定需要演练的实例之后,可以将故障演练请求分发至需要演练的实例,最后实例上配置的故障发生器可以执行该演练请求。
其中,故障发生器可以使用Java Instrument技术来实现一个Java Agent程序,对应用程序类加载器下的类进行字节码增强,在类的每一个方法植入钩子程序,钩子程序默认不需要实现任何逻辑,故障演练请求发起前对应用没有任何影响,而当故障演练请求发起时,钩子程序源代码会被替换成相应的故障模拟逻辑代码,故障模拟逻辑代码中需要判断当前类及方法是否为指定故障类型涉及的类及方法。最后,故障发生器在接收到故障演练拟请求时,根据待演练故障的类型信息将相应的待演练故障类重新加载到类加载器中,故障开始生效。此外,故障发生器在接收到故障中止请求时,可以将原有的默认的钩子程序加载到类加载器中,故障即可中止。
故障数据采集器可以负责将监控日志中的数据压缩后发送到故障管理端,故障管理端接收到监控数据后按应用维护进行汇总,并给应用负责人发送相应的报警消息,验证故障发生后,研发人员针对故障的预案是否有效。所以,故障管理端还可以记录故障请求做统计分析,统计出各系统模拟故障的次数,各种故障类型的使用比例等。
图3是根据本发明实施例的故障演练的方法的主要流程的示意图.如图3所示,本发明实施例的故障演练的方法的主要流程可以包括:
步骤S301:接收故障演练请求,并根据请求,确定待演练故障和需要演练待演练故障的目标应用;
步骤S302:从故障管理信息表中,查询在目标应用下需要演练待演练故障的目标实例;
步骤S303:根据待演练故障的类型信息,获取待演练故障类、待演练故障对应的目标方法和目标类;
步骤S304:将待演练故障类重启加载至目标实例的类加载器中,调用待演练故障类对应的模拟方法;
步骤S305:判断模拟方法的调用来源是否为目标方法和目标类,若是,则执行步骤S306,若否,则执行步骤S308;
步骤S306:根据待演练故障的参数信息,判断此次请求是否需要故障演练,若是,则执行步骤S307,若否,则执行步骤S308;
步骤S307:获取故障演练结果,并根据故障演练结果进行预警;
步骤S308:确认故障演练不成功。
需要注意的是,在步骤S302中,需要查询在目标应用下需要演练待演练故障的目标实例,因此在步骤S302之前,需要存储应用、实例以及故障之间的对应关系。此外,在步骤S303中,需要根据待演练故障的类型信息,获取待演练故障类,因此在步骤S303之前,需要根据故障的类型信息,预先配置所述故障对应的故障类。
根据本发明实施例的故障演练的技术方案,在根据故障演练请求确定故障和需要演练该故障的实例后,可以在实例上利用该故障对应的故障类进行故障演练,并对演练结果进行监控预警,能够将故障精细管理,提供较多的场景,易于扩展,并且采用故障类的技术手段,可以克服现有技术中硬编码开发成本大的技术问题,达到以可控的成本在线上或测试环境演练故障,以持续性的演练和回归方式来暴露问题,大幅缩减演练的成本。
图4是根据本发明实施例的故障演练的装置的主要模块的示意图。如图4所示,本发明实施例的故障演练的装置400可以包括:确定模块401、演练模块402和预警模块403。
其中,确定模块401可用于接收故障演练请求,确定请求对应的待演练故障和需要演练待演练故障的目标实例;演练模块402可用于获取待演练故障对应的待演练故障类,利用待演练故障类在目标实例上演练待演练故障;预警模块403可用于在待演练故障演练成功的情况下,获取故障演练结果,并根据故障演练结果进行预警。
本发明实施例中,演练模块402还可用于:根据待演练故障的类型信息,获取待演练故障类;将待演练故障类重启加载至目标实例的类加载器中,调用待演练故障类对应的模拟方法,且对调用的模拟方法进行验证;在验证通过的情况下,根据待演练故障的参数信息,判断请求是否需要故障演练;若是,则确认待演练故障演练成功,若否,则确认待演练故障演练失败。
本发明实施例中,演练模块402还可用于:获取待演练故障对应的目标方法和目标类;判断模拟方法的调用来源是否为目标方法和目标类,若是,则确认验证通过,否则,则确认验证不通过。
本发明实施例中,故障演练的装置还可以包括:配置模块(图中未示出)。该配置模块可用于根据故障的类型信息,预先配置故障对应的故障类。
本发明实施例中,确定模块401还可用于:接收故障演练请求,并根据请求,确定待演练故障;根据请求,确定需要演练待演练故障的目标应用;从故障管理信息表中,查询在目标应用下需要演练待演练故障的目标实例。
本发明实施例中,故障演练的装置还可以包括:构建模块(图中未示出)。该构建模块可用于构建故障管理信息表,故障管理信息表中存储应用、实例以及故障之间的对应关系。
从以上描述可以看出,本发明实施例的故障演练的装置在根据故障演练请求确定故障和需要演练该故障的实例后,可以在实例上利用该故障对应的故障类进行故障演练,并对演练结果进行监控预警,能够将故障精细管理,提供较多的场景,易于扩展,并且采用故障类的技术手段,可以克服现有技术中硬编码开发成本大的技术问题,达到以可控的成本在线上或测试环境演练故障,以持续性的演练和回归方式来暴露问题,大幅缩减演练的成本。
图5示出了可以应用本发明实施例的故障演练的方法或故障演练的装置的示例性系统架构500。
如图5所示,系统架构500可以包括终端设备501、502、503,网络504和服务器505。网络504用以在终端设备501、502、503和服务器505之间提供通信链路的介质。网络504可以包括各种连接类型,例如有线、无线通信链路或者光纤电缆等等。
用户可以使用终端设备501、502、503通过网络504与服务器505交互,以接收或发送消息等。终端设备501、502、503上可以安装有各种通讯客户端应用,例如购物类应用、网页浏览器应用、搜索类应用、即时通信工具、邮箱客户端、社交平台软件等(仅为示例)。
终端设备501、502、503可以是具有显示屏并且支持网页浏览的各种电子设备,包括但不限于智能手机、平板电脑、膝上型便携计算机和台式计算机等等。
服务器505可以是提供各种服务的服务器,例如对用户利用终端设备501、502、503所浏览的购物类网站提供支持的后台管理服务器(仅为示例)。后台管理服务器可以对接收到的产品信息查询请求等数据进行分析等处理,并将处理结果(例如目标推送信息、产品信息--仅为示例)反馈给终端设备。
需要说明的是,本发明实施例所提供的故障演练的方法一般由服务器505执行,相应地,故障演练的装置一般设置于服务器505中。
应该理解,图5中的终端设备、网络和服务器的数目仅仅是示意性的。根据实现需要,可以具有任意数目的终端设备、网络和服务器。
下面参考图6,其示出了适于用来实现本发明实施例的终端设备的计算机系统600的结构示意图。图6示出的终端设备仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。
如图6所示,计算机系统600包括中央处理单元(CPU)601,其可以根据存储在只读存储器(ROM)602中的程序或者从存储部分608加载到随机访问存储器(RAM)603中的程序而执行各种适当的动作和处理。在RAM 603中,还存储有系统600操作所需的各种程序和数据。CPU 601、ROM 602以及RAM 603通过总线604彼此相连。输入/输出(I/O)接口605也连接至总线604。
以下部件连接至I/O接口605:包括键盘、鼠标等的输入部分606;包括诸如阴极射线管(CRT)、液晶显示器(LCD)等以及扬声器等的输出部分607;包括硬盘等的存储部分608;以及包括诸如LAN卡、调制解调器等的网络接口卡的通信部分609。通信部分609经由诸如因特网的网络执行通信处理。驱动器610也根据需要连接至I/O接口605。可拆卸介质611,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器610上,以便于从其上读出的计算机程序根据需要被安装入存储部分608。
特别地,根据本发明公开的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本发明公开的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分609从网络上被下载和安装,和/或从可拆卸介质611被安装。在该计算机程序被中央处理单元(CPU)601执行时,执行本发明的系统中限定的上述功能。
需要说明的是,本发明所示的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本发明中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本发明中,计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、RF等等,或者上述的任意合适的组合。
附图中的流程图和框图,图示了按照本发明各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
描述于本发明实施例中所涉及到的模块可以通过软件的方式实现,也可以通过硬件的方式来实现。所描述的模块也可以设置在处理器中,例如,可以描述为:一种处理器包括确定模块、演练模块和预警模块。其中,这些模块的名称在某种情况下并不构成对该模块本身的限定,例如,确定模块还可以被描述为“接收故障演练请求,确定请求对应的待演练故障和需要演练待演练故障的目标实例的模块”。
作为另一方面,本发明还提供了一种计算机可读介质,该计算机可读介质可以是上述实施例中描述的设备中所包含的;也可以是单独存在,而未装配入该设备中。上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被一个该设备执行时,使得该设备包括:接收故障演练请求,确定请求对应的待演练故障和需要演练待演练故障的目标实例;获取待演练故障对应的待演练故障类,利用待演练故障类在目标实例上演练待演练故障;在待演练故障演练成功的情况下,获取故障演练结果,并根据故障演练结果进行预警。
根据本发明实施例的技术方案,在根据故障演练请求确定故障和需要演练该故障的实例后,可以在实例上利用该故障对应的故障类进行故障演练,并对演练结果进行监控预警,能够将故障精细管理,提供较多的场景,易于扩展,并且采用故障类的技术手段,可以克服现有技术中硬编码开发成本大的技术问题,达到以可控的成本在线上或测试环境演练故障,以持续性的演练和回归方式来暴露问题,大幅缩减演练的成本。
上述具体实施方式,并不构成对本发明保护范围的限制。本领域技术人员应该明白的是,取决于设计要求和其他因素,可以发生各种各样的修改、组合、子组合和替代。任何在本发明的精神和原则之内所作的修改、等同替换和改进等,均应包含在本发明保护范围之内。

Claims (10)

1.一种故障演练的方法,其特征在于,包括:
接收故障演练请求,确定所述请求对应的待演练故障和需要演练所述待演练故障的目标实例;
获取所述待演练故障对应的待演练故障类,利用所述待演练故障类在所述目标实例上演练所述待演练故障;
在所述待演练故障演练成功的情况下,获取故障演练结果,并根据所述故障演练结果进行预警;
所述待演练故障类为故障模拟逻辑代码;
所述利用所述待演练故障类在所述目标实例上演练所述待演练故障,包括:
将所述故障模拟逻辑代码替换所述目标实例上的类加载器中设置的默认钩子程序,演练所述待演练故障。
2.根据权利要求1所述的方法,其特征在于,所述获取所述待演练故障对应的待演练故障类,利用所述待演练故障类在所述目标实例上演练所述待演练故障,包括:
根据所述待演练故障的类型信息,获取所述待演练故障类;
将所述待演练故障类重启加载至所述目标实例的类加载器中,调用所述待演练故障类对应的模拟方法,且对调用的模拟方法进行验证;
在验证通过的情况下,根据所述待演练故障的参数信息,判断所述请求是否需要故障演练;
若是,则确认所述待演练故障演练成功,若否,则确认所述待演练故障演练失败。
3.根据权利要求2所述的方法,其特征在于,所述对调用的模拟方法进行验证,包括:
获取所述待演练故障对应的目标方法和目标类;
判断所述模拟方法的调用来源是否为所述目标方法和所述目标类,若是,则确认验证通过,否则,则确认验证不通过。
4.根据权利要求2所述的方法,其特征在于,在根据所述待演练故障的类型信息,获取所述待演练故障类之前,所述方法还包括:
根据故障的类型信息,预先配置所述故障对应的故障类。
5.根据权利要求1所述的方法,其特征在于,所述接收故障演练请求,确定所述请求对应的待演练故障和需要演练所述待演练故障的目标实例,包括:
接收所述故障演练请求,并根据所述请求,确定所述待演练故障;
根据所述请求,确定需要演练所述待演练故障的目标应用;
从故障管理信息表中,查询在所述目标应用下需要演练所述待演练故障的目标实例。
6.根据权利要求5所述的方法,其特征在于,在从故障管理信息表中,查询在所述目标应用下需要演练所述待演练故障的目标实例之前,所述方法还包括:
构建所述故障管理信息表,所述故障管理信息表中存储应用、实例以及故障之间的对应关系。
7.一种故障演练的装置,其特征在于,包括:
确定模块,用于接收故障演练请求,确定所述请求对应的待演练故障和需要演练所述待演练故障的目标实例;
演练模块,用于获取所述待演练故障对应的待演练故障类,利用所述待演练故障类在所述目标实例上演练所述待演练故障;
预警模块,用于在所述待演练故障演练成功的情况下,获取故障演练结果,并根据所述故障演练结果进行预警;
所述待演练故障类为故障模拟逻辑代码;
所述利用所述待演练故障类在所述目标实例上演练所述待演练故障,包括:
将所述故障模拟逻辑代码替换所述目标实例上的类加载器中设置的默认钩子程序,演练所述待演练故障。
8.根据权利要求7所述的装置,其特征在于,所述演练模块还用于:
根据所述待演练故障的类型信息,获取所述待演练故障类;
将所述待演练故障类重启加载至所述目标实例的类加载器中,调用所述待演练故障类对应的模拟方法,且对调用的模拟方法进行验证;
在验证通过的情况下,根据所述待演练故障的参数信息,判断所述请求是否需要故障演练;
若是,则确认所述待演练故障演练成功,若否,则确认所述待演练故障演练失败。
9.一种电子设备,其特征在于,包括:
一个或多个处理器;
存储装置,用于存储一个或多个程序,
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如权利要求1-6中任一所述的方法。
10.一种计算机可读介质,其上存储有计算机程序,其特征在于,所述程序被处理器执行时实现如权利要求1-6中任一所述的方法。
CN202010079834.1A 2020-02-04 2020-02-04 故障演练的方法和装置 Active CN113220407B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202010079834.1A CN113220407B (zh) 2020-02-04 2020-02-04 故障演练的方法和装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010079834.1A CN113220407B (zh) 2020-02-04 2020-02-04 故障演练的方法和装置

Publications (2)

Publication Number Publication Date
CN113220407A CN113220407A (zh) 2021-08-06
CN113220407B true CN113220407B (zh) 2023-09-26

Family

ID=77085397

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010079834.1A Active CN113220407B (zh) 2020-02-04 2020-02-04 故障演练的方法和装置

Country Status (1)

Country Link
CN (1) CN113220407B (zh)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115225666A (zh) * 2022-07-07 2022-10-21 支付宝(杭州)信息技术有限公司 生产演练方法、装置、系统、应急规则平台和注入平台

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2017063505A1 (zh) * 2015-10-16 2017-04-20 中兴通讯股份有限公司 一种服务器硬件故障检测方法及其装置和服务器
CN110113205A (zh) * 2019-05-06 2019-08-09 南京大学 一种基于软件定义网络技术的网络排障系统及其工作方法
CN110308969A (zh) * 2019-06-26 2019-10-08 深圳前海微众银行股份有限公司 故障演练方法、装置、设备及计算机存储介质
US10545850B1 (en) * 2018-10-18 2020-01-28 Denso International America, Inc. System and methods for parallel execution and comparison of related processes for fault protection

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2017063505A1 (zh) * 2015-10-16 2017-04-20 中兴通讯股份有限公司 一种服务器硬件故障检测方法及其装置和服务器
US10545850B1 (en) * 2018-10-18 2020-01-28 Denso International America, Inc. System and methods for parallel execution and comparison of related processes for fault protection
CN110113205A (zh) * 2019-05-06 2019-08-09 南京大学 一种基于软件定义网络技术的网络排障系统及其工作方法
CN110308969A (zh) * 2019-06-26 2019-10-08 深圳前海微众银行股份有限公司 故障演练方法、装置、设备及计算机存储介质

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
Dynamic patch generation for null pointer exceptions using metaprogramming;Thomas Durieux;IEEE;全文 *
测试海量存储系统可用性的故障注入法;潘清;庄泽南;王霄军;张晓清;;计算机工程与应用(第36期);全文 *

Also Published As

Publication number Publication date
CN113220407A (zh) 2021-08-06

Similar Documents

Publication Publication Date Title
CN109120678B (zh) 用于分布式存储系统的服务托管的方法和装置
CN116302719B (zh) 用于启用高可用性受管理故障转移服务的系统和方法
CN110389900A (zh) 一种分布式数据库集群测试方法、装置及存储介质
CN110365762B (zh) 服务处理方法、装置、设备及存储介质
CN109245908B (zh) 一种主从集群切换的方法和装置
CN111416836B (zh) 基于Nginx的服务器维护方法、装置、计算机设备及存储介质
CN111580926A (zh) 模型发布方法、模型部署方法、装置、设备及存储介质
US8166460B2 (en) System and method for analyzing HTTP sessions
CN111258627A (zh) 一种接口文档生成方法和装置
CN102819478B (zh) 一种无代理的数据处理系统监控与管理方法
CN109901985B (zh) 分布式测试装置及方法、存储介质和电子设备
CN106406980B (zh) 一种虚拟机的部署方法和装置
CN110225087A (zh) 基于全局负载均衡的云存取方法、装置及存储介质
CN111538659B (zh) 业务场景的接口测试方法、系统、电子设备和存储介质
CN106033422A (zh) 一种数据库操作控制方法、装置及系统
CN113220407B (zh) 故障演练的方法和装置
CN117499412A (zh) 一种基于高可用链路的集群优化处理方法及其相关设备
US20230171179A1 (en) Method for testing pressure, electronic device and storage medium
CN112445860A (zh) 一种处理分布式事务的方法和装置
CN109814911A (zh) 用于管理脚本程序的方法、装置、计算机设备及存储介质
KR101977602B1 (ko) 마이크로서비스관리장치 및 방법
CN112667491B (zh) 虚拟机的功能测试方法及装置
CN114791900A (zh) 基于Operator的Redis运维方法、装置、系统及存储介质
CN113704355A (zh) 数据同步方法、电子设备及存储介质
CN114816969A (zh) 测试用例的生成方法、装置、设备及存储介质

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant