干货 | 没事在线上制造点故障?携程混沌工程是这么作的

*本文做者伍杏玲,首发于CSDN(ID:CSDNnews)*html

  • 故障发生时的沟通协调是顺畅的?
    程序员

  • 增长重试就能解决问题?小程序

  • 应用重启后能自动投产?c#

  • 非关键应用的故障不会影响业务?微信小程序

  • 单分片的故障不会影响全局?服务器

  • 这仅是一个部门的调用关系,简直是“不可描述”!微信

  • 有人说“咱们对生产环境有敬畏之心”,但通常有敬畏之心是源于不了解,因此咱们不只有敬畏之心还要有探索之心。网络

  • 有个开发说我这个接口坏了,是否是大家弄的?我调接口查服务,终于发现——他这个接口就历来没有好过。架构

  • 要十分悲观大胆地猜想这些问题在线上会发生,而后当心谨慎地去求证。并发

你觉得最新一期程序员吐槽大会来了?不,这是11月9日在上海举办的2019携程技术峰会现场,来自携程网站运维总监方菊真实的工做总结。

俗话说,程序员每一个段子的背后绝对有一条泪的教训。

为何方菊过于真实地说出程序员“不能说的秘密”?

源于她在携程内部推行“混沌工程”。

混沌工程等于线上制造故障?

混沌工程(Chaos Engineering)是在分布式系统上进行实验的学科, 目的是创建对系统抵御生产环境中失控条件的能力以及信心。混沌工程适合揭露生产系统中未知的弱点。

混沌工程最重要的一点是:经过不断失败避免失败。由于一般咱们对故障什么时候会发生一无所知,但故障无可避免地必定会发生。

“凡不能毁灭个人,必使我强大”。用尼采的话来诠释混沌工程的思想是最适合不过。 

为何须要混沌工程呢?

随着企业业务的发展和技术架构的演进,咱们须要保持稳定的用户体验,避免发生重大故障。之前每每是在大故障发生后,开发人员才去补救,才总结和实施改进的措施,但这终究已形成损失。

而混沌工程是将这些“痛苦”放在事前,用“以毒攻毒”的方式来使风险在可控的范围内及早暴露。这就像人打疫苗同样,先将一部分疫苗注入人的身体,产生抗体。经过这样才能作到“不破不立”,持续地验证系统的容灾能力。

对于开发团队来讲,还能“常练常新”,由于在一个大型的故障排查过程当中,考验的不只是技术人员的技术,还会考验其临场的决策判断力,但确定不会拿一个真实的故障来锻炼新人,因此在实施混沌工程中,能锻炼团队成员,加强团队抵御风险的能力和信心。

混沌工程的五大原则

 

那么如何开始作混沌工程呢?方菊列举如下五大原则:

一、假设稳定的状态

作混沌实验时,是将预期会发生的结果和实际会发生的结果作一个对比。因此咱们须要假设一个稳定的状态,而后引入实验变量,例如服务器崩溃、网络中断等,再观察实验结果的稳态差别,最后发现问题。

另外,混沌工程关注的是结构性的风险,因此咱们需了解关键业务指标在稳定时的状态,好比说广告投放转化率、支付成功率、订单提交量等,这须要监控工具来收集业务数据。

二、在生产环境进行演练

因为测试环境的数据覆盖度、第三方系统依赖、基础设施架构和生产环境是不一样的。方菊表示,在实际操做中,有一些团队在测试环境作好了混沌实验后,在生产环境中依然会发现不少问题。因此她建议,为了保持真实性和有效性,推荐使用生产环境进行混沌实验。

但方菊补充道,这不是说明知道系统有一个Bug,非获得生产环境去复现。因此她推荐的是一种柔性的方式:若是你知道有Bug,先在测试环境修复好测试后,再把它放到生产环境。因此说,混沌实验的环境越真实,其越有价值。

三、持续地、自动地运行实验

若是是手动运行实验的话,实验成本较大,最终致使不可持续的。

方菊举例道,携程曾实行过Disaster Recovery(灾难恢复)演练,即将一个部门全部的非核心服务关掉,而后验证核心业务流程的健壮性。因为这个演练操做起来很复杂,每一个业务部门每一年演练1-2次。携程每周运维的变动有数千次,每个变化都有可能会引来一个新的风险。

那么咱们作演练的有效性也会随着时间来变化,若是要持续地验证系统的话,须要有一个好用简单的工具来代替人工的操做,它自动收集、自动验证异常、自动诊断,下降人力成本。

四、最小化爆炸半径

可能有人会想,混沌实验是否就是在生产环境随机操做呢?正好是相反的,实验是须要很是谨慎地在事前评估风险,作混沌实验的预期是将系统的隐患暴露出,但不会产生更大的影响。

方菊推荐采用“点线面体”的按部就班过程来操做,当这个风险超过控制范围时,实验能立刻终止。故此,方菊团队在故障平台上设计了“一键中断”功能,并将权限交相关人员。因此方菊强调,作混沌演练时,每一个故障场景是随时都可放可收的。

五、多样化的故障场景

咱们须要对历史故障事件分析,而且对故障场景进行抽象总结。以下图,即是方菊团队根据携程历史上发生过的故障整理成一个个场景:

在作实验时,可根据上述故障进行注入与恢复的实现。

实施混沌工程时主要围绕两个态:稳态和新态来进行。第一步是制订计划,定义稳态,评估风险。第二步是执行实验,在控制爆炸半径的基础上作故障。第三步,在故障输入后,经过监控对比稳态和新态。第四步是在故障恢复后,对新态进行结果评估,记录问题,进行修正。

混沌工程的实践应用

目前在携程内部已完成一千屡次混沌实验,覆盖上万个实例场景。具体实践是怎么作的呢?方菊列举在核心应用对点评服务的弱依赖验证。

经过监控发现,点评服务出现响应延迟,因而在作混沌实验时,先定义一个稳态:产品详情应用QPS 1000,RT 300ms,此时点评信息显示完整。假设实验结果是产品详情页熔断对点评服务的访问,产品详情页可正常显示其余信息。

开始执行实验:能够根据不一样的爆炸半径选择在服务端或者客户端注入服务延迟故障,经过实验,获得核心应用页面空白的结果,最后进行修复和总结。这样便完成一个混沌实验。

谈及将来携程在混沌工程上的布局,方菊表示将从接受度和复杂度两个方面来增强。

一、复杂度:工具覆盖常见故障,生产和测试环境少许演练,生产关键应用的按期演练。生产设定场景的随机演练,生产全自动化演练和验证。

二、接受度:验证历史故障的修复,主动设计故障场景并发起挑战,造成Design for failure和混沌工程的文化。

最后方菊重复强调道,混沌工程的核心不在于怎么制造故障,而是在一个可控的风险范围内,将系统已经存在的隐患给暴露出来。

系统:“凡不能毁灭个人,必使我强大”。大家团队实施混沌实验了吗?谈谈你的见解?

方菊分享PPT下载,点这里

【推荐阅读】

关注“携程技术中心”公众号

了解携程技术一手动态