创建使用可用性区域的虚拟机规模集

Azure 可用性区域是 Azure 区域内的故障隔离位置,提供冗余电力、冷却系统和网络。 借助它们,可以运行具有高可用性和容错能力的应用程序,以应对数据中心故障。 支持可用性区域的 Azure 区域至少有三个单独的区域。 每个可用性区域由一个或多个数据中心组成,它们配备了独立的基础设施电源、网络和冷却系统。 可用性区域采用高性能网络进行连接,往返延迟小于 2 毫秒。 有关详细信息,请参阅可用性区域概述

若要防止虚拟机规模集发生数据中心级故障,可以跨可用性区域创建规模集。 若要使用可用性区域,必须在受支持的 Azure 区域中创建规模集。

可用性区域的设计注意事项

虚拟机规模集支持三种区域性部署模型:

  • 区域冗余或区域跨越(推荐)
  • 区域或区域对齐(单一区域)
  • Regional

区域冗余或区域跨越

区域冗余或区域跨越规模集跨所有选定区域 "zones": ["1","2","3"] 分布实例。 默认情况下,规模集会尽力将实例均匀分布到所选区域。 但是,你可以通过在部署中设置 "zoneBalance": "true" 来指定严格的区域均衡。 每个 VM 及其磁盘都是区域性的,因此它们会固定到特定区域。 区域之间的实例通过低延迟高性能的网络进行连接。 如果发生区域性中断或连接问题,与受影响区域中实例的连接可能会受到影响,而其他可用性区域中的实例应不受影响。 可以在区域性中断期间向规模集添加容量,然后规模集会将更多实例添加到不受影响的区域。 还原区域后,可能需要将规模集纵向缩减到原始容量。 最佳做法是基于 CPU 或内存使用情况配置自动缩放规则。 借助自动缩放规则,规模集能够通过在其余可操作区域中横向扩展新实例,来应对该区域中的 VM 实例损失。

跨可用性区域分布实例符合跨可用性区域分布的实例的 99.99% SLA,建议用于 Azure 中的大多数工作负载。

区域或区域对齐(单一区域)

区域或区域对齐的规模集将实例放置在单一可用性区域 "zones": ['1'] 中。 每个 VM 及其磁盘都是区域性的,因此它们会固定到特定区域。 此配置主要用在需要降低实例之间的延迟时。

Regional

Azure 区域虚拟机规模集是未显式设置区域分配("zones"=[]"zones"=null)时。 在此配置中,规模集会创建 Azure 区域(非区域固定)实例,并在整个 Azure 区域中隐式放置实例。 无法保证跨区域均衡或分布,也无法保证实例位于同一可用性区域中。 磁盘并置在超级和高级 v2 磁盘中可以保证,高级 V1 磁盘尽最大努力,标准 SKU(SSD 或 HDD)磁盘不保证。

在罕见的完全区域性中断时,规模集中的任何或所有实例都可能受到影响。

容错域和可用性区域

容错域是可用性区域或硬件节点的数据中心内的故障隔离组,它们共享相同电源、网络、冷却系统和平台维护计划。 位于不同容错域中的 VM 实例不太可能受到同一计划内或计划外中断的影响。 可以指定实例如何在 Azure 区域或区域中的容错域之间分布。

  • 最大分布 (platformFaultDomainCount = 1)
  • 静态固定分布 (platformFaultDomainCount = 5)
  • 与存储磁盘容错域一致的分布(platformFaultDomainCount = 2 或 3,仅限 Azure 区域部署)

使用“最大分布”时,规模集会在每个区域中将 VM 分布到尽可能多的容错域。 这种分布可能会在每个区域中横跨五个以上或五个以下的容错域。 使用静态固定分布时,规模集会在每个区域中将 VM 分布到刚好 5 个容错域中。 如果规模集在每个区域中找不到 5 个不同的容错域来满足分配请求,则请求会失败。

建议对大多数工作负荷使用“最大分布”进行部署,因为此方法可在大多数情况下提供最佳分布。 如果需要将副本跨不同的硬件隔离单元进行分布,建议先跨可用性区域进行分布,然后在每个区域中使用“最大分布”。

注意

使用“最大分布”时,无论 VM 实际分布到多少个容错域,在规模集 VM 实例视图和实例元数据中都只能看到一个容错域。 每个区域中的分布是隐式的。

放置组

重要

放置组仅适用于在统一业务流程模式下运行的虚拟机规模集。

部署规模集时,可以为每个可用性区域部署单个放置组或为每个区域部署多个放置组。 对于地理区域(非逻辑区域)规模集,可选择在地理区域中包含单个放置组或多个放置组。 如果将名为 singlePlacementGroup 的规模集属性设置为 false,则该规模集可以由多个放置组组成,其范围为 0-1,000 台 VM。 设置为默认值 true 时,规模集由单个放置组组成,其范围为 0-100 台 VM。 对于大多数工作负荷,建议使用多个放置组,这样可以增大规模。 在 API 版本 2017-12-01 中,单区域和跨区域规模集默认为多个放置组,但地理区域(非逻辑区域)规模集则默认为单个放置组。

