本文介绍 Azure 应用服务的可靠性支持,包括通过 可用性区域 和 多区域部署实现区域内复原能力。
可靠性是你和Microsoft之间的共同责任。 可以使用本指南确定哪些可靠性选项满足特定业务目标和运行时间目标。
应用服务是一种基于 HTTP 的服务,用于托管 Web 应用程序、REST API 和移动后端。 应用服务与 Azure 集成,为应用程序提供安全性、负载均衡、自动缩放和自动化管理。 若要了解应用服务如何增强应用程序工作负荷的可靠性和复原能力,请参阅 应用服务概述。
部署应用服务时,可以在 应用服务计划中预配多个实例。 此方案代表运行应用程序代码的计算工作者。 该平台努力跨不同的容错域部署实例,但它不会自动跨可用性区域分配实例。
生产部署建议
启用区域冗余,这要求应用服务计划至少使用两个实例。
暂时性故障
暂时性故障是指组件发生短暂的间歇性故障。 这些故障经常出现在云之类的分布式环境中,在运营过程中比较常见。 暂时性故障在短时间内自行纠正。 应用程序必须能够处理暂时性故障,处理方式通常是重试受影响的请求。
与任何云托管的 API、数据库和其他组件通信时,所有云托管的应用程序都应遵循 Azure 暂时性故障处理指南。 有关详细信息,请参阅有关处理暂时性故障的建议。
Microsoft 提供的 SDK 通常处理暂时性故障。 由于在应用服务上托管自己的应用程序,请考虑如何避免导致暂时性故障:
在计划中部署多个实例。 应用服务对计划中的实例执行自动更新和其他形式的维护。 如果某个实例变得运行不正常,服务可以自动将该实例替换为新的正常实例。 在替换过程中,可能会有一段短时间,上一个实例不可用,而新实例尚未准备好处理流量。 可以通过部署应用服务计划的多个实例来缓解这些影响。
使用部署槽位。 应用服务 部署槽位 可实现应用程序的零停机时间部署。 使用部署槽位最大程度地减少对用户的部署和配置更改的影响。 部署槽位也会降低应用程序重启的可能性。 重启应用程序会导致暂时性故障。
避免纵向扩展或纵向缩减。 纵向扩展和缩减需要更改分配给每个实例的 CPU、内存和其他资源。 横向扩展和纵向缩减作业可以触发应用程序重启。 选择满足典型负载下性能要求的层和实例大小,而不是纵向扩展或缩减。 可以通过动态添加和删除实例来处理流量变化,实现扩展和缩减。
可用性区域支持
可用性区域 是每个 Azure 区域内物理上独立的数据中心群组。 当某个区域发生故障时,服务可以转移至剩余区域中的一个。
可将应用服务配置为 区域冗余,这意味着资源分布在多个可用性区域。 跨多个区域分布有助于生产工作负载实现复原能力和可靠性。 在应用服务计划上配置区域冗余时,使用该计划的所有应用都是区域冗余的。
区域冗余部署中的实例分发遵循特定规则。 随着应用的缩小和扩展,这些规则始终适用。有关详细信息,请参阅 注意事项。
区域支持
区域冗余应用服务计划可以部署在支持可用性区域的任何地区。
若要查看哪些区域支持适用于应用服务环境 v3 的可用性区域,请查看区域。
要求
必须使用高级版 v2-4 计划类型。 若要查看详细信息,请确保在此页顶部选择适当的层。
你必须使用Premium v2-4 或 Isolated v2 计划类型,并确保计划至少有两个实例。
可用性区域仅在较新的应用服务缩放单元上受支持。 即使使用其中一个受支持的区域,如果所使用的缩放单元不支持可用性区域,则创建区域冗余应用服务计划时会收到错误。
向你分配的缩放单元基于你部署应用服务计划的资源组。 若要确保工作负荷位于支持可用性区域的缩放单元上,可能需要创建新的资源组,并在新的资源组中创建新的应用服务计划和应用服务应用。
若要查看应用服务计划是否在支持可用性区域的层上,请检查该应用服务计划的属性。 如果该值大于 1,则您的标记支持分区,并可以在计划中启用区域冗余。 如果值等于 1,则缩放单元不支持可用性区域,并且需要部署一个新计划来启用区域冗余。
az appservice plan show -n <app-service-plan-name> -g <resource-group-name> --query properties.maximumNumberOfZones
必须在计划中部署至少两个实例。
注意事项
在可用性区域中断期间,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
对于未配置为区域冗余的应用服务计划,基础 VM 实例不具备抗故障能力,无法应对可用性区域的故障。 在该地区的任何区域发生故障时,它们可能会经历停机。
成本
使用应用服务高级 v2-v4 计划时,只要在应用服务计划中有两个或更多实例,就无需额外的成本来启用可用性区域。 根据应用服务计划 SKU、指定的容量以及根据自动缩放条件缩放到的任何实例向你收费。
如果启用可用性区域但指定容量小于 2,则平台将强制实施最小实例计数 2。 平台会向你收取这两个实例的费用。
使用应用服务独立 v2 计划时,只要在应用服务计划中有两个或更多实例,就不会产生与启用可用性区域相关的额外费用。 根据应用服务计划 SKU、指定的容量以及根据自动缩放条件缩放到的任何实例向你收费。
如果启用可用性区域但指定容量小于 2,则平台将强制实施最小实例计数 2。 平台会向你收取这两个实例的费用。
配置可用性区域支持
若要部署新的区域冗余应用服务计划,必须使用 Premium v2-4 计划类型。 若要查看详细信息,请确保在此页顶部选择适当的层。
创建具有区域冗余的新应用服务计划。 若要部署新的区域冗余应用服务计划,请在 Azure 门户中部署计划或将应用服务计划属性设置为
zoneRedundant
Azure CLI 命令、Azure PowerShell 命令、Bicep 文件或 Azure 资源管理器模板时选择true
选项:将现有应用服务计划迁移到区域冗余。 如果有支持区域冗余的现有应用服务计划(最大可用区域大于 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 门户中创建应用服务计划,请选择 “区域冗余”。 若要使用 Azure CLI 命令、Azure PowerShell 命令、Bicep 文件或资源管理器模板创建计划,请将应用服务计划
zoneRedundant
属性设置为true
,如以下示例代码所示:
将现有应用服务计划迁移到区域冗余 如果有支持区域冗余的现有应用服务环境或独立 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。禁用区域冗余。 若要禁用区域冗余,可以将应用服务计划或应用服务环境
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 应用服务执行常规服务升级,以及其他形式的维护。 为了确保在升级期间提供预期的容量,平台会在升级过程中自动添加应用服务计划的额外实例。
启用区域冗余。 在应用服务计划中启用区域冗余时,还可以提高应用服务平台推出的更新的复原能力。 更新域 由更新时脱机的虚拟机(VM)集合组成。 更新域与可用性区域关联。 在应用服务计划中部署多个实例,并为计划启用区域冗余会在升级期间增加额外的复原层(如果实例或区域不正常)。
若要了解详细信息,请参阅 Azure 应用服务的例行计划内维护。
自定义升级周期。 可以自定义应用服务环境的升级周期。 如果需要验证升级对工作负荷的影响,请考虑启用手动升级,以便在更改推出到生产实例之前对非生产实例执行验证和测试。
若要了解有关维护首选项的详细信息,请参阅 应用服务环境计划内维护的升级首选项。
服务级别协议 (SLA)
应用服务的服务级别协议(SLA)描述了服务的预期可用性以及实现该可用性预期必须满足的条件。 有关详细信息,请参阅联机服务的服务级别协议 (SLA)。
部署区域冗余应用服务计划时,SLA 中定义的运行时间百分比会增加。