混沌工程

混沌工程

近年来,随着服务化、微服务和持续集成的逐渐普及,从开发到线上的便捷性大幅提高。我们在使用这些便利性所带来的好处的同时,对其负面性的问题也要有所认知。尤其是在一个复杂的分布式服务体系中,故障发生的随机性和不可预测性都大大增加了。快速迭代的门槛越来越低,但是对复杂系统稳定性的考验却在成倍增长。

分布式系统天生包含大量的交互、依赖点,可以出错的地方数不胜数。硬盘故障、网络不通、流量激增压垮某些组件,在复杂的分布式系统中,人力并不能够阻止这些故障的发生,我们应该致力于在这些异常行为被触发之前,尽可能多地识别出会导致这些异常的,在系统中脆弱的,易出故障的环节。当我们识别出这些风险,我们就可以有针对性地进行加固,防范,从而避免故障发生时所带来的严重后果。我们能够在不断打造更具弹性(弹性:系统应对故障、从故障中恢复的能力)系统的同时,树立运行高可用分布式系统的信心。 混沌工程通过实验性的方法,让人们建立对于复杂分布式系统在生产中抵御突发事件能力的信心。实践混沌工程是如何提高系统弹性的呢?它通过设计和执行一系列实验,帮助我们发现系统中潜在的、可以导致灾难的、或让用户受损的脆弱环节,推动我们主动解决这些环节。相比现在各大公司主流的被动式故障响应流程,混沌工程向前迈进了一大步。

混沌工程在 Netflix 的发展历程

2008 年 Netflix 开始从数据中心迁移到云上,之后就开始尝试在生产环境开展一些系统弹性的测试。过了一段时间这个实践过程才被称之为混沌工程。最早被大家熟知的是“混乱猴子”(Chaos Monkey),以其在生产环境中随机关闭服务节点而“恶名远扬”。进化成为“混乱金刚”(Chaos Kong)之后,这些之前获得的小收益被无限扩大。规模的扩大得益于一个叫做“故障注入测试”(Fault Injection Test,FIT)的工具。我们随后确立了混沌工程的若干原则,用以将这个实践规范的学科化 ,同时我们推出了混沌工程自动化平台,能够在微服务体系架构上,24*7 不间断地自动运行混沌工程实验。

在开发这些工具和实践的过程中,我们逐渐意识到,混沌工程并非是简单的制造服务中断等故障。当然,尝试破坏系统和服务很简单,但并不是全都可以有建设性、高效地发现问题。混沌工程的意义在于,能让复杂系统中根深蒂固的混乱和不稳定性浮出表面,让我们可以更全面地理解这些系统性固有现象,从而在分布式系统中实现更好的工程设计,不断提高系统弹性。

测试与混沌工程

在测试中,我们要进行断言:即给定一个特定的条件,系统会输出一个特定的结果。测试一般来说只会产生二元的结果,验证一个结果是真还是假,从而判定测试是否通过。严格意义上来说,这个实践过程并不能让我们发掘出系统未知的或尚不明确的认知,它仅仅是对我们已知的系统属性可能的取值进行测验。而实验可以产生新的认知,而且通常还能开辟出一个更广袤的对复杂系统的认知空间。