Azure 应用服务的可靠性

本文介绍 Azure 应用服务的可靠性支持,包括 可用性区域多区域部署和暂时性故障处理的区域内复原能力。

Azure 应用服务是一项基于 HTTP 的服务,用于托管 Web 应用程序、REST API 和移动后端 。 Azure 应用服务可将 Azure 的强大功能(包括安全性、负载均衡、自动缩放和自动管理功能)添加到应用程序。 若要了解 Azure 应用服务如何增强应用程序工作负荷的可靠性与复原能力,请参阅 应用服务概述

部署 Azure 应用服务时,可以在 应用服务计划中预配多个实例,该计划表示运行应用程序代码的计算辅助角色。 有关详细信息,请参阅 Azure 应用服务计划 。 尽管平台努力跨不同的容错域部署实例,但它不会自动将实例分散到多个可用性区域。

生产部署建议

  • 使用高级 v3/v4 应用服务计划。

  • 启用区域冗余,这要求使用高级 v3、高级 v4 或独立 v2 应用服务计划,并且至少具有计划的三个实例。 若要查看详细信息,请确保选择此页面顶部的相应层。

启用区域冗余,这要求应用服务计划至少使用两个实例。

暂时性故障

暂时性故障是指组件发生短暂的间歇性故障。 这些故障经常出现在云之类的分布式环境中,在运营过程中比较常见。 经过短暂的时间后,它们就会自我纠正。 应用程序必须能够处理暂时性故障,处理方式通常是重试受影响的请求。

与任何云托管 API、数据库和其他组件通信时,所有云托管的应用程序都应遵循 Azure 暂时性故障处理指南。 有关详细信息,请参阅 有关处理暂时性故障的建议

Microsoft 提供的 SDK 通常处理暂时性故障。 由于你在 Azure 应用服务上托管了自己的应用程序,因此需要考虑如何避免引起暂时性故障,方法是确保:

  • 在计划中部署多个实例。 Azure 应用服务对计划中的实例执行自动更新和其他形式的维护。 如果某个实例变得运行不正常,服务可以自动将该实例替换为新的正常实例。 在替换过程中,可能会有一小段时间,之前的实例不可用,而新实例尚未准备好处理流量。 可以通过部署多个应用服务计划实例来缓解此行为的影响。

    在应用服务计划中启用区域冗余时,还可以提高应用服务平台推出的更新的复原能力。 更新域 由更新时脱机的虚拟机(VM)集合组成。 更新域与可用性区域关联。 在应用服务计划中部署多个实例,并为计划启用区域冗余会在升级期间增加额外的复原层(如果实例或区域不正常)。

  • 使用部署槽位。 Azure 应用服务部署槽位可实现应用程序的零停机部署。 使用部署槽位可最大程度减少部署和配置更改对用户的影响。 使用部署槽位还可以降低应用程序重启的可能性。 重启会导致暂时性故障。

  • 避免纵向扩展或缩减。 应选择满足典型负载下的性能要求的层级和实例大小。 仅横向扩展实例数量来处理流量变化。 纵向扩展或缩减可能触发应用程序重启。

可用性区域支持

可用性区域是每个 Azure 区域内在物理上独立的数据中心组。 当某个区域发生故障时,服务可以转移至剩余区域中的一个。

有关 Azure 中可用性区域的详细信息,请参阅什么是可用性区域?

Azure 应用服务可以配置为区域冗余,这意味着资源分散在多个可用性区域。 分散在多个区域中有助于生产工作负载实现复原能力和可靠性。 在应用服务计划上配置区域冗余时,使用该计划的所有应用都是区域冗余的。

