设计混沌试验

已完成

任务关键型应用程序需要具有复原能力,并准备好应对故障。 但是,很难预测云中的潜在故障情况。 混沌工程使你能够在受控环境中进行故障试验,以确定开发和部署过程中可能出现的问题。 故意注入实际故障,并观察系统反应。

在本单元中,我们将使用 Azure Chaos Studio。 该服务将帮助你衡量、了解和改进云应用程序和服务复原能力。 如果此故障在生产中的不利条件下发生,你将准备好快速应对。

执行故障模式分析

设计混沌试验时,第一步是执行应用程序组件的故障模式分析 (FMA),以确定潜在的故障场景。

  1. 列出与用户流相关的所有组件,这些组件需要可用且正常运行。 例如,签出用户流使用 Azure 应用服务、Functions 和 Cosmos DB 数据库。

  2. 对于每个组件,请列出可能的故障案例、其影响以及任何可能的缓解措施。

我们来看看针对 Contoso Shoes 结帐用户流示例的组件完成的 FMA 的结果。

用于托管前端应用程序的 Azure 应用服务
风险 影响 可能的缓解操作
可用性区域中断 该区域中的实例可能由此不可用。
预计不会发生完全中断,因为 App 服务计划启用了区域冗余。
允许剩余实例上的额外负载,并为此场景提供足够的空余空间,同时仍能实现性能目标。
SNAT 端口耗尽 无法创建出站连接。 因此,下游调用(如对数据库的调用)失败。 使用专用终结点连接到下游组件。
单个实例变得不正常 路由到运行不正常的实例的用户流量可能会出现性能不佳,甚至完全失败。 应用服务运行状况检查功能将导致自动识别运行不正常的实例,并将其替换为正常运行的新实例。
用于结帐逻辑的 Azure Functions
风险 影响 可能的缓解操作
慢(冷)启动性能 由于使用了 Azure Functions 消耗计划,因此新实例将没有性能保证。
对服务的高需求(来自“干扰邻居”)可能会导致结帐函数遇到较长的启动持续时间,这会影响性能目标。
升级到 Azure Functions 高级计划。
基础存储中断 如果基础存储帐户不可用,函数将停止工作。 负载均衡计算与区域存储配合使用,或将负载均衡计算与 GRS 共享存储配合使用
Azure Cosmos DB 数据库
风险 影响 可能的缓解操作
重命名数据库或集合 由于配置不匹配,因此可能会丢失数据。 在更新配置并重启其组件前,应用程序无法访问任何数据。 请使用数据库和集合级锁来防止这种情况。
写入区域中断 如果主要区域(或写入区域)出现中断,若在 Azure Cosmos DB 帐户上配置了“自动(服务托管)故障转移”,则 Azure Cosmos DB 帐户会自动将次要区域提升为新的主要写入区域。 该帐户将按指定的区域优先级顺序故障转移到其他区域。 使用多个区域和自动故障转移配置数据库帐户。 如果发生故障,服务将自动进行故障转移,并防止应用程序中出现任何持续的问题。
由缺少请求单位 (RU) 引起的大量限制 某些标记可能会在 Azure Cosmos DB 使用率上热运行,而其他标记仍可为请求提供服务。 请对更多标记使用更好的负载分布,或添加更多 RU。

设计混沌试验

若要设计混沌试验,请选取一些失败案例。 选择可基于发生故障的可能性或可能的影响。

试验的目标是验证已在应用程序中实现的复原措施。 对于示例假设,假设在启用了区域冗余的应用服务上运行应用程序。 如果某个区域中的所有基础实例都关闭,你希望应用程序仍在运行。

使用 Chaos Studio 将故障注入相关组件。 Chaos Studio 提供了故障库,供你从中选择。 但是,由于故障库未涵盖所有内容,因此可能需要调整场景。 或者,你可能需要查找更多工具来帮助注入故障。

重要

试验中仅面向非生产环境。 将故障注入生产环境可能会有风险,需要经验和规划。

示例:Azure Cosmos DB 中断和故障转移

假设选择的是表中所列 Azure Cosmos DB 的“写入区域中断”故障场景。 假设是:服务启动的故障转移不应对应用程序造成任何持续影响。 如果此假设证明为真,则表明已验证以下内容:复制到多个区域的复原措施对应用程序可靠性具有预期的积极影响。

若要模拟此故障,请使用 Chaos Studio 故障库中的 Azure Cosmos DB 故障

此示例适用于 Azure Cosmos DB 故障转移,该故障转移运行 10 分钟 (PT10M),并使用 West US 2 作为新写入区域。 其中假定 West US 2 已设置为读取复制区域之一。

{
  "name": "branchOne",
  "actions": [
    {
      "type": "continuous",
      "name": "urn:csci:microsoft:cosmosDB:failover/1.0",
      "parameters": [
        {
          "key": "readRegion",
          "value": "West US 2"
        }
      ],
      "duration": "PT10M",
      "selectorid": "myCosmosDbResource"
    }
  ]
}

试验结束后,Chaos Studio 将写入区域切换回其原始值。

必须先为 Azure 资源启用相应的目标和功能设置,然后才能对资源注入故障。 此设置控制可针对为故障注入启用的资源运行的故障。 使用目标和功能以及其他安全措施时,可避免意外或恶意故障注入。

现在,你已经设计了负载测试和混沌试验,你需要将其自动执行到管道中,以便其一致且定期运行。 在下一单元中,你将了解如何将测试添加到 CI/CD 管道中。

知识检查

1.

混沌试验的目标是什么?

2.

Azure Chaos Studio 支持哪些服务?

3.

需要启用哪些设置才能通过 Azure Chaos Studio 对 Azure 服务运行试验?