你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

可靠性成熟度模型

可靠性之旅是一个分步过程,其中每个阶段都建立在上一个阶段之上,以确保系统保持可用并满足用户期望。 此成熟度模型旨在帮助你评估当前状态并提供一个结构化的改进路径。

基础从启动 Azure 提供的基本可靠性功能开始,方法是使用内置的 Azure 可靠性功能(例如区域冗余)进行即时改进,而不会产生广泛的优化开销。

相反,实现可靠性高的方式是接受故障是不可避免的。 与其尝试防止每个问题,不如规划系统在出现问题时如何做出响应更为有效。 业务要求有助于确定哪些风险值得主动解决。 团队在结构化可观测性方面投入高级监控能力,将故障缓解扩展到应用层级,并开始测试弹性措施。

接下来,团队将业务见解与技术技能集成。 团队构建健康模型,执行故障模式分析,并准备全面的灾难恢复计划。 此阶段通过可衡量的目标和系统准备各种故障方案来确保问责。

在系统上线后,重点将转向管理生产环境的挑战,包括变更管理和处理数据增长和运营复杂性,以及这些挑战如何影响系统的可靠性。

最后一个级别无限期运行,保持弹性是其目标。 此级别表示技术控制与体系结构适应性以外的演变。 这一级别侧重于使系统能够承受新的和无法预见的风险,因为工作负载的发展和增长。

该模型分为五个不同的成熟度级别,每个级别都有一个主要目标和一组核心策略。 使用下面的选项卡式视图浏览每个级别。 在推进过程中,也要回顾关键的权衡和相关风险。

目标图标 为工作负载基础设施和操作建立坚实的复原能力基础,而不是将时间花在优化任务上。

成熟度模型的级别 1 旨在帮助工作负荷团队为系统可靠性构建坚实的基础。 重点在于引导启动,即为未来的可靠性决策打下基础。 此阶段主要涉及功能实现,并对现有做法进行一些小的扩展。

此阶段包括研究、获取见解和创建系统的清单。 它还使用 Azure 上的内置可靠性功能,例如启用区域冗余以实现即时改进。

通过建立这些基础知识,你可以让团队做好准备,通过可靠性成熟度模型的水平来逐步增强系统的复原能力和性能。

关键策略

• 评估卸载运营责任的机会

此策略从根本上讲是一种 构建购买或依赖 的方法。 该决定取决于在这个阶段可以管理多少责任,同时仍支持未来的开发。 你希望使用与工作负荷相关的资源,但应始终探索卸载其维护的机会。 下面是一些可能需要应用此方法的经典用例。

  • 通过选择平台即服务(PaaS)解决方案将责任卸载到云平台。 它们为常见的复原需求(例如复制、故障转移和备份存储)提供现成的解决方案。 采用此方法时,云提供商将处理托管、维护和复原能力改进。

    例如,云提供程序跨多个计算节点复制数据,并将副本分布到可用性区域。 如果在虚拟机(VM)上构建自己的解决方案,则需要自行管理这些方面,这可能非常耗时和复杂。

  • 卸下与工作负荷的业务目标不直接相关的责任。 某些专用作(如数据库管理和安全性)可能会影响工作负荷的可靠性。 探索拥有经验丰富的团队、技术或同时处理这些任务的可能性。

    例如,如果你的团队没有数据库专业知识,请使用托管服务来帮助将责任转移到提供商。 当你开始的时候,此方法非常有用,因为它允许你的团队专注于工作负荷的功能。 许多企业共享、集中管理服务。 如果平台团队可用,请使用它们来处理这些操作。 但是,此方法可能会添加依赖项和组织复杂性。

    或者,如果你的团队具有适当的专业知识,则可以明确决定使用其技能并选择不包含管理功能的服务。

  • 将责任卸载给非Microsoft供应商。 选择现成的产品作为起点。 仅当自定义解决方案对工作负荷的业务价值有所贡献时,才会生成自定义解决方案。

风险: 如果 购买或信赖 选项部分满足你的要求,则可能需要实现自定义扩展。 此方法可能会导致“自定义锁定”情况,其中更新和现代化变得不切实际。 定期查看你的要求,并将其与解决方案的功能进行比较。 为两者之间存在重大偏差时制定退出策略。

相反的情况也是一种风险。 尽管 购买或依赖 选项起初可能看起来更简单,但如果 PaaS 服务、供应商解决方案或平台拥有的资源的限制不满足工作负荷所需的粒度或自治级别,可能需要重新评估和重新设计。

• 标识关键用户和系统流

