在分布式系统中查找故障超出了标准应用程序测试的能力。公司需要更智能的方法来持续测试微服务。一种越来越受欢迎的策略是混沌工程。使用这种主动测试实践,组织可以在故障导致代价高昂的停机之前寻找并修复故障。继续阅读以了解混沌工程如何提高大型分布式系统的可靠性。
什么是混沌工程?定义
混沌工程是一种发现分布式系统漏洞的策略。这种做法需要在生产过程中将故障和错误注入软件。一旦你故意造成错误,监控效果以查看系统如何响应压力。通过故意“破坏”,您会发现可能影响组件和最终用户的新问题。在导致数据丢失或服务影响之前解决已识别的弱点。
混沌工程允许管理员:
- 识别系统中的弱点。
- 实时查看系统如何响应压力。
- 让团队为真正的失败做好准备。
- 识别尚未导致系统范围问题的错误。
Netflix 是第一个引入混沌工程的组织。2010 年,该公司发布了一款名为Chaos Monkey的工具。使用此工具,管理员能够以随机间隔在随机位置造成故障。这种测试方法使 Netflix 的分布式基于云的系统对故障更具弹性。
谁使用混沌工程?
许多科技公司采用混沌工程来提高分布式系统的弹性。Netflix 继续开创这种做法,但 Facebook、谷歌、微软和亚马逊等公司也有类似的测试模型。更多的传统组织也开始使用混沌测试。例如,澳大利亚国民银行应用混乱随机关闭服务器并建立系统弹性。
混沌工程的需要
Sun Microsystem 的 Peter Deutsch 和他的同事列出了程序员通常对分布式系统做出的八个错误假设:
- 网络可靠。
- 延迟为零。
- 带宽是无限的。
- 网络是安全的。
- 拓扑永远不会改变。
- 有一个管理员。
- 运输成本为零。
- 网络是同质的。
这些谬误显示了在微服务架构中设计的分布式应用程序的动态性。这种系统有很多活动部件,管理员对云基础设施几乎没有控制权。对设置的不断更改会导致意外的系统行为。无法预测这些行为,但我们可以通过混沌工程重现和测试它们。
混沌工程与故障测试之间的区别
失败测试检查单个条件并确定属性是真还是假。这样的测试以先入为主的方式破坏了系统。结果通常是二进制的,它们不会发现有关应用程序的新信息。混沌测试的目标是生成关于系统的新知识。更广泛的范围和不可预测的结果使您能够了解系统的行为、属性和性能。您开辟了新的探索途径,并了解如何改进系统。
虽然不同,但混乱和故障测试确实在关注点和使用的工具上有一些重叠。当您使用这两个学科来测试应用程序时,您会获得最佳结果。
混沌工程是如何工作的
混沌工程中的所有测试都是通过所谓的混沌实验进行的。每个实验都从将特定故障注入系统开始,例如延迟、CPU 故障或网络黑洞。然后,管理员观察并比较他们认为会发生的事情与实际发生的事情。一个实验通常涉及两组工程师。第一组控制故障注入,第二组处理效果。
以下是混沌实验的分步流程:
第 1 步:创建假设
工程师分析系统并选择导致什么故障。混沌工程的核心步骤是预测系统遇到特定错误后的行为方式。
工程师还需要在开始测试之前确定关键指标阈值。指标通常分为两组:
- 关键指标:这些是实验的主要指标。例如,您可以衡量对延迟、每秒请求数或系统资源的影响。
- 客户指标:这些是预防性指标,可以告诉您测试是否太过分。客户指标的示例是每分钟订单数或每秒流启动数。如果测试开始影响客户指标,这表明管理员停止试验。
在某些测试中,这两个指标可能重叠。
第 2 步:故障注入
工程师将特定故障添加到系统中。由于无法确定应用程序的行为方式,因此始终有一个备份计划。大多数混沌工程工具都有反向选项。这样,如果出现问题,您可以安全地中止测试并返回应用程序的稳定状态。
第 3 步:衡量影响
当错误导致重大问题时,工程师会监控系统。关键指标是主要关注点,但始终监控整个系统。如果测试开始模拟中断,团队会寻找修复它的最佳方法。
第 4 步:验证(或反驳)你的假设
成功的混沌测试有两种结果之一。您要么验证系统的弹性,要么找到需要修复的问题。两者都是很好的结果。
混沌工程原理
虽然名称可能暗示其他情况,但混沌工程中没有任何随机性。
这种测试方法遵循严格的原则,包括以下原则:
了解系统的正常状态
定义系统的稳态。系统的通常行为是任何混沌实验的参考点。通过了解系统何时处于健康状态,您将更好地了解错误和故障的影响。
注入现实的错误和失败
所有实验都应反映现实和可能的情况。当您注入现实生活中的故障时,您会很好地了解哪些流程和技术需要升级。
生产测试
如果将测试应用于生产环境,您只能看到中断对系统的影响。如果您的团队几乎没有混沌测试经验,让他们开始在开发环境中进行试验。准备好后测试生产环境。
控制爆炸半径
始终最小化混沌测试的爆炸半径。由于这些测试发生在生产环境中,因此测试可能会影响最终用户。另一个标准预防措施是让团队为实际事件响应做好准备,以防万一。
连续混沌
您可以将混沌实验自动化到与 CI/CD 管道相同的级别。持续的混乱使您的团队能够不断改进当前和未来的系统。
混沌工程的好处
混沌工程的好处跨越多个业务领域:
商业利益
混沌工程通过防止长时间的中断来帮助阻止巨大的收入损失。这种做法还允许公司在不损失服务可靠性的情况下快速扩展。
技术优势
来自混沌实验的见解可以减少事故,但这并不是技术优势的终点。团队对系统模式和依赖关系有了更深入的了解,从而使他们能够构建更强大的系统设计。混沌测试对于工程团队来说也是极好的随叫随到的培训。
客户利益
更少的中断意味着对最终用户的干扰更少。改进的服务可用性和持久性是混沌工程的两个主要客户优势。
混沌工程工具
这些是最常见的混沌工程工具:
- Chaos Monkey:这是 Netflix 创建的原始工具。虽然它于 2010 年问世,但 Chaos Monkey 仍然会定期更新,并且是首选的混沌测试工具。
- Gremlin: Gremlin 帮助客户设置和控制混沌测试。该工具的免费版本提供基本测试,例如关闭机器和模拟高 CPU 负载。
- Chaos Toolkit:这个开源计划通过开放 API 和标准 JSON 格式使测试更容易。
- Pumba: Pumba 是 Docker 的混沌测试和网络仿真工具。
- Litmus:用于 Kubernetes 上的有状态工作负载的混沌工程工具。
为了跟上新工具 的步伐,请为 Chaos Engineering Slack 社区创建的图表添加书签。除了工具之外,该图表还记录了从事混沌测试的已知工程师。
混沌工程示例
混沌实验没有限制。您运行的测试类型取决于您的分布式系统的架构和业务目标。
以下是最常见的混沌测试列表:
- 模拟微型组件的故障。
- 关闭虚拟机以查看依赖项如何反应。
- 模拟高 CPU 负载。
- 断开系统与数据中心的连接。
- 在服务之间注入延迟。
- 随机导致函数抛出异常(也称为基于函数的混乱)。
- 向程序添加指令并允许故障注入(也称为代码插入)。
- 破坏系统时钟之间的同步。
- 模拟 I/O 错误。
- 导致流量突然激增。
- 注入拜占庭式故障。
混沌工程和 DevOps
混沌工程是DevOps 文化中的一种常见做法。这样的测试使 DevOps 能够彻底分析应用程序,同时跟上敏捷开发的节奏。DevOps 团队通常使用混沌测试来定义基础设施的功能基线和容差。测试还通过阐明稳态和混沌输出来帮助创建更好的政策和流程。一些公司更喜欢将混沌工程集成到他们的软件开发生命周期中。集成混乱使公司能够确保每个新功能的可靠性。
任何大型分布式系统的必备工具
对软件的持续检查对于应用程序的安全性和功能性都至关重要。通过主动检查系统,您可以减轻运营负担、提高系统可用性和弹性。