注意

如果使用“最大分布”,则必须使用多个放置组。

区域均衡

最后,对于跨多个区域部署的规模集,还可以选择“尽力区域均衡”或“严格区域均衡”。如果每个区域与规模集所有其他区域有着相同数量的 VM +\- 1 VM,则规模集被视为“均衡”。 例如:

  • 某个规模集的区域 1 中有 2 个 VM,区域 2 中有 3 个 VM,区域 3 中有 3 个 VM,则可以认为该规模集已实现均衡。 只有一个区域具有不同的 VM 计数,它只比其他区域少 1 个 VM。
  • 某个规模集的区域 1 中有 1 个 VM,区域 2 中有 3 个 VM,区域 3 中有 3 个 VM,则可以认为该规模集未实现均衡。 区域 1 比区域 2 和区域 3 少 2 个 VM。

一个可能的情况是,规模集中的 VM 已成功创建,但这些 VM 的扩展部署失败。 在确定某个规模集是否已实现均衡时,这些 VM 虽然扩展失败,但仍计在内。 例如,如果某个规模集的区域 1 中有 3 个 VM,区域 2 中有 3 个 VM,区域 3 中有 3 个 VM,则可以认为该规模集已实现均衡,即使区域 1 中的所有扩展都失败而区域 2 和 3 中的所有扩展都成功。

使用“尽量实现区域均衡”时,规模集会在维持均衡时尝试进行横向收缩和扩展。 但是,如果由于某种原因无法实现区域均衡(例如,如果一个区域出现故障,规模集无法在该区域中创建新的 VM),则规模集会允许临时的不均衡,以成功地横向缩减或扩展。在随后的横向扩展尝试中,规模集会将 VM 添加到需要更多 VM 的区域中以使规模集达到均衡。 同样,在后续的横向收缩尝试中,规模集会在需要减少 VM 才能实现规模集均衡的区域中删除 VM。 使用“严格执行区域均衡”时,如果在进行横向收缩或扩展尝试时会导致不均衡,规模集会放弃这样的尝试。

要使用“尽量实现区域均衡”,请将“zoneBalance”设置为 false。 此设置是 API 版本 2017-12-01 中的默认设置。 要使用“严格执行区域均衡”,请将“zoneBalance”设置为 true

注意

只有当规模集的区域属性包含多个区域时,才能设置 zoneBalance 属性。 如果没有指定区域或仅指定了一个区域,则不应设置 zoneBalance 属性。

创建区域跨越或区域规模集

部署虚拟机规模集时,可选择在区域中使用单个可用性区域或多个区域。

可以使用下列方法之一创建使用可用性区域的规模集:

使用 Azure 门户

创建使用可用性区域的规模集的过程与入门文章中详述的过程相同。 选择受支持的 Azure 区域时,可在一个或多个可用性区域中创建规模集,如下面的示例所示:

在单个可用性区域中创建规模集

将在你指定的单个区域中创建规模集和支持资源,例如 Azure 负载均衡器和公共 IP 地址。

使用 Azure CLI

创建使用可用性区域的规模集的过程与入门文章中详述的过程相同。 若要使用可用性区域,必须在受支持的 Azure 区域中创建规模集。

az vmss create 命令中添加 --zones 参数并指定要使用的区域(例如区域 123)。

az vmss create \
    --resource-group myResourceGroup \
    --name myScaleSet \
    --image <SKU Image> \
    --upgrade-policy-mode automatic \
    --admin-username azureuser \
    --generate-ssh-keys \
    --zones 1 2 3

在指定的区域中创建和配置所有规模集资源和 VM 需要几分钟时间。 有关区域冗余规模集和网络资源的完整示例,请参阅此示例 CLI 脚本

使用 Azure PowerShell

若要使用可用性区域,必须在受支持的 Azure 区域中创建规模集。 向 New-AzVmssConfig 命令添加 -Zone 参数并指定要使用的区域(例如区域 123)。

