摘自:

混沌工程介绍

什么是混沌工程

混沌工程是通过主动制造故障场景并根据系统在各种压力下的行为表现确定优化策略的一种系统稳定性保障手段,简单说就是通过主动注入故障的方式、提前发现问题,然后解决问题规避风险。

为什么要进行混沌演练

随着互联网业务发展,微服务架构、分布式架构和虚拟化容器技术的广泛普及,软件架构的复杂度在不断提升,服务之间的依赖所带来的不确定性也成指数级增长,在这样的服务调用网中,任何一环出现的正常或者异常的变化,都有可能对其他服务造成类似蝴蝶效应一般的影响。目前营销体系的服务量级不断增加,整体链路增长以及数据流转复杂,对整个系统的可用性、稳定性挑战也越来越大,所以引入混沌演练,主动找出系统中的脆弱环节,然后针对性地进行加固、防范,从而避免故障发生时所带来的严重后果,进一步提升业务系统的高可用,提高业务系统应急保障能力。

混沌演练的价值

应用混沌演练可以对系统抵抗扰动并保持正常运作的能力进行校验和评估,提前识别未知隐患并进行修复,进而保障系统更好地抵御生产环境中的失控条件,提升整体稳定性。

混沌演练实践

演练流程介绍

目前借助京东云RPA自动化服务平台进行混沌攻防演练,测试人员为红方(攻击方),研发人员为蓝方(防守方),红方随机挑选一个时间段,针对服务系统注入故障(比如:CPU使用率达到100%、网络延迟、JSF接口响应延迟等),蓝方负责故障感知以及应急处理,通过这样的方式,达到针对系统高可用的应急演练。

红方:

创建演练计划:通过访问RPA自动化服务平台,进入工具市场——演练类,选择不同的故障方案,点击“立即执行”;

演练配置:点击执行后,进入配置页面,选择执行环境,选取要演练的应用,并随机选取要演练的实例IP;

执行演练:演练任务创建完成后,在对应的演练时间范围内,审批通过后,开始按照选择的演练任务开始执行;

蓝方:

故障排查:在演练过程中,蓝方通过报警信息,先对模拟故障的实例机器,进行排查;

恢复方案:演练中发现问题要及时恢复,演练后对模拟故障的实例机器进行重启恢复,确保机器正常运行,各项性能指标恢复;

初次演练实践

准备阶段

混沌演练准备阶段是设计演练策略,主要有设定演练的考核目标,选择演练的场景、应用和机器,生成相应的演练计划,周知相关人员。

其中准备阶段最重要的是做好风险评估 ,根据系统的等级或者混沌的成熟度,初期演练一些简单的事件比如高CPU、高内存;等系统抵抗力逐步提升演练比较高级的事件如网络延迟、进程终止等。

执行阶段

演练场景执行,执行故障注入,测试人员应观察日志和系统监控,记录指标变动情况。

执行场景JSF接口响应延迟100ms,因接口超时时间为50ms,可以在监控图中看到故障注入期间接口超时失败率100%

恢复阶段

故障发现及排查定位:演练进行中,蓝方事先不知道演练哪些故障场景(目前是通过预发演练,研发侧能明确受影响的机器),蓝方通过收到报警,对报警信息进行排查,摹略引擎系统针对报警信息做出反应和应急处理。

蓝方发现故障 CPU使用率负载故障,报警机器与演练机器相同,重启服务后,应用服务器响应正常,可用率恢复;

复盘阶段

通过本次演练,发现两个待优化的点:

  1. CPU使用负载的演练场景,发现了监控告警邮件延迟,建议增加电话和咚咚报警策略;

  2. 模拟JSF接口响应超时场景,发现缺少失败阈值告警邮件,增加相应告警邮件;

混沌演练总结

典型演练场景

借助于平台进行混沌演练,可以降低演练的学习成本,提高演练的效率,目前平台对于常用的演练场景已经支持,大家可以在平台进入工具市场选择相应的演练场景。

重要考核指标

混沌演练结束后,需要根据演练执行过程和结果,记录演练流程和对应监控指标变化情况,总结存在的问题以及优化方案发出演练报告,对于演练中的关注指标主要是从故障“发现-定位-恢复”的时效性指标,下面具体介绍了在实践演练中需要重点关注的指标,如是否有告警监控、系统容错能力情况,以及响应机制,其中最后灰色部分高可用指标属于探索部分,会随着系统当前的实际情况和业务不同有变化,作为探索性指标。

