一、混沌工程简介
1、什么是混沌工程?
混沌工程的概念很早就存在,但是直到 2012 年Netflix 公司才让外界更多伙伴知晓“混沌”一词。为了更好地推广混沌工程,Netflix 公司引入了“一只猴子(Chaos Monkey)”。试想如下场景:一只猴子平日里安安静静,突然某天开始在系统里肆意捣乱,作为工程师要做的一件事情就是逮住这只猴子,阻止它继续捣乱。这大概就是混沌工程想要表达的意思。
简单来说混沌工程是一个工程学科,这就意味着需要做实验。通过设计并进行混沌实验,观察系统对各类故障的真实反应,以此来完善保证系统的稳定性。混沌工程是一种提高技术架构弹性能力的复杂技术手段,是一种可试验的、基于系统的方法,用于处理大规模分布式系统中的混乱问题。
2、混沌工程可以达成什么样的目的?
混沌工程被描述为在分布式系统上进行实验的学科,目的是在生产环境中测试分布式系统在面对失控条件时是否具备较强的“可观测性”和故障恢复能力,建立对系统承受生产环境中极端条件能力的信心。
3、混沌工程可以带来哪些价值与意义?
混沌工程通过主动制造故障,测试系统在各种压力下的行为,识别并修复故障问题,避免造成严重后果,提高系统健壮性。此外混沌工程能让复杂系统中根深蒂固的混乱和不稳定性浮出水面,让我们更全面了解系统中固有的现象并进行及时修复加固,防患于未然,打造出健壮的分布式系统。
二、混沌工程实施原则
- 建立一个围绕稳定状态行为的假设
- 多样化真实世界的事件
- 在生产环境中运行实验
- 持续自动化运行实验
- 最小化爆炸半径
三、混沌工程应用场景
- 提升系统的容错能力,提高稳定性
- 评估系统容灾红线
- 验证云服务、云资源的动态扩容能力
- 验证监控、告警的有效性和问题处理流程是否完善
- 故障突袭,提升相关人员定位、恢复问题的能力
四、混沌工程工具对比
五、混沌工程实践
1、模拟Pod故障
PodChaos 是 Chaos Mesh 中的一种故障类型。通过创建 PodChaos 实验,可以模拟指定 Pod 或容器的故障场景。目前,PodChaos 支持以下故障类型:
- Pod Failure:将故障注入到指定的 Pod 中,使该 Pod 在一段时间内不可用
- Pod Kill:杀死指定的 Pod。为了保证 Pod 能够成功重启,需要配置 ReplicaSet 或类似的机制
-
Container Kill:杀死目标 Pod 中的指定容器。从下图znbase的pod变化可以看出,在加入扰动后,pod从running状态变为pending状态,而后又恢复为running状态
2、模拟网络故障
NetworkChaos 是 Chaos Mesh 中的一种故障类型。通过创建 NetworkChaos 实验,可以模拟集群的网络故障场景。目前,NetworkChaos 支持以下故障类型:
- 分区:网络断开和分区
- 网络仿真:网络条件差,如高延迟、高丢包率、数据包重排序等
-
带宽:限制节点之间的通信带宽。在注入网络丢包的扰动后,当丢包率较低时,pod状态维持在running状态;当丢包率较高时,pod处于异常状态。
3、模拟压力场景
Chaos Mesh 提供了 StressChaos 实验来模拟容器内的压力场景,分为内存压力实验和cpu内存实验。可以调整压力参数测试数据库的健壮性。
4、模拟DNS故障
DNSChaos 用于模拟错误的 DNS 响应。例如,DNSChaos 可以在接收 DNS 请求时返回错误或返回随机 IP 地址。
5、模拟HTTP错误
HTTPChaos 是 Chaos Mesh 提供的一种故障类型。通过创建 HTTPChaos 实验,可以模拟 HTTP 请求和响应处理过程中的故障场景。目前,HTTPChaos 支持模拟以下故障类型:
- abort: 中断连接delay: 在请求或响应中注入延迟
- replace: 替换 HTTP 请求或响应消息中的部分内容
- patch:向 HTTP 请求或响应消息添加附加内容
6、模拟文件I/O故障
IOChaos 是 Chaos Mesh 中的一种故障。通过创建 IOChaos 实验,可以模拟文件系统故障的场景。目前,IOChaos 支持以下故障类型:
- latency: 延迟文件系统调用
- fault: 返回文件系统调用的错误
- attrOverride: 修改文件属性
- mistake: 使文件读或写错误的值