使用区域冗余部署分布的实例使用以下规则确定。 即使在应用进行扩缩时,这些规则也适用:

  • 最小实例数: 应用服务计划必须至少有两个实例才能实现区域冗余。

  • 计划支持的最大可用性区域: Azure 确定计划可以使用的可用性区域数。 若要查看计划能够使用的可用性区域数,请参阅应用服务计划上的 maximumNumberOfZones 属性。 这是一个只读属性。 如果此值等于 1,则应用服务计划不支持区域冗余。 如果 maximumNumberOfZones 值大于 1,则可以为区域冗余配置应用服务计划。

    az appservice plan show -n <app-service-plan-name> -g <resource-group-name> --query properties.maximumNumberOfZones
    
  • 实例分布: 启用区域冗余后,计划实例会自动分布在多个可用性区域。 分发基于以下规则:

    • 如果指定容量(实例数)大于 maximumNumberOfZones 且实例数被 maximumNumberOfZones 分割,则实例均匀分布。
    • 所有剩余实例分布在剩余区域。
    • 当应用服务平台为区域冗余的应用服务计划分配实例时,它使用基础 Azure 虚拟机规模集提供的尽力区域均衡。 如果每个区域有相同数量的 VM,或者与其他所有区域的 VM 数量差异不超过一个 VM(即多一个或少一个),则应用服务计划是均衡的。 有关详细信息,请参阅区域均衡
  • 物理区域放置 可以查看用于每个应用服务计划实例 的物理可用性区域 。 使用 REST API,该 API 返回 physicalZone 每个实例的值。

    az rest --method get --url https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Web/sites/{appName}/instances?api-version=2024-04-01
    

对于未配置为区域冗余的应用服务计划,其基础虚拟机实例无法抵御可用性区域的故障。 在该地区的任何区域发生故障时,它们可能会经历停机。

支持的区域

区域冗余应用服务计划要求使用高级 v2 或 v3 层,并且可以部署在任何支持可用性区域的区域中。 若要查看详细信息,请确保选择此页面顶部的相应层。

区域冗余应用服务计划可以部署在支持可用性区域的任何地区

若要查看哪些区域支持适用于应用服务环境 v3 的可用性区域,请查看区域

要求

  • 必须使用 Premium v2、Premium v3 或独立 v2 计划类型

  • 可用性区域仅在较新的应用服务缩放单元上受支持。 即使使用的是某个受支持的区域,如果规模单元不支持可用性区域,则在创建区域冗余应用服务计划时会收到错误。

    您被分配到的缩放单元基于您部署应用服务计划的资源组。 若要确保工作负荷位于支持可用性区域的缩放单元上,可能需要创建新的资源组,然后在新的资源组中创建新的应用服务计划和应用服务应用。

    若要查看应用服务计划是否在支持可用性区域的层上,请检查该应用服务计划的属性。 如果该值大于 1,则您的标记支持分区,并可以在计划中启用区域冗余。 如果值等于 1,则缩放单元不支持可用性区域,并且需要部署一个新计划来启用区域冗余。

    az appservice plan show -n <app-service-plan-name> -g <resource-group-name> --query properties.maximumNumberOfZones
    
  • 必须在计划中部署至少两个实例。

注意事项

在可用性区域中断期间,即使应用程序继续为流量提供服务,Azure 应用服务的一些方面也可能会受到影响。 这些行为包括应用服务计划缩放、应用程序创建、应用程序配置和应用程序发布。

成本

使用应用服务高级 v2、高级 v3 或高级 v4 计划时,只要应用服务计划中有三个或更多实例,就不会产生与启用可用性区域相关的额外费用。 根据应用服务计划 SKU、指定的容量以及根据自动缩放条件缩放到的任何实例收费。

如果启用可用性区域但指定小于 2 的容量,则平台将强制实施最小实例计数 2。 平台会向你收取这两个实例的费用。

使用应用服务高级 v2 或高级 v3 计划时,只要在应用服务计划中有两个或更多实例,就无需额外的成本来启用可用性区域。 根据应用服务计划 SKU、指定的容量以及根据自动缩放条件缩放到的任何实例收费。

如果启用可用性区域但指定小于 2 的容量,则平台将强制实施最小实例计数 2。 平台会向你收取这两个实例的费用。

