1.1 什么是混沌工程
假设你负责设计运行核电站的软件。你的工作除了其他一些普通事项,还需要防止放射性沉降物。这项工作风险很高:代码出现意外会导致灾难,使人们丧生,并使广阔的土地无法居住。从地震、停电、洪水、硬件故障到恐怖袭击,你都需要做好应对措施。你会怎么做?
你聘请了最优秀的程序员,制定了严格的审查流程和测试覆盖率目标,并在大厅里走来走去,提醒每个人我们的工作需要异常的认真。但是,“老板,我们有100%的测试覆盖率!”并不足以让你在会议上欢欣鼓舞。你需要应急方案,你需要能够证明,当发生故障时,整个系统可以承受这些问题,这样你的电厂名字才不会出现在新闻头条上。你需要在问题找到你之前先找到这些问题,这就是本书的目的。
混沌工程被定义为“通过实验性的方法,从而建立对系统抵御生产环境中突发事件能力信心的学科”(混沌工程原理,http://principlesofchaos.org/)。换句话说,这是一种软件测试方法,着重于在用户遇到问题之前找到问题。
你希望系统是可靠的(这是我们所关注的重点),这也是要努力产出高质量的代码并保证良好的测试覆盖率的原因。但是,即使代码按预期工作了,在现实世界中,很多方面也可能(并且将会)出错。可能出现故障的事物的清单很长,甚至比止痛药可能产生的副作用的清单还要长:像洪水和地震这样具有威胁性的灾害,可能会导致断电、硬件故障、网络故障、资源匮乏、竞态条件、意外的流量高峰,以及系统中复杂且无法解释的相互作用,从而破坏整个数据中心。操作人员的失误也可能导致类似的问题。系统越复杂,出现问题的机会就越多。
有人将这些视为罕见事件,但它们一直在发生。例如,在2019年,月球表面发生了两次坠毁事故:印度的月船二号任务(http://mng.bz/Xd7v)和以色列的创世纪(http://mng.bz/yYgB),都在月球降落时出现问题。需要记住,即使你的系统是没问题的,但是它仍然依赖其他系统,这些依赖系统可能会出问题。例如,在2019年夏季的大约一个月之内,Google Cloud、Cloudflare、Facebook(WhatsApp)和Apple都发生了严重的宕机事故(http://mng.bz/d42X)。如果你的软件是在Google Cloud上运行或依靠Cloudflare进行网络路由,则可能会受到影响。这些都是现实中的案例。
一种常见的误解是:混沌工程只是随机地破坏生产环境中的事物,实际上并不是。尽管在生产环境中运行实验是混沌工程的独特组成部分(稍后会再介绍),但它远不止于此,任何可以帮助我们确信系统可以抵御突发事件的方法都可以归结为混沌工程。它与站点可靠性工程(SRE)、应用程序和系统性能分析,以及其他形式的测试互有交集。进行混沌工程可以帮助你为故障做好预案,通过这样来学会构建更好的系统,改进现有系统,甚至让世界变得更加安全。