读书笔记:《混沌工程》第二部分——混沌工程原则(5、6、7章)

Posted by Jiajie Wu on April 2, 2020

第五章 在生产环境中进行实验

经典测试的一般信条是寻找软件缺陷要尽可能远离生产环境,但是混沌工程不同,在离生产环境越近的地方越好。理想的实践就是直接在生产环境中进行。

传统测试验证软件的逻辑性(既代码写的对不对),混沌工程验证系统整体的稳定性,如果不在生产环境(or近似生产环境)中进行,就无法产生产环境的系统稳定性具有信心。

  • 状态和服务: “状态”无处不在。无论是「有状态服务」还是「无状态服务」,亦或者隐藏在系统各个角落的许多状态,总会有一些意想不到的状态破坏系统的稳定性。
  • 生产环境中的输入: 用户永远不会如预期的那样与系统进行交互,因此需要在生产环境中对真实的输入进行验证和实验。
  • 第三方系统: 依赖于外部系统(如云服务),其行为不可能全部知道。生产环境才是自身系统和第三方系统进行真实交互的唯一场所。(即使不依赖外部系统,也会有依赖的外部服务,例如DNS、SMTP、NTP)
  • 生产环境变更: 现实情况中,系统是在不断更新的,测试环境很难模拟这种情况。
  • 外部有效性: “这个实验的结果是否能概况我们真正感兴趣的现象?”,“我们测量结果的产品运行环境是否是专门为测试而准备的?”。如果不在真实环境中进行混沌工程实验,上述几点都将成为外部有效性的潜在威胁。
  • 为何不愿实践混沌工程: 1.对系统在注入事件时的反应缺乏信心:应该在系统足够成熟,对其有一定信心的时候,进行混沌工程实验;2.担心揭示薄弱造成过多破坏:尽力将潜在影响范围缩小,1)允许快速终止实验;2)将实验造成的爆炸半径最小化。
  • 离生产环境越近越好: 即使不能在生产环境中,也要在尽可能在离生产环境最近的环境中。

面向云服务的混沌工程工具

CHaos Lambda,可以在生产时间随机关闭AWS的自动伸缩组(ASG)实例。Fault Analysis Service,专门为Microsoft Azure服务。

不能在生产环境中做实验?

2015年在纽约 Velocity Conference上的演讲《太大而无法测试:如何破坏一个在线交易平台而不造成金融灾难》。 灾备环境配合生产环境前端,再构造出一套生产环境。因为灾备系统非常理想,与生产环境保持同步,因此能拿来模拟生产环境。

第六章 自动化实验以持续进行

在混沌工程中,自动执行实验,自动分析实验结果,并希望——可以自动创建新的实验。

自动执行实验

从手动开始,谨慎地处理每一步。确保:正确运行实验;实验有最小的爆炸半径。执行成功,之后再将实验自动化。

因为系统太过复杂,无法确定哪些变动会改变实验结果,所以必须假设所有变动都会改变结果。 理想情况下,如果能确定风险来自新发布的代码,这样就能阻止新版本发布,先解决缺陷。非理想情况下,无法确定潜在问题存在了多久,必须从零开始检查问题出处。

Netflix的混沌工程自动化平台(ChAP)

自动创建实验

追求更好的目标:自动设计实验。

理想————希望找到那些本不会让系统崩溃的事件,持续不断设计实验验证,保证系统永不崩溃。

正确路径驱动的故障注入(LDFI)

它的原理是通过推断系统正常情况下的行为来判断需要注入的候选错误事件。它可以识别出可能导致分布式系统故障的错误事件组合。 论文 SoCC’16《互联网规模的自动化故障测试研究》(Automating Failure Testing Research at Internet Scale)

第七章 最小化爆炸半径

由切尔诺贝利事件引发的思考,这次事件就是由于一次弹性演习导致的。

混沌工程具备导致生产环境崩溃的风险,混沌工程师应当理解并降低风险。
遗憾的是,经常出现这样的情况————运行的本来只是会影响一小部分用户的测试,结果却造成了级联故障,影响力更多用户。

所谓“最小化爆炸半径”就是尽量让薄弱环节暴露出来,又不会造成更大规模的故障。

  • 采用递进的方式进行实验;
  • 只想一小部分终端(用户)注入故障;
  • 开始进行小规模的扩散实验(需要定义好指标来过滤正真通过测试的用户);
  • 小规模集中实验,不断扩大实验范围(有定义的路由实验,无定义路由的大规模实验……);
  • 在实验造成过多危害时,自动终止实验;
  • 避免在高风险时段进行实验(所有人都要在工作状态内)
  • 运行实验本身不能对系统造成过大影响,造成结果偏移。每次只检验一个可控故障;

总结和后记

混沌工程在真实的生产环境中(特殊情况可在模拟近似生产环境)进行实验,既要找出系统的潜在风险,又要避免引起大规模故障,因此每一步实验都要谨慎小心。

第二部分提出的5个混沌工程原则很重要,值得反复阅读和思考,可以结合自身业务和系统进行。

第一和第二部分阅读后,感觉业务数据和运维数据可以结合起来做研究————业务智能运维(BAIOps)。有听说在 Gartner 18年的某个分析报告中有提出这个词,但暂时没找到原文。

之后会继续阅读剩余部分————实验的设计,相关工具介绍。

-END-