配置可用性区域支持

  • 创建具有区域冗余的新应用服务计划。 若要部署新的区域冗余 Azure 应用服务计划,必须使用 Premium v2 或 Premium v3 计划类型。 若要查看详细信息,请确保选择此页面顶部的相应层。
  • 创建具有区域冗余的新应用服务计划。 若要部署新的区域冗余应用服务计划,请在 Azure 门户中部署计划或将应用服务计划zoneRedundant属性设置为 true Azure CLI 命令、Azure PowerShell 命令、Bicep 文件或 Azure 资源管理器模板时选择区域冗余选项。

    az appservice plan create -g MyResourceGroup -n MyPlan --zone-redundant --number-of-workers 2 --sku P1V3
    

    注意

    如果使用 Azure CLI 修改 zone-redundant 属性,则必须指定 --number-of-workers 属性(即实例数),并使用大于或等于 2 的容量。

  • 迁移。 如果有支持区域冗余的现有应用服务计划(最大可用区域大于 1),可以通过将应用服务计划 zoneRedundant 的属性设置为 true Azure CLI、Bicep 文件或资源管理器模板来启用区域冗余:

    az appservice plan update -g <resource group name> -n <app service plan name> --set zoneRedundant=true sku.capacity=2
    

    注意

    如果使用 Azure CLI 修改 zoneRedundant 属性,则必须指定 sku.capacity 属性(即实例数),并使用大于或等于 2 的容量。

    如果您使用的计划或订阅不支持可用性区域,则必须在新的资源组中创建一个新的应用服务计划,以便使用支持区域的应用服务基础设施。

    注意

    更改应用服务计划的区域冗余状态几乎是即时的。 在此过程中,你不会遇到停机或性能问题。

  • 禁用区域冗余。 若要禁用区域冗余,可以将应用服务计划 zoneRedundant 属性 false 设置为或使用 Azure CLI。

    az appservice plan update -g <resource group name> -n <app service plan name> --set zoneRedundant=false sku.capacity=1
    

    注意

    如果使用 Azure CLI 禁用 zoneRedundant 该属性,则应指定 sku.capacity 该属性,否则该值默认值为 1。

  • 创建具有区域冗余的新应用服务计划。 要部署新的区域冗余 Azure 应用服务环境,请参阅创建应用服务环境

    若要在现有应用服务环境中创建新的区域冗余应用服务计划,请执行以下作:

    1. 确保应用服务环境已启用区域冗余。 仅当应用服务环境为区域冗余时,才能在独立 v2 应用服务计划中启用区域冗余。
    2. 在 Azure 门户中部署计划时选择 区域冗余 选项,或在 Azure CLI 命令、Azure PowerShell 命令、Bicep 文件或 Azure 资源管理器模板中将应用服务计划 zoneRedundant 的属性设置为 true 该选项。
    az appservice plan create -g MyResourceGroup -n MyPlan --app-service-environment MyAse --zone-redundant --number-of-workers 2 --sku I1V2
    

    注意

    如果使用 Azure CLI 修改 zoneRedundant 属性,则必须指定 number-of-workers 属性(即实例数),并使用大于或等于 2 的容量。

  • 迁移。 如果有支持区域冗余的现有应用服务环境或独立 v2 应用服务计划,可以随时启用区域冗余。

    若要为应用服务环境启用区域冗余,请将 zoneRedundant 属性 true 设置为或使用 Azure CLI。

    az resource update --ids /subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Web/hostingEnvironments/{aseName} --set properties.zoneRedundant=true
    

    注意

    更改应用服务环境的区域冗余状态时,会启动需要 12-24 小时的升级才能完成。 在升级过程中,不会遇到任何停机或性能问题。

    对于独立 v2 应用服务计划,如果应用服务环境是区域冗余的,则可以将应用服务计划设为区域冗余。 每个应用服务计划都有自己的独立区域冗余设置,这意味着可以在应用服务环境中混合使用区域冗余和非区域冗余计划。 若要在独立 v2 应用服务计划中启用区域冗余,请将应用服务计划 zoneRedundant 的属性设置为 true 或使用 Azure CLI。

    az appservice plan update -g <resource group name> -n <app service plan name> --set zoneRedundant=true sku.capacity=2
    

    注意

    如果使用 Azure CLI 修改 zoneRedundant 属性,则必须指定 sku.capacity 属性(即实例数),并使用大于或等于 2 的容量。

  • 禁用区域冗余。 若要禁用区域冗余,可以将应用服务计划或应用服务环境 zoneRedundant 属性设置为 false 或使用 Azure CLI。

    az resource update --ids /subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Web/hostingEnvironments/{aseName} --set properties.zoneRedundant=false
    
    az appservice plan update -g <resource group name> -n <app service plan name> --set zoneRedundant=false sku.capacity=1
    

    注意

    如果使用 Azure CLI 禁用 zoneRedundant 该属性,则应指定 sku.capacity 该属性,否则该值默认值为 1。

