混沌工程实践
混沌工程可以简单的理解为有目的的搞破坏,然后观察系统的运行状态,发现系统脆弱点,本质上是一种反脆弱的工程实践。
混沌工程简史
2010 年 Netflix Eng Tools 团队开发出了 Chaos Monkey。当时,Netflix 从物理基础设施迁移到 AWS 上,为了保证 AWS 实例的故障不会给 Netflix 的用户体验造成影响,他们开发了这个工具,用来测试系统。
2011 年 Simian Army 诞生,在 Chaos Monkey 的基础上增加了故障注入模式,可以测试更多的故障场景。Netflix 认为,云的特点是冗余和容错,但没有哪个组件能够保证 100% 的可用性,所以他们必须设计出一种云架构,在这种架构里,个体组件的故障不会影响到整个系统。
2012 年 Netflix 在 GitHub 上开源了 Chaos Monkey,并声称他们“已经找到了应对主要非预期故障的解决方案。通过经常性地制造故障,我们的服务因此变得更有弹性。”
2014 年 Netflix 团队创建了一种新的角色,叫作混沌工程师。Bruce Wong 发明了这个角色,并由 Dan Woods 在 Twitter 上向广大的工程社区推广。Dan Woods 解释说,“我从 Kolton Andrus 那里学到了更多有关混沌工程的知识,他把它叫作故障注入测试”。
2014 年 10 月,当时 Gremlin 的联合创始人 Kolton Andrus 还在 Netflix,他们在 Simian Army 的基础上提出了故障注入测试(FIT)概念,开发者可以更灵活地控制注入故障的“杀伤力范围”。因为 Simian Army 有时候会造成非常严重的故障,所以 Netflix 的开发者对它抱有疑虑,而 FIT 可以更好地控制故障粒度,于是他们就由此想出了混沌工程这个概念。
实施方法
1、定义并测量系统的“稳定状态”。首先精确定义指标,表明您的系统按照应有的方式运行。 Netflix 使用客户点击视频流设备上播放按钮的速率作为指标,称为“每秒流量”。请注意,这更像是商业指标而非技术指标。事实上,在混沌工程中,业务指标通常比技术指标更有用,因为它们更适合衡量用户体验或运营。对于电商系统,也有很多类似指标:
单量
库存出货量
加购物车量
首页访问量
。。。
2、创建假设。与任何实验一样,您需要一个假设来进行测试。因为你试图破坏系统正常运行时的稳定状态,你的假设将是这样的,“当我们做 X 时,这个系统的稳定状态应该没有变化。”为什么用这种方式表达?如果你的期望是你的动作会破坏系统的稳定状态,那么你会做的第一件事会是修复问题。混沌工程应该包括真正的实验,涉及真正的未知数。
3、模拟现实世界中可能发生的事情,目前有如下混沌工程实践方法:模拟数据中心的故障、强制系统时钟不同步、在驱动程序代码中模拟 I/O 异常、模拟服务之间的延迟、随机引发函数抛异常。通常,您希望模拟可能导致系统不可用或导致其性能降低的场景。首先考虑可能出现什么问题,然后进行模拟。一定要优先考虑潜在的错误。 “当你拥有非常复杂的系统时,很容易引起出乎意料的下游效应,这是混沌工程寻找的结果之一,”“因此,系统越复杂,越重要,它就越有可能成为混沌工程的候选对象。”
4、证明或反驳你的假设。将稳态指标与干扰注入系统后收集的指标进行比较。如果您发现测量结果存在差异,那么您的混沌工程实验已经成功 - 您现在可以继续加固系统,以便现实世界中的类似事件不会导致大问题。或者,如果您发现稳定状态可以保持,那么你对该系统的稳定性大可放心。
实践
有时候,创建这样的假设比较困难(当我们做 X 时,这个系统的稳定状态应该没有变化。),需要定义业务指标,有的时候业务指标抽象程度过高又容易失去细粒度信息,而且会存在某个环节出现故障可能需要比较长的时间才能反映到业务指标上,这样处理时间就会延迟了,因此我们采用变通方法。
关键点:
预期外结果,相当于做实验过程中的新发现。
报警,故障发生时报警有没有及时发送出来。
可观测,能够方便的观测到系统故障。
注入故障列表需要持续收集,这个是核心资产。
业务测试 vs 混沌
:::info 混沌侧重发现新知识。:::
普通业务测试用例
工具
Chaos Monkey - A resiliency tool that helps applications tolerate random instance failures.
The Simian Army - A suite of tools for keeping your cloud operating in top form.
orchestrator - MySQL replication topology management and HA.
kube-monkey - An implementation of Netflix's Chaos Monkey for Kubernetes clusters.
Gremlin Inc. - Failure as a Service.
Pumba - Chaos testing and network emulation for Docker containers (and clusters).
Chaos Toolkit - A chaos engineering toolkit to help you build confidence in your software system.
ChaoSlingr - Introducing Security Chaos Engineering. ChaoSlingr focuses primarily on the experimentation on AWS Infrastructure to proactively instrument system security failure through experimentation.
PowerfulSeal - Adds chaos to your Kubernetes clusters, so that you can detect problems in your systems as early as possible. It kills targeted pods and takes VMs up and down.
drax - DC/OS Resilience Automated Xenodiagnosis tool. It helps to test DC/OS deployments by applying a Chaos Monkey-inspired, proactive and invasive testing approach.
Wiremock - API mocking (Service Virtualization) which enables modeling real world faults and delays
MockLab - API mocking (Service Virtualization) as a service which enables modeling real world faults and delays.
Pod-Reaper - A rules based pod killing container. Pod-Reaper was designed to kill pods that meet specific conditions that can be used for Chaos testing in Kubernetes.
Muxy - A chaos testing tool for simulating a real-world distributed system failures.
Toxiproxy - A TCP proxy to simulate network and system conditions for chaos and resiliency testing.
Blockade - Docker-based utility for testing network failures and partitions in distributed applications.
chaos-lambda - Randomly terminate ASG instances during business hours.
Namazu - Programmable fuzzy scheduler for testing distributed systems.
Chaos Monkey for Spring Boot - Injects latencies, exceptions, and terminations into Spring Boot applications
Byte-Monkey - Bytecode-level fault injection for the JVM. It works by instrumenting application code on the fly to deliberately introduce faults like exceptions and latency.
GomJabbar - ChaosMonkey for your private cloud
参考
Chaos Engineering 的历史、原则以及实践混沌工程(Chaos Engineering) 总结
评论