混沌工程实验的五种模式


混沌工程是一个系统化的过程,它包括故意让一个应用程序以一种降低风险的方式遭受破坏性事件,密切监测其反应,并实施必要的改进。其目的是验证或挑战关于应用程序处理这种破坏的能力的假设。混沌工程使工程师们能够在受控的环境中安排受控的实验,而不是将这些事件留给机会,通常是在流量较少的时期,并且有现成的工程支持来有效缓解。

为了逐步系统地建立和提高信心和成熟度,你需要了解用混沌工程进行实验的不同方法。

有五种主要的实验模式:

  1. ad-hoc实验、
  2. GameDays、
  3. 持续集成和持续交付(CI/CD)管道、
  4. 金丝雀发布
  5. 持续实验。

每种模式都有助于系统的弹性,其顺序可能会有变化--但通常这是 "自然 "的进展。

ad-hoc模式
ad-hoc模式是一种直截了当的方法,旨在手动发现潜在的缺陷和错误。

ad-hoc模式包括非正式和非结构化的实验,我们依靠有经验的工程师来 "猜测 "最可能的错误来源。这种实验模式在时间有限或我们探索某种特定技术时很有用。然而,为了取得更大的成效,使用小脚本或代码片断逐步将这些实验正规化和自动化是至关重要的。通过引入自动化,我们为实验过程带来了一致性和可重复性,使我们能够不断发现和解决潜在的缺陷。

需要注意的是,由于存在影响客户流量和导致中断的风险,在生产系统中进行ad-hoc实验应该非常有限。相反,建议在非生产环境中利用ad-hoc实验。

ad-hoc实验作为一种有价值的探索模式,允许尝试不同的方法和场景,并完善直觉,以形成或改进一个假设。

GameDays模式
然后我们有GameDays,作为模拟场景,供团队练习和评估其事件响应能力。

GameDays游戏日不仅可以测试和提高技术能力,还可以验证流程和角色。可以把它们看作是消防演习,但却是针对软件系统的。

游戏日允许团队建立必要的技能和知识,以有效地应对破坏性事件。通过模拟潜在的危险场景,我们可以选择何时以及如何参与其中,使我们能够完善我们的反应程序。游戏日涵盖了关键领域,如复原力、可用性、性能、操作和安全。

让所有负责操作工作负载的人员参与进来是非常重要的,包括来自运营、测试、开发、安全和业务运营的人员。将监控、警报和参与整合到GameDays中,可以培养一种持续学习和改进的文化。最终的目标是在生产环境中进行GameDays,进一步加强系统的适应性。最后,GameDays提供了一个独特的机会,使特定的混乱实验 "毕业",并使其自动化。

CI/CD流水线模式
接下来,我们在CI/CD管道中进行测试,这是一种已经先进的弹性实验模式。这种模式涉及到在持续集成和持续交付管道内进行自动化实验。通过这样做,我们可以在问题到达生产环境之前,及早发现并修复问题。这里的关键原则是 "快速失败",尽可能早地捕捉和解决错误,降低成本,防止问题进一步扩散。将混沌实验整合到持续交付的工作流程中,可以实现主动和迭代的复原力实验方法。

这种方法在动态和快节奏的持续交付世界中特别有价值,因为在这个世界中,应用程序的频繁变化和更新是常态。它确保弹性不是事后的想法,而是开发过程的一个组成部分,根植于应用程序演变的每一步。

然而,由于其性质和目的,混沌实验CI/CD管道与快速部署管道不同。与快速部署管道不同,混沌管道的触发频率较低,涉及的内容也不仅仅是另一个集成测试。由于注入故障和评估系统的弹性的复杂性,它通常需要额外的时间和考虑。因此,混沌管道可能有更长的执行时间,以便全面观察、分析和验证系统对注入故障的反应。这种深思熟虑的方法确保了系统的弹性得到彻底的验证和优化,在部署到生产环境之前减少了潜在的风险。

同样重要的是,由于各种因素,如复杂性或潜在风险,并非所有的混沌实验都适合纳入CI/CD管道。事实上,一些实验可能涉及复杂的设置或系统组件之间复杂的相互作用,使得它们在自动化和纳入自动化管道方面具有挑战性。
因此,在将混沌实验纳入CI/CD管道之前,评估其潜在的复杂性并权衡其收益是至关重要的。

金丝雀发布模式
然后,我们有金丝雀发布,这是一种在发布管道中使用的策略,用于最小化与引入新功能或变化相关的风险。金丝雀发布包括逐渐将一小部分用户路由到应用程序的不同版本,称为金丝雀版本。金丝雀通常被称为分阶段或渐进式的推出。这种方法允许工程师以一种可控的方式评估实验的性能。通过限制对用户子集的影响,金丝雀版本减少了故障的潜在爆炸半径。

金丝雀发布的一个重要好处是,如果出现问题,可以快速回滚到以前的版本。这种模式为工程师提供了一种快速和相对安全的方式,使用真实的生产数据测试新功能。然而,金丝雀发布在路由流量到多个版本的应用程序方面提出了挑战。各种机制,如内部团队与客户的路由,基于地理的路由,功能标志/切换,以及随机分配,通常用于解决这一挑战。

连续实验模式
最后,我们有持续的实验。无论是在非生产环境还是在生产环境中进行,它都涉及到对整个系统和所有用户进行实验。当在非生产环境中进行连续实验时,确保设置在流量模式和负载能力方面密切反映生产环境是至关重要的。流量重放等技术能够复制真实的流量模式和负载,促进对系统弹性的宝贵见解,而不影响关键的生产系统。

为了有效地支持在非生产环境中的连续实验,建立强大的监控、警报和事件响应协议是至关重要的。这些策略能够密切监控系统的行为,及时发现异常情况或弱点,并进行有效的事件响应。重要的是,要以在生产环境中同样的勤奋和谨慎对待非生产环境,确保类似的行为。在生产环境中,持续的实验包括将系统置于动荡的条件下,就像Netflix的Chaos Monkey工具一样,它不断地终止实例。这种故意引入的 "混乱 "不断挑战和验证系统承受干扰的能力。

卓越的监控、警报和事件响应协议对于支持生产中的持续实验是必要的。然而,重要的是要注意,在生产中的持续实验应该在更大的系统中断时自动停止,以防止进一步的复杂化。在弹性和负责任的实验实践之间取得平衡,对于维护客户的信任至关重要。

总结
与其他模式相比,ad-hoc模式和游戏日模式都可以被认为是更 "手动 "的方法。这些模式涉及更多的实践和探索过程,工程师们通过观察和实验积极塑造和完善假设。

另一方面,CI/CD管道、金丝雀发布和持续实验模式在本质上更加自动化。这些模式专注于以受控和迭代的方式运行经批准和验证的假设。他们利用自动化和集成到开发和部署过程中,以确保一致和可重复的实验。

这两组模式在混沌工程的过程中都有不同的目的。ad-hoc模式和游戏日模式对于探索、完善和塑造假设很有价值,而其他三种模式则提供了一个框架,以更自动化和系统化的方式在这些既定假设的基础上运行实验。

虽然混沌工程有一般的最佳实践,但每种模式都是独特的,因此你需要相应地调整最佳实践和准则。对于工程师来说,熟悉这些模式以最大限度地提高工作的有效性和准确性是非常重要的。