虚拟机规模集的可靠性
本文包含特定的可靠性建议和有关可用性区域对虚拟机规模集支持的信息。
注意
虚拟机规模集只能部署到一个区域中。 如果要跨多个区域部署 VM,请参阅虚拟机 - 灾难恢复:跨区域故障转移。
有关 Azure 可靠性的体系结构概述,请参阅《Azure 可靠性》。
可靠性建议
本部分包含针对实现复原能力和可用性的建议。 每个建议可归入以下两个类别之一:
运行状况项涵盖配置项目和构成 Azure 工作负载的主要组件的正确功能等方面,例如 Azure 资源配置设置、对其他服务的依赖项等。
风险项涵盖可用性和恢复要求、测试、监视、部署和其他项目(如果未解决,则会增加环境中出现问题的可能性)等方面。
可靠性建议优先级矩阵
每项建议都根据以下优先级矩阵进行标记:
映像 | 优先级 | 说明 |
---|---|---|
高 | 需要立即修复。 | |
中 | 在 3-6 个月内修复。 | |
低 | 需要审查。 |
可靠性建议摘要
高可用性
启用自动修复策略
若要实现应用程序的高可用性,请启用自动实例修复 以维护一组正常的 VM。 当应用程序运行状况扩展或负载均衡器运行状况探测发现实例不正常时,自动实例修复会删除不正常的实例,并创建一个新实例来替换它。
可以使用属性“automaticRepairsPolicy.gracePeriod
”设置宽限期。 宽限期以分钟和 ISO 8601 格式指定,范围为 10 到 90 分钟,默认值为 30 分钟。
// Azure Resource Graph Query
// Find VMSS instances associated with autoscale settings when autoscale is disabled
resources
| where type == "microsoft.compute/virtualmachinescalesets"
| project name, id, tags
| join kind=leftouter (
resources
| where type == "microsoft.insights/autoscalesettings"
| where tostring(properties.targetResourceUri) contains "Microsoft.Compute/virtualMachineScaleSets"
| project id = tostring(properties.targetResourceUri), autoscalesettings = properties
) on id
| where isnull(autoscalesettings) or autoscalesettings.enabled == "false"
| project recommendationId = "vmss-4", name, id, tags, param1 = "autoscalesettings: Disabled"
| order by id asc
使用虚拟机规模集 Flex 跨可用性区域部署虚拟机规模集
创建虚拟机规模集时,请使用可用性区域来保护应用程序和数据免受数据中心故障(虽然不太可能出现)的影响。 有关详细信息,请参阅可用性区域支持。
// Azure Resource Graph Query
// Find VMSS instances with one or no Zones selected
resources
| where type == "microsoft.compute/virtualmachinescalesets"
| where array_length(zones) <= 1 or isnull(zones)
| project recommendationId = "vmss-8", name, id, tags, param1 = "AvailabilityZones: Single Zone"
| order by id asc
伸缩性
使用灵活的业务流程模式部署 VM
所有虚拟机(包括单实例虚拟机)都应使用灵活的业务流程模式部署到规模集中,以便使应用程序面向未来的缩放和可用性功能。 灵活业务流程将虚拟机分散到某个地理区域或可用性区域的多个容错域中,从而提供高可用性保证(最多支持 1000 个虚拟机)。
有关如何正确使用规模集的详细信息,请参阅何时使用虚拟机规模集而不是虚拟机
// Azure Resource Graph Query
// Find all zonal VMs that are NOT deployed with Flex orchestration mode
resources
| where type == "microsoft.compute/virtualmachinescalesets"
| where properties.orchestrationMode != "Flexible"
| project recommendationId = "vmss-1", name, id, tags, param1 = strcat("orchestrationMode: ", tostring(properties.orchestrationMode))
将虚拟机规模集自动缩放配置为自动
自动缩放是 Azure Monitor 的内置功能,可根据需要添加和删除规模集虚拟机,从而帮助提高资源的性能和成本效益。 此外,可以选择手动将资源缩放到特定的实例计数或根据指标阈值缩放。 还可以计划在指定时段内缩放的实例计数。
若要了解如何启用自动 OS 映像升级,请参阅 Azure 虚拟机规模集自动 OS 映像升级。
// Azure Resource Graph Query
// Find VMSS instances associated with autoscale settings when predictiveAutoscalePolicy_scaleMode is disabled
resources
| where type == "microsoft.compute/virtualmachinescalesets"
| project name, id, tags
| join kind=leftouter (
resources
| where type == "microsoft.insights/autoscalesettings"
| where tostring(properties.targetResourceUri) contains "Microsoft.Compute/virtualMachineScaleSets"
| project id = tostring(properties.targetResourceUri), autoscalesettings = properties
) on id
| where autoscalesettings.enabled == "true" and autoscalesettings.predictiveAutoscalePolicy.scaleMode == "Disabled"
| project recommendationId = "vmss-5", name, id, tags, param1 = "predictiveAutoscalePolicy_scaleMode: Disabled"
| order by id asc
将虚拟机规模集自定义横向缩减策略设置为默认值
虚拟机规模集自定义横向缩减策略功能提供了一种方法来配置虚拟机的横向缩减顺序。 有三种横向缩减策略配置:
可根据一系列指标(包括平台指标和用户定义的自定义指标)横向扩展或缩减虚拟机规模集部署。 随着规模集工作负载的变化,横向扩展会根据规模集模型创建新的虚拟机,而横向缩减会影响正在运行的采用不同配置和/或功能的虚拟机。
如果只想遵循默认顺序,则不必指定横向缩减策略,因为默认的自定义横向缩减策略为大多数方案提供了最佳算法和灵活性。 默认顺序如下:
- 跨可用性区域均衡虚拟机(如果规模集部署包含可用性区域支持)。
- 跨容错域均衡虚拟机(尽力而为)。
- 删除实例 ID 最大的虚拟机。
仅当工作负载要求在跨可用性区域均衡后删除最早或最新的虚拟机时,才使用最新和最早的策略。
注意
跨可用性区域或容错域的均衡不会在可用性区域或容错域之间移动虚拟机。 均衡的实现方式是删除不平衡的可用性区域或容错域中的虚拟机,直到虚拟机的分布变得均衡。
// Azure Resource Graph Query
// Find VMSS instances where strictly zoneBalance is set to True
resources
| where type == "microsoft.compute/virtualmachinescalesets"
| where properties.orchestrationMode == "Uniform" and properties.zoneBalance == true
| project recommendationId = "vmss-6", name, id, tags, param1 = "strictly zoneBalance: Enabled"
| order by id asc
灾难恢复
为所有虚拟机规模集虚拟机启用保护策略
如果希望特定虚拟机的处理方式不同于规模集实例的其余部分,请使用虚拟机规模集保护策略。
当应用程序处理流量时,有时可能需要对特定虚拟机进行不同于其他规模集实例的处理。 例如,规模集中的某些 VM 可能正在执行长时间运行的操作,需要在这些操作完成后再横向缩减这些 VM。 还可能需要让规模集中的一些虚拟机专门执行不同于规模集的其他成员的任务。 这些特殊的虚拟机不能与规模集中的其他虚拟机一起修改。 实例保护提供的额外的控制功能可以为应用程序实现这些方案和其他方案。
// Azure Resource Graph Query
// Find all VMs that do NOT have health monitoring enabled
resources
| where type == "microsoft.compute/virtualmachinescalesets"
| join kind=leftouter (
resources
| where type == "microsoft.compute/virtualmachinescalesets"
| mv-expand extension=properties.virtualMachineProfile.extensionProfile.extensions
| where extension.properties.type in ( "ApplicationHealthWindows", "ApplicationHealthLinux" )
| project id
) on id
| where id1 == ""
| project recommendationId = "vmss-2", name, id, tags, param1 = "extension: null"
监视
启用虚拟机规模集应用程序运行状况监视
监视应用程序的运行状况是管理和升级部署的重要信号。 Azure 虚拟机规模集支持滚动升级,包括:
- 自动 OS 映像升级
- 自动虚拟机来宾修补,它依赖于单个虚拟机的运行状况监视来升级部署。
- 负载均衡器运行状况探测或应用程序运行状况扩展,它们都会监视规模集中每个 VM 的应用程序运行状况,并使用自动实例修复执行实例修复。
// Azure Resource Graph Query
// Find all VMs that do NOT have automatic repair policy enabled
resources
| where type == "microsoft.compute/virtualmachinescalesets"
| where properties.automaticRepairsPolicy.enabled == false
| project recommendationId = "vmss-3", name, id, tags, param1 = "automaticRepairsPolicy: Disabled"
系统效率
将分配策略分布算法配置为最大分布
使用“最大分布”时,规模集会在每个区域中将 VM 分布到尽可能多的容错域。 这种分布可能会在每个区域中横跨五个以上或五个以下的容错域。 使用静态固定分布时,规模集会在每个区域中将 VM 分布到刚好 5 个容错域中。 如果规模集在每个区域中找不到 5 个不同的容错域来满足分配请求,则请求会失败。
有关详细信息,请参阅分布选项。
// Azure Resource Graph Query
// Find VMSS instances where Spreading algorithm is set to Static
resources
| where type == "microsoft.compute/virtualmachinescalesets"
| where properties.platformFaultDomainCount > 1
| project recommendationId = "vmss-7", name, id, tags, param1 = "platformFaultDomainCount: Static"
| order by id asc
自动化
将补丁业务流程选项设置为“Azure 安排”
为 Azure 虚拟机启用自动虚拟机来宾修补。 自动虚拟机来宾修补有助于通过安全、自动地修补虚拟机来简化更新管理,使虚拟机保持安全合规,同时限制虚拟机的冲击半径。
resources
| where type == "microsoft.compute/virtualmachinescalesets"
| join kind=inner (
resources
| where type == "microsoft.compute/virtualmachines"
| project id = tostring(properties.virtualMachineScaleSet.id), vmproperties = properties
) on id
| extend recommendationId = "vmss-9", param1 = "patchMode: Manual", vmproperties.osProfile.linuxConfiguration.patchSettings.patchMode
| where isnotnull(vmproperties.osProfile.linuxConfiguration) and vmproperties.osProfile.linuxConfiguration.patchSettings.patchMode !in ("AutomaticByPlatform", "AutomaticByOS")
| distinct recommendationId, name, id, param1
| union (resources
| where type == "microsoft.compute/virtualmachinescalesets"
| join kind=inner (
resources
| where type == "microsoft.compute/virtualmachines"
| project id = tostring(properties.virtualMachineScaleSet.id), vmproperties = properties
) on id
| extend recommendationId = "vmss-9", param1 = "patchMode: Manual", vmproperties.osProfile.windowsConfiguration.patchSettings.patchMode
| where isnotnull(vmproperties.osProfile.windowsConfiguration) and vmproperties.osProfile.windowsConfiguration.patchSettings.patchMode !in ("AutomaticByPlatform", "AutomaticByOS")
| distinct recommendationId, name, id, param1)
可用性区域支持
Azure 可用性区域是每个 Azure 地区内的至少三个在物理上独立的数据中心组。 每个区域中的数据中心都配备了独立的电源、冷却系统和网络基础结构。 在本地区域发生故障的情况下,设计可用性区域,以便一个区域受到影响时,其余两个区域支持区域服务、容量和高可用性。
故障范围包括软件和硬件故障,以及地震、洪水和火灾等事件。 容错是通过 Azure 服务的冗余和逻辑隔离来实现的。 有关 Azure 中可用性区域的详细信息,请参阅地区和可用性区域。
已启用 Azure 可用性区域的服务旨在提供适当级别的可靠性和灵活性。 可以通过两种方式进行相关配置。 可以采用区域冗余配置,实现跨区域自动复制,也可以采用区域性配置,将实例固定到特定区域。 还可以将这些方法结合。 有关区域与区域冗余体系结构的详细信息,请参阅有关使用可用性区域和区域的建议。
使用 Azure 虚拟机规模集,可以创建并管理一组经过负载均衡的虚拟机。 可以根据需求或定义的计划自动增减虚拟机数量。 规模集为应用程序提供高可用性,用于集中管理、配置和更新大量 VM。 规模集本身不收费。 你只需为创建的每个 VM 实例付费。
虚拟机规模集支持区域内的区域性部署和区域冗余部署:
区域性部署。 在单个区域中创建规模集时,可以控制该集的所有虚拟机在哪个区域运行。 规模集是托管的,仅在该区域内自动缩放。
区域冗余的部署。 使用区域冗余规模集,可创建跨越多个区域的单个规模集。 默认情况下,在创建虚拟机时,它们会跨区域实现均衡。
先决条件
若要使用可用性区域,必须在受支持的 Azure 区域中创建规模集。
所有虚拟机(包括单实例虚拟机)都应使用灵活的业务流程模式部署到规模集中,以便使应用程序面向未来的缩放和可用性功能。
SLA
由于可用性区域在物理上是独立的,并且提供不同的电源、网络和冷却,因此 SLA(服务级别协议)会增加。 有关详细信息,请参阅 Azure Online Services 的 SLA。
创建启用了可用性区域的虚拟机规模集
可以使用下列方法之一创建启用了可用性区域的规模集:
创建使用区域部署的规模集的过程与这篇入门文章中详述的过程一样。 选择受支持的 Azure 区域时,可在一个或多个可用性区域中创建规模集,如下面的示例所示:
将在你指定的单个区域中创建规模集和支持资源,例如 Azure 负载均衡器和公共 IP 地址。
区域故障转移支持
默认情况下,系统会在没有区域的 Azure 区域中创建具有五个容错域的虚拟机规模集。 对于支持虚拟机规模集可用性区域部署的区域,如果已选中此选项,则每个区域的容错域计数的默认值为 1。 在这种情况下,FD = 1 意味着尽最大努力将属于规模集的虚拟机实例分布到多个机架上。 有关详细信息,请参阅为虚拟机规模集选择合适数量的容错域。
低延迟设计
建议使用区域冗余配置虚拟机规模集。 但是,如果应用程序具有严格的低延迟要求,则可能需要为规模集虚拟机实现区域。 对于区域性规模集部署,建议跨多个区域创建多个规模集虚拟机。 例如,可以创建一个固定到区域 1 的规模集实例,以及一个固定到区域 2 或区域 3 的实例。 在区域中断期间,还需要使用负载均衡器或其他应用程序逻辑将流量定向到合适的规模集。
重要
如果选择退出区域感知部署,则表示放弃对基础故障的隔离保护。 退出可用性区域配置会强制依赖于不符合局部区域放置和隔离的资源(包括这些资源的基础依赖项)。 不应期望这些资源在局部区域停机情形中幸存下来。 利用此类资源的解决方案应定义一个灾难恢复策略,并在另一个区域中配置解决方案的恢复。
安全部署技术
若要更好地控制虚拟机的部署位置,应部署区域性规模集虚拟机,而不是地区性规模集虚拟机。 但是,区域性虚拟机仅提供区域隔离,不提供区域冗余。 若要使用区域性虚拟机实现完全区域冗余,应在不同区域中有两个或更多个虚拟机。
还建议对区域冗余虚拟机使用最大分布部署选项。 有关详细信息,请参阅分布选项。
分布选项
将规模集部署到一个或多个可用性区域中时,(自 API 版本 2017-12-01 起),可使用以下分布选项:
最大分布 (platformFaultDomainCount = 1)。 建议使用“最大分布”部署选项,因为它在大多数情况下提供最佳分布。 如果需要将副本跨不同的硬件隔离单元进行分布,建议先跨可用性区域进行分布,然后在每个区域中使用“最大分布”。
使用“最大分布”时,规模集会在每个区域中将 VM 分布到尽可能多的容错域。 这种分布可能会在每个区域中横跨五个以上或五个以下的容错域。
注意
使用“最大分布”时,无论虚拟机实际分布到多少个容错域,在规模集虚拟机实例视图和实例元数据中都只能看到一个容错域。 每个区域中的分布是隐式的。
静态固定分布 (platformFaultDomainCount = 5)。 使用静态固定分布时,规模集会在每个区域中将虚拟机分布到刚好 5 个容错域中。 如果规模集在每个区域中找不到 5 个不同的容错域来满足分配请求,则请求会失败。
与托管磁盘容错域 (platformFaultDomainCount = 2 或 3) 保持一致进行分布 可以考虑将规模集容错域的数量与托管磁盘容错域的数量保持一致。 如果整个托管磁盘容错域发生故障,保持一致有助于防止仲裁丢失。 容错域计数可以设置为小于或等于每个区域中可用托管磁盘容错域的数量。
区域均衡
对于跨多个区域部署的规模集 (区域冗余),可以选择最佳区域平衡或严格区域均衡。 如果每个区域中的虚拟机数与规模集的所有其他区域中的虚拟机数相同 (相差 1),则可以认为该规模集“已实现均衡”。 例如:
规模集 | 区域 1 中的虚拟机 | 区域 2 中的虚拟机 | 区域 3 中的虚拟机 | 区域均衡 |
---|---|---|---|---|
均衡的规模集 | 2 | 3 | 3 | 此规模集被视为均衡规模集。 只有一个区域具有不同的虚拟机计数,它只比其他区域少 1 个虚拟机。 |
非均衡规模集 | 1 | 3 | 3 | 此规模集被视为不均衡规模集。 区域 1 比区域 2 和区域 3 少 2 个 VM。 |
一个可能的情况是,规模集中的 VM 已成功创建,但这些 VM 的扩展部署失败。 在确定某个规模集是否已实现均衡时,这些虚拟机虽然扩展失败,但仍计在内。 例如,如果某个规模集的区域 1 中有 3 个虚拟机,区域 2 中有 3 个虚拟机,区域 3 中有 3 个虚拟机,那么即使区域 1 中的所有扩展都失败而区域 2 和 3 中的所有扩展都成功,也可以认为该规模集已实现均衡。
使用“尽量实现区域均衡”时,规模集会在维持均衡时尝试进行横向收缩和扩展。 但是,如果由于某种原因无法实现区域均衡(例如,如果一个区域出现故障,规模集无法在该区域中创建新的虚拟机),则规模集会允许临时的不均衡,以成功地横向缩减或扩展。在随后的横向扩展尝试中,规模集会将虚拟机添加到需要更多虚拟机的区域中以使规模集达到均衡。 同样,在后续的横向收缩尝试中,规模集会在需要减少 VM 才能实现规模集均衡的区域中删除 VM。 使用“严格执行区域均衡”时,如果在进行横向收缩或扩展尝试时会导致不均衡,规模集会放弃这样的尝试。
要使用“尽量实现区域均衡”,请将 zoneBalance
设置为 false。 此zoneBalance
设置是 API 版本 2017-12-01 中的默认设置。 要使用“严格执行区域均衡”,请将 zoneBalance
设置为 true。
迁移到可用性区域支持
若要了解如何将区域性规模集重新部署到可用性区域支持,请参阅将虚拟机和虚拟机规模集迁移到可用性区域支持。
其他指南
放置组
重要
放置组仅适用于在统一业务流程模式下运行的虚拟机规模集。
部署虚拟机规模集时,还可以选择为每个可用性区域部署单个放置组或多个放置组。 对于区域性规模集,可选择在区域中包含单个放置组或多个放置组。 如果将规模集属性“singlePlacementGroup
”设置为 false,则该规模集可以由多个放置组组成,其范围为 0-1000 台虚拟机。 设置为默认值 true 时,规模集由单个放置组组成,其范围为 0-100 台虚拟机。 对于大多数工作负荷,建议使用多个放置组,这样可以增大规模。 在 API 版本 2017-12-01 中,单区域和跨区域规模集默认为多个放置组,但区域性规模集则默认为单个放置组。