在此阶段,将工作负荷分解为流至关重要。 专注于 用户系统 流。 用户流确定用户交互,系统流确定不直接与用户任务关联的工作负荷组件之间的通信。

例如,在电子商务应用程序中,客户执行前端活动,例如浏览和订购。 同时,后端事务和系统触发的进程满足用户请求并处理其他任务。 这些不同的流是同一系统的一部分,但它们涉及不同的组件并提供不同的用途。

在此阶段开始生成流目录。 观察用户交互和组件通信。 列出和分类流,定义它们的起点和终点,并记下依赖项。 为了清楚起见,使用关系图记录结果和异常。 此目录可以作为与业务利益干系人进行初始对话的重要工具,从其角度识别最重要的方面。 此对话可以通知优先顺序的第一级。

通过评估主要业务活动的风险和影响,将流分类为关键。 若预期中断发生,优雅降级的重点是维持这些关键流程。 在电子商务示例中,关键流包括产品搜索、将项目添加到购物车和结帐,因为这些任务对于业务至关重要。 其他过程(如更新产品数据和维护产品映像)并不那么重要。 确保关键流在中断期间保持正常运行,以防止收入损失,让用户继续搜索产品和将商品添加到购物车。

注释

即使业务流程不具有时间敏感性,它仍可能至关重要。 时间关键性是一个关键因素。 例如,满足审核要求是一个关键过程,但你可能不需要立即为审核提供数据。 此过程仍然很重要,但其可靠性并非时间关键,因为可以接受几个小时内的恢复。

有关详细信息,请参阅 Azure Well-Architected Framework:使用流优化工作负荷设计

• 选择正确的设计模型、资源和功能

应在以下级别应用此策略:

  • 建筑: 工作负荷设计应考虑到各种基础结构层的可靠性预期。 初始决策可能是容器化或 PaaS 之间用于托管应用程序的选择。 或者,也可以考虑采用星型拓扑或单一虚拟网络等网络结构。

    还应设置基于功能创建分段的边界。 例如,请考虑拆分计算和数据存储和使用专用服务,而不是在一个具有单区域虚拟磁盘的一个 VM 上托管所有内容。

    谨慎

    在迁移场景中,若直接采用“原样迁移”策略而不评估新机会,可能错失优势并带来低效。 务必尽早研究现代化改造,以避免被卡在难以更改的设置中,充分利用更好的方案和改进措施。

  • Azure 服务: 使用决策树帮助你为设计选择合适的服务。 选择满足当前需求的组件,但保持灵活,以便随着工作负荷的发展而切换服务,并且需要更多功能。

  • Azure 服务中的 SKU 或层: 查看每个 SKU 的功能并了解平台的可用性保证。 评估服务级别协议,以了解围绕已公开发布的百分位数提供的覆盖范围。

  • 支持可靠性的功能: 选择云原生服务,通过简单的配置增强可用性,而无需更改代码。 请务必了解这些选项并有意选择配置,例如增加区域冗余或将数据复制到次要区域。

• 使用基本级别的冗余进行部署

在解决方案的每个部分中,避免单一故障点,例如单个实例。 请改为创建多个实例来实现冗余。 Azure 服务通常为你处理冗余,尤其是在使用 PaaS 服务时,通常默认包括本地冗余,并提供升级冗余的选项。 最好使用区域冗余将这些实例分散到多个 Azure 数据中心。 如果不这样做,请至少确保本地冗余,但此方法的风险更高。 在将来的级别中,通过扩展解决方案并使用异地冗余组件来评估是否满足可靠性要求。

折衷: 一个重大权衡是冗余成本增加。 此外,跨区域通信可能会带来延迟。 对于需要最小延迟的旧应用程序,冗余可能会降低性能。

风险: 如果应用程序不是针对多实例环境设计的,它可能会与多个活动实例作斗争,这可能会导致数据不一致。 此外,如果应用程序是为低延迟的本地设置构建的,则使用可用性区域可能会中断其性能。

• 启用指标、日志和跟踪以监视流

选择平台原生工具(如 Azure Monitor),以确保指标、日志和跟踪的可见性。 使用内置功能设置潜在问题的警报。 你应该有基本的警报来发送通知并获取警报。 利用 Azure 平台功能,指示服务健康状态的变动,例如:

为基础设施和应用程序设置 Azure Monitor操作组

折衷: 收集更多日志时,需要管理不断增加的数量,这会影响这些日志的存储成本。 使用保留策略管理数据量。 使用 Azure Monitor 在工作区上设置每日上限。 有关详细信息,请参阅 可靠性的配置建议

