《混沌工程:Netflix系统稳定性之道》书评感想

Posted by Jiajie Wu on April 9, 2020

《混沌工程:Netflix系统稳定性之道》(下简称《混沌工程》)总结了第一批混沌工程师的经验和智慧。全书虽然不像大部分技术类书籍那样厚,但干货很多,值得反复阅读。书中内容分为三部分:第一部分介绍了什么是混沌工程,为什么需要混沌工程,混沌工程和故障注入、测试之间的区别;第二部分介绍了混沌工程的五大原则——建立稳定状态假设、用现实事件做验证、在生产环境中实验、自动化实验和最小化爆炸半径;第三部分介绍了实验的设计和一些实用的工具。

什么是混沌工程? 混沌工程就是我们为了建立对系统稳定性的信心,为了找出系统中潜在的未知问题,在生产环境(or近似生产环境)中做的一系列实验。

为什么需要混沌工程? 因为现今的系统变得越来越复杂,一个隐藏的小问题可能就会在未来引发级联故障,对系统造成毁灭性的打击,就像所谓的“蝴蝶效应”,而传统的故障注入和故障测试已经不能满足复杂系统对稳定性的需求了,所以混沌工程应运而生。

混沌工程和故障注入、故障测试之间的区别,我认为可以概括为以下几点:
未知和已知,整体和单一,主动和被动。
第一点,未知和已知。 混沌工程是为了找出系统存在的未知问题。在经过故障注入和故障测试,解决了很多已知问题后,系统已经达到了相对稳定的状态,但它仍然存在我们不知道的潜在问题(绝对稳定、不会出问题的系统是不存在的。即使现在你的系统趋于稳定,未来也会滑向一个不稳定的状态)。混沌工程就是未来在此基础上,尽可能、尽快地找出这些潜在问题,而不是等到未来它开始影响系统稳定性了,才着手处理。
第二点,整体和单一。 进行故障注入和故障测试的时候,往往对会发生什么故障有一个大概估计,然后将这些故障一个个注入系统,再一得到一个个返回的结果,这些结果都是二元的(通过/未通过)。进行混沌工程的时候,你不知道实验中可能会发生什么故障,因为复杂系统可能发生的故障是无法完全列举出来的。混沌工程从整个系统出发,实验返回的结果是未知的(因为未知,所以危险性也高。后面的五大原则中才会讨论“最小化爆炸半径”,避免实验对系统造成超出控制的负面影响)。
第三点,主动和被动。 故障注入和故障测试的“故障”都是确定的,系统“被动”触发这些故障(如果存在)。混沌工程就是让系统“主动”暴露故障。

《混沌工程》第二部分介绍的五大原则是混沌工程的核心部分,之后的实验设计部分就是遵循这五大原则来介绍的。因为混沌工程存在很多“未知”,又是在生产环境中实验,所以整个过程要谨慎小心。设计实验的时候,需要对实验可能产生的后果有一定的预估。实验进行的过程中,为防止发生不可控的影响,需要有“立刻终止实验”的方式。

原则一,建立稳定状态的假设。 系统的稳定状态不仅和系统指标有关,也和业务指标有关。
原则二,用现实事件做验证。 引入“故障域”概念,向系统注入根因事件。故障域既一个故障的影响范围和隔离范围。注入的故障事件必须是真实环境中可能发生的,而且发生频率高、影响范围大。
原则三,在生产环境中进行实验。 风险大但发现真实潜藏的问题的几率也更大。即使保守地不想,或者其他限制因素导致无法在生产环境中进行实验,也要尽可能在近似生产环境的模拟环境中进行实验。
原则四,自动化实验。 从手动开始,谨慎地处理每一步,确保正确运行实验并且实验有最小的爆炸半径,执行成功之后再将实验自动化。在混沌工程中,自动执行实验,自动分析实验结果,并希望——可以自动创建新的实验。
原则五,最小化爆照半径。 混沌工程具备导致生产环境崩溃的风险,所谓“最小化爆炸半径”就是尽量让薄弱环节暴露出来,又不会造成更大规模的故障。《混沌工程》中详细介绍了几个步骤:

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

《混沌工程》第三部分,基于五大原则介绍了实验设计的过程,基本和五大原则吻合,需要根据具体的系统和环境进行设计。

最后的一小章还贴心地列举了很多实用的工具。除了Netflix的混沌猴子(Chaos Monkey,随机关闭节点)和混沌金刚(Chaos Kong,随机关闭域),还有Simoorg(LinkedIn开发的故障注入工具,易扩展,多组件可插拔)、Pumba(基于Docker的混沌工程测试工具)、Blockade(基于Docker,测试网络故障和网络分区)、Chaos-http-proxy(可向HTTP请求注入故障的代理服务器)等等。

另外,书中没介绍,但也同样强大的混沌工程实验工具——阿里巴巴的开源项目ChaosBlade。简单看了下介绍,它提供多场景的丰富实验,包括:基础资源、Java和C++应用、Docker容器和云原生平台(例如Kubernetes)。

总结来说,《混沌工程》既是一本很好的入门书,也是一本很好的工具书。很适合没基础但是感兴趣或者刚接触混沌工程的人阅读,非常值得多次翻看回顾,特别是第二部分的五大原则。

-END-