容量计划和缩放

为应对可用区故障,请考虑超量配置应用服务计划的容量。 超额预配使解决方案能够容忍一定程度的容量损失,并且仍然可以继续运行而不会降低性能。 要了解有关过度预配的更多信息,请参阅通过过度预配管理容量

常规操作

本部分介绍在配置 Azure 应用服务计划以实现区域冗余且所有可用性区域正常运行时,您可以预期的情况。

  • 区域之间的流量路由:正常操作期间,流量会在所有可用性区域的所有可用应用服务计划实例之间进行路由

  • 区域之间的数据复制: 在正常作期间,应用程序文件系统中存储的任何状态都存储在区域冗余存储中,并在可用性区域之间同步复制。

区域关闭体验

本部分介绍了在为 Azure 应用服务计划配置区域冗余且发生可用性区域中断时所要预期的情况:

  • 检测和响应:应用服务平台负责检测可用性区域中的故障并做出响应。 无需执行任何操作即可启动区域故障转移。

  • 活动请求: 当可用性区域不可用时,连接到故障可用性区域中的应用服务计划实例的任何正在进行的请求将终止。 它们需要被重试。

  • 流量重新路由:某个区域不可用时,Azure 应用服务会检测该区域中丢失的实例。 它会自动尝试查找新的替换实例。 然后,它会根据需要将流量分散到新实例。

    如果配置了自动缩放,并且如果确定需要更多实例,则自动缩放还会向应用服务发出添加更多实例的请求。 有关详细信息,请参阅在 Azure 应用服务中纵向扩展应用

    注意

    自动缩放行为与应用服务平台行为无关。 自动缩放实例计数规范不需要是三的倍数。

    重要

    在区域宕机情况下,无法保证请求增加实例的操作能够成功。 系统会尽最大努力对丢失的实例进行回填。 如果需要在可用性区域丢失时保证容量,则应创建并配置应用服务计划以应对丢失区域的情况。 为此,可以超量预配应用服务计划的容量

  • 非运行时间行为: 部署在区域冗余应用服务计划中的应用程序将继续运行并提供流量,即使可用性区域遇到服务中断也是如此。 但是,在可用性区域中断期间,非运行时间行为可能会受到影响。 这些行为包括应用服务计划缩放、应用程序创建、应用程序配置和应用程序发布。

故障回复

当可用性区域恢复时,Azure 应用服务会自动在恢复的可用性区域中创建实例,移除在其他可用性区域中创建的任何临时实例,并在实例之间正常路由流量。

对区域故障进行测试

Azure 应用服务平台管理区域冗余应用服务计划的流量路由、故障转移和故障恢复。 由于此功能是完全托管的,因此你无需启动或验证可用性区域故障流程。

多区域支持

Azure 应用服务是单地区服务。 如果该地区不可用,应用程序也会不可用。

替代多区域解决方案

为了确保应用程序不易受单一区域故障的影响,需要将应用程序部署到多个区域:

  • 将您的应用程序部署到每个区域的实例。
  • 配置负载均衡和故障转移策略。
  • 跨地区复制数据,以便可以恢复最近的应用程序状态。

有关说明此体系结构的示例方法,请参阅使用应用服务环境进行高可用性企业部署

备份

使用基本层级或更高层级时,可以使用应用服务备份和还原功能将应用服务应用备份到文件。 有关详细信息,请参阅在 Azure 应用服务中备份和还原应用

如果很难重新部署代码,或者将状态存储在磁盘上,则此功能非常有用。 对于大多数解决方案,不应依赖应用服务备份。 请使用本文中所述的其他方法来支持复原要求。

服务级别协议 (SLA)

Azure 应用服务的服务级别协议 (SLA) 描述了服务的预期可用性。 它还描述了实现可用性预期必须满足的条件。 若要了解这些条件,请查看联机服务的服务级别协议 (SLA)

部署区域冗余应用服务计划时,SLA 中定义的运行时间百分比会增加。