开始构建以下各层的可观测性。

基础结构

首先启用诊断日志,并确保从平台组件收集本机指标进行分析。 收集有关资源使用情况的信息,例如 CPU、内存、输入/输出和网络活动。

应用程序

收集应用程序级指标,例如内存消耗或请求延迟,以及日志应用程序活动。 在独立于主应用程序线程的线程或进程中执行日志记录作。 此方法不会导致日志记录减慢应用程序的主要任务。

此外,请检查 Application Insights 中 的基本可用性测试

数据

若要在基本级别监视数据库,请收集数据库资源发出的关键指标。 与基础结构组件类似,跟踪数据存储上下文中的资源使用情况,例如网络指标。 收集关于如何优化连接池管理的数据对于提高后续流程的效率非常重要。

对于可靠性,必须跟踪连接指标,例如监视活动连接和失败的连接。 例如,在 Azure Cosmos DB 中,当请求数超过分配的请求单位和连接开始失败时,将返回 429 状态代码。

开始构建故障缓解手册

故障情况可从间歇性、稍长的短暂失败到灾难性中断不等。

在第一层级中,重点关注平台故障。 即使它们超出了你的控制范围,你仍应该有处理策略。 例如,使用可用性区域解决区域性中断。 预测平台级别的暂时性故障,并在工作负荷中处理它们。

处理这些失败的过程因复杂性而异。 开始记录潜在的平台级故障、其相关风险和缓解策略。 本练习主要是理论性的,在更高级别的自动化中成熟。

应记录故障,包括其可能性、影响和缓解策略等因素。 使用与工作负荷目标一致的关键性尺度。 您的规模可能包括:

  • 高。 完整的系统中断,导致重大财务损失和用户信任下降。

  • 中等。 影响部分工作负荷并导致用户不便的临时中断。

  • 低。 影响应用程序非核心功能的次要软件问题,仅导致用户的停机时间最少。

下面是一个示例模板:

问题 风险 来源 严重程度 可能性 缓解措施
暂时性网络故障 客户端失去与应用程序服务器的连接。 Azure 平台 很可能 在客户端逻辑中使用设计模式,例如重试逻辑和断路器。
区域故障 用户无法访问应用程序。 Azure 平台 不太可能 在所有组件上启用区域冗余。
传输层安全性 (TLS) 证书过期 客户端无法与应用程序建立 TLS 会话。 人为错误 很有可能 使用自动化 TLS 证书管理。
CPU 或内存使用率达到定义的限制,并导致服务器失败。 请求超时。 应用程序 中等 很有可能 实现自动重启。
组件在更新期间不可用。 用户在应用程序中遇到未经处理的错误。 部署或配置更改 在部署期间极有可能,在其他时间不太可能 在客户端逻辑中处理组件。

在第一级,不要追求完整性,因为总会有一些无法预见的失败情况。 如果遇到意外中断,请在操作手册中记录原因和缓解措施。 将此资产视为一段时间内更新的活文档。

• 添加机制以从暂时性故障中恢复

在云环境中,暂时性故障很常见。 它们表明短期问题,通常可以通过重试在几秒钟内解决。

使用内置 SDK 和配置来处理这些故障,使系统保持活动状态。 内置配置通常是默认设置,因此可能需要测试以验证实现。 此外,实现旨在处理体系结构中暂时性故障的模式。 有关详细信息,请参阅 支持可靠性的体系结构设计模式

持久性问题可能表明问题不是暂时性的,也可能预示着故障或停机的开始。 此方案不仅需要修复应用程序中的本地化问题。 它涉及检查系统的关键用户和系统流,以及添加自我保存技术和恢复工作。 这些方法是级别 2 描述的成熟做法。

• 运行基本测试

在软件开发生命周期的早期阶段集成基本可靠性测试。 查找执行测试的机会,从单元测试开始验证功能和配置。

此外,请针对风险缓解手册中识别的问题开发简单的测试用例。 专注于高影响力、低工作量的缓解措施。 例如,模拟网络中断或间歇性连接问题,了解重试逻辑如何解决中断。

风险: 测试通常会在开发周期中引入摩擦。 为了减少这种风险,应将可靠性测试与开发任务同时进行跟踪。

功能开发是优先事项,测试可以在开发周期中引入摩擦。 在功能开发完成之前,可以更轻松地开始测试。 在开始设计应用程序的非功能方面时,可以在添加功能功能时对其进行扩展,而不是构建积压问题,以便稍后解决。 虽然此方法最初需要更多精力,但它可以管理,并防止以后出现更大的问题。

后续步骤