New-AzVmss `
  -ResourceGroupName "myResourceGroup" `
  -Location "chinanorth2" `
  -VMScaleSetName "myScaleSet" `
  -VirtualNetworkName "myVnet" `
  -SubnetName "mySubnet" `
  -PublicIpAddressName "myPublicIPAddress" `
  -LoadBalancerName "myLoadBalancer" `
  -UpgradePolicy "Automatic" `
  -Zone "1", "2", "3"

使用 Azure 资源管理器模板

创建使用可用性区域的规模集的过程与适用于 LinuxWindows 的入门文章中详述的过程相同。

{
  "type": "Microsoft.Compute/virtualMachineScaleSets",
  "name": "myScaleSet",
  "location": "China North 2",
  "apiVersion": "2017-12-01",
  "zones": [
        "1",
        "2",
        "3"
      ]
}

如果创建公共 IP 地址或负载均衡器,请指定 "sku": {"name":"Standard"} 属性以创建区域冗余网络资源。 还需要创建网络安全组和规则以允许任意流量。 有关详细信息,请参阅 Azure 负载均衡器标准概述标准负载均衡器和可用性区域

有关区域冗余规模集和网络资源的完整示例,请参阅示例资源管理器模板

更新规模集以添加可用性区域

可以修改规模以扩展用于分布 VM 实例的区域集。 通过扩展,可以利用更高的区域可用性 SLA (99.99%),相比于 Azure 区域可用性 SLA (99.95%)。 或者扩展规模集以利用创建规模集时不可用的新可用性区域。

重要

更新虚拟机规模集以添加可用性区域的功能目前处于预览状态。 需同意补充使用条款才可使用预览版。 在正式版 (GA) 推出之前,此功能的某些方面可能会有所更改。

重要

此预览版适用于虚拟机规模集上的无状态工作负载。 区域扩展不支持具有有状态工作负载的规模集,也不支持与 Service Fabric 或 Azure Kubernetes 服务一起使用的规模集

此功能可用于 API 版本 2023-03-01 或更高版本。

使订阅能够使用区域扩展功能

必须在订阅上注册四个功能标志:

az feature register --namespace Microsoft.Compute --name VmssAllowRegionalToZonalMigration
az feature register --namespace Microsoft.Compute --name VmssAllowExpansionOfAvailabilityZones
az feature register --namespace Microsoft.Compute --name VmssFlexAllowExpansionOfAvailabilityZones
az feature register --namespace Microsoft.Compute --name VmssFlexAllowRegionalToZonalMigration

可以使用以下方法检查每项功能的注册状态:

az feature show --namespace Microsoft.Compute --name \<feature-name\>

扩展规模集以使用可用性区域

可以更新规模集,以将实例横向扩展到一个或多个其他可用性区域,上限为该 Azure 区域支持的可用性区域数。 对于支持区域的 Azure 区域,最小区域数为 3。

重要

将规模集扩展到其他区域时,原始实例不会迁移或更改。 横向扩展时,将创建新实例并在所选可用性区域中均匀分布。 横向缩减规模集时,将优先移除任何 Azure 区域实例。 之后,将根据横向缩减策略移除实例。

可通过 3 个步骤扩展到区域规模集:

  1. 准备区域扩展
  2. 在规模集上更新区域参数
  3. 添加新的区域实例并移除原始实例

准备区域扩展

警告

此预览版允许向规模集添加区域。 添加 Azure 区域规模集或移除区域后,无法再返回到它们。

为了准备区域扩展:

  • 检查你是否有足够的配额给到所选 Azure 区域中的 VM 大小以处理更多实例。
  • 检查你在使用的 VM 大小和磁盘类型是否在所有所需区域中可用。 可以使用计算资源 SKU API 来确定哪些大小在哪些区域中可用
  • 验证规模集配置是否对区域规模集有效:
    • platformFaultDomainCount 必须设置为 1 或 5。 修复了区域部署不支持在 2 或 3 个容错域中分布的问题。
    • 区域扩展期间不支持产能预留。 规模集完全区域化(不再有 Azure 区域实例)后,可以将产能预留组添加到规模集。
    • 不支持 Azure 专用主机部署。

更新规模集上的区域参数

更新规模集以更改区域参数。

  1. 导航到要更新的规模集
  2. 在规模集登陆页的“属性”选项卡上,找到“可用性区域”属性,然后按“编辑
  3. 在“编辑位置”对话框中,选择所需的区域
  4. 选择“应用”

添加新的区域实例并移除原始实例

手动横向扩展和缩减

更新规模集的容量以添加更多实例。 新容量应设置为原始容量加上新实例数。 例如,如果你的规模集有 5 个 Azure 区域实例,并且你想要横向扩展,以便在 3 个区域的每个中有 3 个实例,则应将容量设置为 14。

可以在同一 ARM 模板或 REST API 调用中更新区域参数和规模集容量。

如果确信新实例已准备就绪,请横向缩减规模集以移除原始 Azure 区域实例。 可以手动删除特定的 Azure 区域实例,也可以通过减少规模集容量来横向缩减。 通过减少规模集容量进行横向缩减时,平台将始终倾向于移除 Azure 区域实例,然后遵循横向缩减策略。

预览已知问题和限制

  • 预览版面向虚拟机规模集上的无状态工作负载。

  • 不支持运行 Service Fabric 或 Azure Kubernetes 服务的规模集。

  • 无法移除或替换区域,只能添加区域

  • 无法从区域跨越或区域规模集更新到 Azure 区域规模集。

  • platformFaultDomainCount 必须设置为 1 或 5。 修复了区域部署不支持在 2 或 3 个容错域中分布的问题。

  • 区域扩展期间不支持产能预留。 规模集完全区域化(不再有 Azure 区域实例)后,可以将产能预留组添加到规模集。

  • 不支持 Azure 专用主机部署

后续步骤

现在,你已在可用性区域中创建了规模集,接下来可以了解如何在虚拟机规模集上部署应用程序对虚拟机规模集使用自动缩放