设计混沌试验
任务关键型应用程序需要具有复原能力,并准备好应对故障。 但是,很难预测云中的潜在故障情况。 混沌工程使你能够在受控环境中进行故障试验,以确定开发和部署过程中可能出现的问题。 故意注入实际故障,并观察系统反应。
在本单元中,你将使用 Azure Chaos Studio。 该服务将帮助你衡量、了解和改进云应用程序和服务复原能力。 如果此故障在生产中的不利条件下发生,你将准备好快速应对。
执行故障模式分析
设计混沌试验时,第一个操作是执行应用程序组件的故障模式分析 (FMA),以确定潜在的故障场景:
列出与用户流相关的所有组件,这些组件需要可用且正常运行。 例如,签出用户流使用 Azure 应用服务、Azure Functions 和 Azure Cosmos DB 数据库。
对于每个组件,请列出可能的故障案例、其影响以及任何可能的缓解措施。
我们来看看针对 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 管道中。