关注风险控制

混沌演练会对业务和系统产生破坏性,为了限制发现应用程序漏洞的成本,避免不必要的损坏和超出合理测试允许的实际损失对混沌演练做好风险控制是非常必要的。做好风险控制,将演练控制在一个较小的范围内,避免由于演练失控带来的更大问题。目前在进行混沌演练实践主要通过以下两个方面进行风险控制:

尽管混沌演练的好处是显而易见的,但它是一种应该慎重进行的实践。

内容加载链路演练

背景

当前微服务架构下,各个服务间依赖高,调用关系复杂,业务场景很少可以通过一个系统来实现,常见的业务场景实现基本涉及多个上下游系统,要保证整体链路的稳定性,需要尽量减少系统之间的耦合性,避免因为单点失效引起整个链路的故障。

目标

通过混沌演练验证链路中部分系统发生故障时候的整体链路的表现,对链路保持正常运作的能力进行校验和评估,提前识别未知隐患并进行修复,进而保障整个链路更好地抵御生产环境中的失控条件,提升整体场景功能的稳定性。

演练链路

对真实的业务场景进行混沌演练,就需要对业务场景的相关服务和调用关系进行链路梳理,一般需要根据实际业务场景,画出系统交互图,通过链路串联、数据追踪、和上下游确认等方式整理链路图。

演练计划

混沌演练之前,一定要好可行性评估,评估可以演练的服务部署环境、演练工具的成熟度、演练场景的爆炸半径等,然后决策演练场景,进行实践操作。



内容加载演练实践

链路梳理

内容加载链路演练,通过内容加载的系统交互梳理出加载链路:摹略引擎执行-AB分流-CMS资源获取-鹰眼内容发送



接口梳理

根据调链路调用关系用梳理出具体的接口:

制定演练计划

演练时间:2023.03.28 14:00-22:00

演练攻击人员:孙X英、陈X然; 演练防守人员:张X雷、付X军、刘X、韩X

针对链路接口设计演练场景,一般根据系统特色来设计更容易发生的故障,比如应用偏计算比较消耗CPU的话,故障设计包含CPU满载,应用对于响应的时效有严格的要求的话一般包含方法延迟故障设计。

本次链路故障场景设计如下:

具体演练场景设计可参考:https://mp.weixin.qq.com/s/chdp36g8JwYLvwD57gp_zw

演练执行

目前借助天权自动化运维平台进行混沌攻防演练,进入工具市场—演练类,选择不同的故障方案,点击“立即执行”;

如选择Java进程满载场景演练,选择满载率100%,满载核数为演练应用部署服务的CPU核数,演练时长是执行满载的持续时间,选择演练的具体应用和指定IP,执行演练计划。

演练示例,根据演练的场景配置好故障参数,如下图为精准触达系统-消息触达方法延迟增加30ms参数设定:

演练执行结果检查,下图为分流服务-JAVA进程满载,指定分流进程CPU满载,故障执行结果:

演练监控

使用监控工具实时收集服务器在混沌演练运行期间的性能状态,如系统层面的 CPU、内存等使用情况,观察方法的响应时间、成功率等指标,一方面验证在混沌场景执行期间系统状态是否达到预期的效果,同时记录演练期间发生的问题,记录现场,另一方面通过监控发现有风险问题进行人工干预,立刻终止演练。

场景一:精准触达系统-消息触达方法延迟增加30ms

演练监控方法执行的成功率和TP 999:

场景二:分流服务-JAVA进程满载,指定分流进程CPU满载

监控平台实时观测系统的CPU使用率:

演练反馈

检查系统故障发生时候监控手段是否完善,研发人员是否可以根据系统告警,快速的定位并解决问题。检查团队的响应、协同效率。

邮件事故告警:



事故恢复告警:



环境恢复

场景演练可等待演练时长结束后自行中止,也可根据手工取消、终止演练场景。

演练完成后建议需要重启容器,保证服务恢复正常状态。

演练复盘

演练结束之后,我们需要对演练进行复盘。不同的故障下,系统的表现以及整体业务场景所受到的影响,演练过程中所发现的问题,需要在复盘报告中呈现出来。





总结

链路演练通过提前主动注入故障,发现系统之间的强弱依赖,对链路进行检验,降低生产环境中故障发生的概率。