四步心法: 混沌工程不是灵丹妙药 | IDCF
来源:混沌工程实践 作者:宁远之 原文来源:Java Magazine 原文作者:Mikolaj Pawlikowski 标题:Introduction to chaos engineering, Part 2: Four steps for disrupting complex systems
混沌工程不是灵丹妙药,不会自动修复系统和解决问题。市面上有很多工具可以更轻松地实施混沌实验,但真正的困难在于对系统行为的预测。添加故障很容易,困难的是知道在哪里注入以及为什么要注入。
换句话说,从混沌实验中获得的价值,取决于系统本身、对系统的理解深度以及建立可观测性的程度。本文将分享有关混沌实验的四步心法,帮助大家更快上手混沌工程。
一、混沌工程不是什么?
“混沌工程是在分布式系统上进行实验的学科, 目的是建立对系统抵御生产环境中失控条件的能力以及信心。”
但是,混沌工程不是灵丹妙药,它不会自动修复您的系统。事实上,甚至可能并不适用于您的任何情况。
一个常见的误解,混沌工程就是用来随机破坏系统。
这可能和名字有关系,Chaos Monkey(混沌猴子)是第一个在该领域获得业界声誉的工具,它在很大程度上依赖于随机性。随机性是一种强大的工具,并且有时与模糊测试有重叠。
但通常,添加失败都很容易;困难的是知道在哪里注入以及为什么要注入。
混沌工程不仅仅是 Chaos Monkey、ChaosToolkit、PowerfulSeal或 GitHub 上可用的众多项目中的任何一个。
这些工具可以更轻松地实施某些类型的实验,但真正的困难在于学习如何批判性地看待系统并预测可能存在的脆弱点。
另外,混沌工程不会取代已有的测试方法(例如单元或集成测试等),而是对已有测试方法的补充。
在碰撞测试期间,安全气囊可单独测试,也可与汽车的其余部件一起进行,混沌工程可以在不同的系统级别上运行和测试。
每个系统都不同,您需要深入了解系统的弱点,才能提出有用的混沌实验。
换句话说,您从混沌实验中获得的价值将取决于您的系统、您对系统的理解程度、您想要测试系统的深度以及您建立可观测性的程度。
尽管混沌工程的独特之处在于,其可应用于生产系统,但这并不是唯一场景。
网上很多混沌工程的内容似乎都围绕着“生产中的破坏”,很可能是因为这是您能做的最激进的事情,但同样,这并不是混沌工程的全部——甚至不是它的主要关注点。
因为,您也可以从混沌工程原理应用在其他环境中获得价值。
最后,混沌工程并非源于数学和物理学中的混沌理论。
二、什么是混沌实验
混沌工程实验(简称混沌实验)是混沌工程的基本组成,也是重要的表现形式,即通过一系列混沌实验进行混沌工程实践。
给定一个系统及其一定数量的系统特性,就可以设计实验来观察系统在发生故障时的种种表现。每个实验都专注于证明或反驳实验前对系统受故障影响的假设。
2.1 混沌实验的示例
例如,假设您运营着一个流行的网站,维护着整个数据中心。如何让网站在断电后仍可以正常运行?比如,在数据中心中安装了两个独立的电源。
理论上,这可以解决这个问题——但在实践中,仍存在着很多潜在的其他问题:也许电源之间的自动切换不起作用,亦或者网站的规模已经大到,单一电源无法为所有服务器提供足够的电力。
除此之外,是否每三个月有请电力工程师进行定期检查?
讨论到这里,您会担心。
好在,我们有混沌工程这个技术。设计一个简单的混沌实验,用科学的方式,通过实验说明当其中一个电源出现故障时系统会发生什么。甚至整个实验操作,可选择新进的实习生来执行这些步骤。
对所有电源重复以下过程,一次一个:
检查网站是否正常运行; 打开电气面板并关闭电源; 检查网站是否仍在正常运行; 重新打开电源。
实验结果的可观测性
使用观测数据定义正常的状态
利用观测数据验证直觉假设
实验越简单越好
通常,观测指标应直接由业务需求驱动。
该进程是否获得了足够的 CPU?是否被其他进程窃取? 可能是共享机器,或者可能是cron在实验期间启动更新系统的工作? 内核调度是否将 CPU 分配给了另一个具有更高优先级的进程? 管理程序决定其他进程更需要 CPU?
系统会继续工作吗?系统性能会受到影响吗?如果会,影响程度有多少?
类型 | 事件示例 |
---|---|
外部事件 | 地震、洪水、火灾、停电等 |
硬件故障 | 磁盘、CPU、交换机、电缆、电源等 |
资源匮乏 | CPU、物理内存、虚拟内存、磁盘空间、网络带宽等 |
软件错误 | 死循环、崩溃、黑客攻击等 |
虚拟机故障 | 意外重启、意外关闭、部署失败等 |
硬件错误 | 系统时钟错误、CMOS电池失效、内存校验错误等 |
人为错误 | 按错按钮、发送错误配置、拔错电缆等 |
模拟其中一些事件很容易(关闭机器以模拟机器故障,或者,拔出电缆以模拟网络问题),而其他事件则要难得多(为系统调用添加延迟)。
选择合适的故障,需要您对自己的系统有很好的了解。
以下是一些示例假设:
以每小时 100 公里的速度发生正面碰撞时,不会挤压到任何假人。 如果两个亲本豌豆都是黄色的,那么所有的后代都是黄色的。 如果 30% 的服务器被关闭,API 会在 200 毫秒内继续为 99% 的请求提供服务。 如果其中一台数据库服务器出现故障,仍将满足服务级别目标 (SLO)。
如果假设是对的,恭喜!您刚刚对自己的系统获得了更多信心。 如果假设是错的,恭喜!您刚刚在客户发现之前,提前找到了系统问题,并且可以在任何人受到影响之前修复它!
三、结束语
混沌工程不会自动解决您的问题。
最后,混沌工程不需要很复杂。