背景
从 2010 年 Netflix 上线 Chaos Mokey 的第一个版本到现在,虽然混沌工程发展已历时十年,但其实只在少数大厂里面有较成熟的落地,对绝大部分研发同学来说,混沌工程还是一个比较陌生的领域。
分布式和微服务化已经成为主流的系统架构设计方案,大规模分布式系统的可用性保障能力越来越成为关注的重点。混沌工程也开始如雨后春笋般在各大企业内部萌芽生长,但大部分还处于初期的探索阶段,在实践过程中也遇到了这样或那样的问题,有技术上也有认知层面上的,这些问题难免会对混沌工程的快速落地产生阻力。
下面介绍一下字节跳动在混沌工程实践过程中的一个关键阶段:场景化主动实验。希望本文可以帮助大家加深对混沌工程价值的了解,对设计混沌工程实验、落地混沌工程建设提供更多的思路。
什么是场景化主动实验
混沌工程的高级原则要求能够在生产环境自动的运行实验,这个目标并不是一蹴而就的。
根据混沌工程成熟度模型(CMM)[4]说明,要分别从“熟练度”和“应用度”两个维度同时进行建设。其中,“熟练度”体现了混沌工程系统的有效性和安全性,“应用度”衡量了混沌工程实验覆盖的广度和深度。在混沌工程建设的中前期,这两点都是混沌工程成功落地的关键路径。
在混沌工程的初级阶段,通常都会建设一个故障注入测试平台(FIT,Fault Inject Testing),集成一些常见的故障场景或异常事件的模拟能力,由业务或 QA 同学设计并执行实验来验证系统的韧性能力。
在这个阶段,基础架构和业务系统的实现都可能处于比较粗放状态,混沌工程平台的故障注入能力需要兼容各种业务架构的实现方案和软硬件环境,执行实验时,业务同学不仅要设计实验的故障场景(机房网络故障、下游服务宕机等)、配置演练环境(目标服务、实验集群等控制实验的爆炸半径),还要找到能够描述实验时服务状态的稳定性的指标(如 metrics、日志或告警等),然后手动启动实验,执行人还要不停的观察稳定性指标的变化,判断系统的容灾逻辑或弹性策略是否被正确触发、业务系统的表现是否符合预期等等。如果在执行过程中发现异常,需要立刻终止实验,收敛实验影响。
整个实验过程的人力成本较高,实验的操作门槛也较高,再加上这个阶段业务同学对混沌工程价值和理念的认知还处于较初级水平,很难会主动对自己的服务设计实验,更无法保证实验的常态化执行。因此,混沌工程实验的时效性和业务系统的弹性容灾策略持续有效就比较难以保证了。
如何突破这个阶段、成功抵达混沌工程的终极目标呢?
通过不断的思考,我们认为混沌工程建设需要一个过渡阶段,即场景化主动演练。
所谓场景化主动演练,就是在明确混沌工程的终极建设目标的前提下,以终为始,分阶段去设计混沌工程的实验标准、定义技术规范,搭配工程化能力,逐步将人和业务引导到混沌工程建设的高速公路上,共同推进 CMM 模型的熟练度和应用度。
所以,场景化主动实验是通向混沌工程自动化建设的关键路径。
如何建设场景化主动实验
首先需要明确混沌工程的最终目标,以终为始,反推当前阶段应该建设什么样的技术规范和标准能力。
然后,根据业务当前的基础架构现状和实验诉求构建一个通用的实验场景,由混沌工程平台方在保证实验风险可控的条件下主动对业务系统进行实验。这样,在满足业务需要的同时又可以推动相关技术规范和基础能力的建设,而且对业务同学的资源依赖较少。
以字节跳动为例,要实现在生产环境自动的执行可控的混沌工程实验,当前阶段应该具备的能力包括:
能够在生产环境持续的运行实验并具备实验爆炸半径的控制能力
选定一个命中业务痛点且通用的实验场景,构建通用的自动化执行实验能力
能够描述服务稳定性的通用指标
自动检测稳定性指标的变化
自动终止实验【在实验爆炸半径可控的情况下,非必须】