你去搞混沌,当心别被混沌搞了!

混沌工程是弹性工程方法的一部分,其目的是在系统缺陷导致中断等危机发生之前,发现系统缺陷。

 

拉斯·迈尔斯

《混沌工程实战:手把手教你实现系统稳定性》

 

百度解释混沌是指现实世界中存在的一种貌似无规律的复杂运动形态,即:原来遵循简单物理规律的有序运动形态,在某种条件下突然偏离预期的规律性而变成了无序的形态。

混沌的形成有两个条件:一个是复杂环境的存在,这是大前提;另一个是突变,这是小前提。结论是出现了无法预料的无序状态。

按照ITIL理论来看,混沌工程可以归属于问题管理的主动性管理,作为主动发现问题,解决问题的一种手段。

混沌工程希望提前找出系统中的缺陷,防止其演变为重大故障。同时,通过测试,对系统进行各种实验,深入了解系统在面对生产环境中各种混乱状况时的应变能力,建立起对系统的信心。

 

拉斯·迈尔斯

《混沌工程实战:手把手教你实现系统稳定性》
 

“建立起对系统的信心”,这句话说的非常到位。认知的层次高低立现。别老想着故障注入,太技术了。老这么说,就老让人感觉到你在制造混乱。

“混沌工程的唯一目标就是证明系统存在缺陷”。看到没,故障注入只是发现缺陷的手段,实现目标的途径,不是混沌工程的核心关注点。

对于复杂、混乱的环境,要实现混沌工程的目标,还需要解决缺陷观察的黑盒问题。要解决这个问题,需要一个很重要的能力,那就是:可观测性


Charity Majors将可观测性描述为运行中的系统可被调试的能力,这种可调试性能力的核心是能够在系统运行时理解、询问、探查系统。

 

拉斯·迈尔斯

《混沌工程实战:手把手教你实现系统稳定性》

单纯从字面上去理解可观测性还是有些奇怪。“可观测性”怎么会是一种能力?这更像是一种属性。

混沌工程应该是具有一种能力使得系统具备可观测性。而且这是混沌工程非常重要的一种能力。

可见的操作才能带给你更大的安全感。尤其在复杂混乱但又对安全稳定要求高的环境里操作。可观测性的重点是观察到系统的真实反应。

暗债是现代软件系统逐步复杂化进程中的副产品。是复杂系统中不确定的因素。暗债可能只影响一个层面,也可能同时影响多个层面。

 

拉斯·迈尔斯

《混沌工程实战:手把手教你实现系统稳定性》
 

混沌工程就是帮助你发现一直存在但你一直不知道的暗债。这很像信息安全里提到的:漏洞。

漏洞不被利用之前,你也是不知道。所以不要想怎么防止暗债产生,因为在威胁或故障发生之前,暗债是不可见的。

暗债不仅不可见,而且风险影响也是不可知。混沌工程要考虑的是整个技术系统,而不是某个功能点的暗债。对暗债的关系影响分析就显得尤为重要。

生产环境中风险影响分析的质量将决定混沌工程实验最后结果是皆大欢喜,还是踩雷背锅走人。

只有在生产环境中,软件才能面对来自现实世界的严峻考验。事先规划不能完全规避中断。混沌工程是直面故障,而不是规避故障。

 

拉斯·迈尔斯

《混沌工程实战:手把手教你实现系统稳定性》

拉斯·迈尔斯说:“混沌工程始于一个问题:在这种情况下,系统会如何反应?”

混沌工程要做的事情和IT服务连续性有些像。都要考虑风险点、影响分析、事故演练等等。唯一的不同就是混沌工程真的敢干!

敢干的前提是有足够的的经验和现场控制力。否则弄不好就把自己干死了。“直面故障”是一种自信,不是一个宣传噱头。

从这个角度看,混沌工程在开展实验前的梳理工作非常重要。

拉斯·迈尔斯给出了一个方法,即从混动工程要解决的问题开始,先设立一个假说,进而开展混沌工程游戏日或自动化混沌工程实验。最后从中得出结论,即系统是否存在某些缺陷的观察记录,并将之放入待改进清单。

混沌工程的最终效果取决于你考虑是否周全,思虑是否缜密,行事是否严谨。信心不是随便就能建起来的。

混沌工程旨在帮助你对混乱状况下的整个技术系统建立信任、树立信心。

 

拉斯·迈尔斯

《混沌工程实战:手把手教你实现系统稳定性》
 

混沌工程需要在生产环境中释放混沌猴子。这是操作的手法之一。但在释放之前务必搞清楚想从混乱中得到什么信息。

我们要探险,不要冒险。混沌猴子放出来可能很有趣,也可能很可怕。

混沌工程最开始要思考的是“我们要从中收获什么”,而不是“我们要破坏什么”。思考始于“为了对系统在混乱状况下的表现建立信任、树立信心,在哪里做实验最有价值”

混沌工程最大的挑战是“做什么实验来验证”。不求快,但求稳。前期要做大量的规划工作来保证风险可控。

实施混沌工程并不意味着开始在系统中注入故障和混乱,也不意味着开始设计全套的实验,而是要开始思考“希望通过收集某方面的证据来支持或反驳什么想法”,或者“哪些方面有可能出错”。

 

拉斯·迈尔斯

《混沌工程实战:手把手教你实现系统稳定性》
 

混沌工程反复在讲:不是注入故障和混乱,关键是找到缺陷的证明。

即使要进行故障注入,我们在进行注入实验之前必须于率先为系统建立一套这类问题的待办集,即假说待办集(Hypothesis Backlog)。

拉斯·迈尔斯给出了一些指导的方法。

01 收集假说

  • 事故分析

  • 描述系统

  • 找到“可能出错的地方” 

02 引入可能性和影响

  • 绘制可能性与影响关系图

  • 添加关注点

03 构建假说待办集

待办集意味着不仅有待办任务,而且还要有相适配的优先级。 不是所有的假说都值得一试。

04 规划并手动开展游戏日

游戏日是一项应对现实世界混乱的演习。游戏日不是搞破坏,它是一项受控、安全、可观察的实验。更像是沙盘游戏。

所以,游戏日不需要任何专业工具,仅需要计划、纸笔、对当前状况的了解,通过沙盘推演迅速发现当前技术系统中的缺陷。

结束语

混沌工程是一个非常看重实效的主动性管理手段。实验之前,最好需要具备可观测性能力,需要具有风险影响分析的数据保障能力,需要储备足够的经验。因为这些都是你去做混沌工程探险的活命清单。

如果做不到那么完备,那么就请谨慎行事,控制好爆炸半径。

炸鱼不能把自己也炸进去了!