“混沌”指混乱而没有秩序的状态。然而,这不意味着混沌工程的实施也是无序、随意的,也不意味着混沌工程师的工作就是引发混乱。
混沌工程是一种方法学,属于实验学科范畴。它通过在系统基础设施上开展各种各样的实验,并对系统表现加以观察,从而主动发现系统中的薄弱环节。
具体而言,混沌工程是借助在生产环境下的分布式系统上进行实验,来主动探寻系统薄弱之处的方法学。
这种基于实证的验证方法有助于研发团队构建更具弹性(所谓弹性,即系统应对故障以及从故障中恢复的能力)的系统,并且能使研发团队更深入地了解系统运行时的各种行为规律,进而建立起运行高可用分布式系统的信心
11.3.1 混沌工程的概述
近年来,随着互联网的高速发展,分布式系统、敏捷开发、云原生微服务架构等技术被广泛应用,开发效率和便捷性大幅提升。
云原生的发展,也不断推进着微服务的进一步解耦,海量的数据与用户规模也带来了基础设施的大规模分布式演进。
但分布式系统因为与生俱来的各种相互依赖关系,使得系统调用关系和依赖越来越复杂,其可能出错的地方数不胜数,系统发生故障的概率也显著增加,这些问题处理不好就会导致业务及用户体验受损。
2008年8月,网飞公司因主要数据库发生了故障导致了3天的停机,DVD(Digital Versatile Disc,数字通用光碟)租赁业务中断,多个国家的大量用户受此影响。
之后网飞工程师着手寻找替代架构,并从2011年起,逐步将系统迁移到AWS(Amazon Web Service,亚马逊网络服务)上,运行基于微服务的新型分布式架构。这种架构消除了单点故障,但也引入了新的复杂性类型,需要更加可靠和容错的系统。
为此,网飞工程师创建了Chaos Monkey,会随机终止在生产环境中运行的EC2(Amazon Elastic Computer Cloud,亚马逊弹性计算云)实例。
工程师可以快速了解他们正在构建的服务是否健壮,是否有足够的弹性,是否可以容忍计划外的故障。至此,混沌工程开始兴起。
混沌工程和传统测试(如故障注入测试)在关注点和工具集上是有很大重叠的。例如,在很多混沌工程实验中,研究的对象都是基于故障注入来引入的。混沌工程和故障注入测试等传统测试方法的主要区别如下。
混沌工程:
主动在线上环境随机触发各种事件,包括验证一些例如流量激增、资源竞争等非故障类实验,去发现分布式系统中不可预知且很可能出现问题的薄弱环节,是一种可以生成新信息的实验。
故障注入测试:
通过对预先设想到的可能破坏系统的点进行测试,测试结果只有真或假。
混沌工程收益如下:
(1)发现系统薄弱环节。
发现系统薄弱环节(风险点或缺陷)是混沌工程最显著也是最容易理解的收益之一,混沌工程最原始的目的就是发现系统薄弱环节。
(2)提升开发人员的重视程度。
在做大型项目混沌工程实验尤其是生产环境实验前,通常需要组织系统相关人员一起全面评估在某个事件下系统的可能表现以及风险是什么。
通过这种形式可以使参与系统研发的开发人员、测试人员、运维人员等相关人员对系统全局有更深刻的理解,并提升相关人员对于系统稳定性以及是否经得起混沌工程实验考验的重视程度。
从而在系统设计、功能开发、应用测试、部署运维等更清楚地知道系统的相关修改对系统全局可能产生什么影响,以尽早规避相关风险。
(3)识别监控环节问题。
由于混沌工程是通过衡量系统运行状况的系统指标和业务指标来观察实验对业务系统的实际影响的,因此,可以通过系统指标和业务指标波动的趋势来相互印证。
如果波动趋势有差异,则指标数据的定义、采集、报警设置等可能存在问题,进一步影响到监控报警的准确性和有效性。
本书作者:孔令云
......
点击阅读原文,查看独家连载

