使用地区级 MIG 分布实例

本页面介绍了如何创建地区级代管实例组 (MIG)。您还可以创建区域级(单区域)MIG。区域级 MIG 和地区级 MIG 都支持自动修复负载平衡自动扩缩自动更新有状态工作负载

地区级 MIG 可提供比区域级 MIG 更高的可用性,因为地区级 MIG 的代管实例均匀分布在单个地区内的多个区域中。不过,地区级 MIG 与区域级 MIG 受到不同的限制

无论是区域级还是地区级,MIG 的每个代管实例都基于一个通用的实例模板和可选的有状态配置。每个代管实例都是 MIG 中的数据实体,其中包含实际虚拟机实例的当前状态和预期状态。MIG 会主动确保实际虚拟机可用(即处于 RUNNING 状态),以保持应用的高可用性。

如需详细了解实例组及其功能,请参阅实例组概览

准备工作

限制

  • 每个地区级 MIG 可包含的虚拟机数上限为 2000 个。
  • 更新 MIG 时,通过单个请求可以指定的虚拟机数上限为 1000 个。
  • 您不能将地区级 MIG 与使用 maxRate 平衡选项的负载平衡器一起使用。
  • 根据 Cloud Monitoring 指标自动扩缩功能配合使用时:
    • 与单区域 MIG 不同,地区级 MIG 不支持对实例指标进行过滤。
    • 与单区域 MIG 不同,地区级 MIG 不支持使用组指标进行自动调节。

选择地区级代管实例组

Google 推荐使用地区级 MIG,而非区域级 MIG,因为前者能够跨多个地区分散应用负载,而不用将应用限制在单个区域,或者跨不同区域管理多个实例组。使用多个区域可避免区域性故障,或单个区域中的整个实例组发生故障等无法预料的情况。如果确实发生了这种情况,您的应用仍可以继续处理来自同一地区的另一个区域中运行的实例的流量。

如果发生区域性故障,或者某个区域的一组实例停止响应,地区级 MIG 会继续通过如下方式支持您的虚拟机:

  • 其余区域中属于地区级 MIG 的虚拟机会继续处理流量。除此之外,系统不会添加任何新虚拟机,也不会重新分布任何虚拟机(除非您设置了自动扩缩功能)。

  • 待发生故障的区域恢复正常后,MIG 会开始重新处理来自该区域的流量。

如果要设计可靠且可扩缩的应用,请使用地区级 MIG。

主动式实例重新分布

默认情况下,地区级 MIG 内的虚拟机会尽量在地区内的各个区域中均匀分布,以便在出现区域级别的故障时最大限度地提高应用的可用性。

如果您对实例组中的实例执行 deleteabandon 操作,导致各区域的分布不均匀,则实例组会主动重新分布实例以恢复到分布均匀的状态。

为了在各个区域之间重建均匀的分布,实例组会删除具有较多虚拟机的区域中的虚拟机,并为具有较少虚拟机的区域添加新虚拟机。实例组会自动选择要删除的虚拟机。

主动式重新分布功能重新建立跨区域的均匀分布。
主动式重新分布的示例

例如,假设您有一个包含 4 个实例的地区级 MIG,这些实例分布在 3 个区域:abc。如果您删除 c 中的 3 个代管实例,则实例组会尝试重新平衡,以使实例再次均匀分布在各个区域。在此示例中,实例组会删除 2 个实例(一个来自 a,另一个来自 b),然后在区域 c 中创建 2 个实例;如此一来,每个区域都会有 3 个实例,从而实现了均匀分布。请注意,无法选择性地确定要删除的实例。在新实例启动时,实例组的容量会暂时丢失。

如需防止虚拟机自动重新分布,您可以在创建更新地区级 MIG 时关闭主动式实例重新分布功能。

在以下情况下,此操作非常有用:

  • 从组中删除或移除虚拟机而不影响其他正在运行的虚拟机实例。例如,您可以在作业完成后删除批处理工作器虚拟机,而不影响其他工作器。
  • 避免主动式重新分布功能意外自动删除具有有状态应用的虚拟机。
停用主动式重新分布功能可能会影响发生区域性故障期间的容量。
停用主动式重新分布功能后的不均匀分布

如果关闭主动式实例重新分布功能,MIG 不会主动添加或移除虚拟机以实现平衡,但在执行调整规模操作期间,MIG 仍然会根据具体时机尽力实现平衡(通过每个调整规模操作来平衡实例组)。例如,缩减时,实例组会自动从较大区域中移除虚拟机;横向扩容时,实例组会为较小区域添加虚拟机。

预配合适的 MIG 规模以确保可用性

鉴于各种事件可能导致一个或多个虚拟机不可用,您可以使用多项 Google Cloud 服务缓解此问题:

  • 使用地区级 MIG 在多个区域分布应用。
  • 使用自动修复功能重新创建(之前失败的)虚拟机。
  • 使用负载平衡功能自动引导用户流量离开不可用的虚拟机。

但是,即使您使用这些服务,如果同时有太多虚拟机不可用,您的用户仍可能会遇到问题。

为了应对在一个区域发生故障或整个虚拟机实例组停止响应的极端情况,Google 强烈建议您对 MIG 进行超额预配。如果某个区域或一组虚拟机无响应,则根据您的应用需求对您的实例组进行超额预配可防止系统完全瘫痪。

Google 会针对超额预配提出建议,以优先确保您的用户能够使用您的应用。这些建议包括预配超出您的应用日常所需数量的虚拟机,并支付相应费用。根据应用需求和费用限制来决定超额预配。

估计建议的实例组规模

Compute Engine 建议您预配足够的虚拟机,以便在任何一个区域中的所有虚拟机都不可用时,您的其余虚拟机仍然达到所需的最少虚拟机数。

请使用下表确定实例组的最小建议规模:

区域数 额外虚拟机数 建议的虚拟机总数
2 +100% 200%
3 +50% 150%
4 +33% 133%

建议的额外虚拟机数量与 MIG 所在区域的数量成反比。因此,您可以通过在更多区域中均匀分布应用来减少额外虚拟机的数量。

在三个或更多区域中预配地区级 MIG

在具有至少三个区域的地区中创建地区级 MIG 时,Google 建议您将实例组超额预配至少 50%。默认情况下,地区级 MIG 会在三个区域创建虚拟机。在三个区域创建虚拟机已经帮助您保留了至少 2/3 的服务容量;如果其中一个区域发生故障,该地区中的另外两个区域可以继续处理流量,而不会出现中断情况。而如果将该实例组超额预配为 150%,那么您将可以确保即使失去了 1/3 的容量,其余区域也能为 100% 的流量提供支持。

例如,如果跨三个区域的 MIG 需要 20 个虚拟机,我们建议您至少额外增加 50% 的虚拟机。在此示例中,20 的 50% 是 10(即增加 10 个虚拟机),这样一来,该实例组中的虚拟机总共会有 30 个。如果您创建规模为 30 的地区级 MIG,则实例组会在这三个区域中尽可能均匀地分布您的虚拟机,如下所示:

区域 虚拟机数量
example-zone-1 10
example-zone-2 10
example-zone-3 10

如果其中任何一个区域发生故障,您仍然有 20 个虚拟机可以处理流量。

在两个区域中预配地区级 MIG

如需在两个(而不是三个)区域预配虚拟机,Google 建议您将虚拟机数增加一倍。例如,如果您的服务需要 20 个虚拟机,这些虚拟机分布在两个区域,我们建议您配置一个包含 40 个虚拟机的地区级 MIG,以便每个区域都有 20 个虚拟机。如果一个区域发生故障,您仍然有 20 个虚拟机可以处理流量。

区域 虚拟机数量
example-zone-1 20
example-zone-2 20

如果实例组中的虚拟机数很难在两个区域之间划分,Compute Engine 会尽可能均匀地划分虚拟机,并将其余虚拟机随机划入其中一个区域。

在一个区域中预配地区级 MIG

您可以只在一个区域创建地区级 MIG。这类似于创建区域级 MIG

我们建议您不要在一个区域创建地区级 MIG,因为它为高可用性应用提供的是最低限度的保证。如果该区域发生故障,则整个 MIG 都不可用,这会对您的用户造成潜在影响。

为您的实例组选择区域

地区级 MIG 的默认配置是在三个区域中尽可能均匀地分布虚拟机。但出于各种原因,您可能需要为应用选择特定区域。例如,如果您的虚拟机需要 GPU,那么您只能选择支持 GPU 的区域。您的永久性磁盘可能只适用于特定区域,或者您可能希望仅在几个特定的区域(而不是一个地区内的三个随机区域)开始创建虚拟机。

如果要选择区域数或选择实例组应在其中运行的特定区域,则必须在首次创建实例组时执行此类操作。如果您在创建实例组的过程中选择了特定区域,日后将无法更改或更新这些区域。

  • 要在一个地区内选择三个以上区域,您必须明确指定各个区域。例如,如需选择一个地区内的所有四个区域,您必须在请求中明确提供所有四个区域。否则,Compute Engine 默认选择三个区域。

  • 如需在一个地区中选择两个或更少的区域,您必须明确指定各个区域。并且,即使该地区只包含两个区域,您也必须在请求中明确指定这些区域。

无论您是选择特定区域,还是只希望选择区域并允许 Compute Engine 在地区内的所有区域中创建虚拟机,默认情况下,这些新的虚拟机都将在所有区域中均匀分布。最佳做法是,确保预配足够多的虚拟机,从而为指定数量的区域中的应用提供支持。

创建地区级 MIG

您可以使用 gcloud 命令行工具、控制台API 创建地区级 MIG。

如果每个区域中没有足够的容量来支持实例组中的虚拟机,则 Compute Engine 会创建尽可能多的虚拟机,并在后续获得额外配额时继续尝试创建其余虚拟机。

由于您要创建的是地区级 MIG,因此请注意,某些资源是区域性的,例如永久性磁盘。如果您要在实例模板中指定区域资源(如额外的永久性磁盘),则必须确保所有区域中都存在该磁盘,以便将该磁盘挂接到由此地区级 MIG 创建的虚拟机。

默认情况下,如果您未在请求中明确指定各个区域,则 Compute Engine 会自动选择三个区域来创建虚拟机。如果您需要在多于或少于三个区域中创建虚拟机,或者您希望选择使用哪些区域,请在您的请求中提供区域列表。如需了解详情,请参阅为您的实例组选择区域

主动式实例重新分布功能默认启用。如果需要手动管理每个区域中的虚拟机数量,您可以停用主动式实例重新分布功能,这样也就无法配置自动扩缩。如需了解详情,请参阅主动式实例重新分布

控制台

  1. 在 Cloud Console 中,转到实例组页面。

    转到“实例组”页面

  2. 点击创建实例组以创建一个新的实例组。
  3. 位置下,选择多个区域
  4. 选择所需的地区。
  5. 如果要选择特定区域,请点击配置区域以选择要使用的区域。
  6. 如果要停用主动式实例重新分布功能,请执行以下操作
    1. 确保将自动扩缩模式设置为关闭
    2. 实例重新分布设置为关闭
  7. 为实例组选择一个实例模板或创建一个新实例模板。
  8. 指定此实例组内的虚拟机数量。请务必预配足够多的虚拟机,以便在一个区域发生故障时,您的应用可获得相应的支持。
  9. 继续完成 MIG 创建过程的剩余部分。

gcloud

所有 MIG 都需要实例模板。如果您没有实例模板,请创建一个。例如,以下命令会创建具有默认属性的基本实例模板:

gcloud compute instance-templates create example-template

接下来,使用带有 --region 标志的 instance-groups managed create 子命令。例如,此命令会在 us-east1 地区内的三个区域中创建一个地区代管实例组:

gcloud compute instance-groups managed create example-rmig \
    --template example-template --base-instance-name example-instances \
    --size 30 --region us-east1

如果要选择实例组应使用的特定区域,请使用 --zones 标志:

gcloud compute instance-groups managed create example-rmig \
    --template example-template --base-instance-name example-instances \
    --size 30 --zones us-east1-b,us-east1-c

如果要停用主动式实例重新分布功能,请将 --instance-redistribution-type 标志设置为 NONE。如果启用了自动扩缩,则无法停用主动式实例重新分布功能。

gcloud compute instance-groups managed create example-rmig \
    --template example-template --base-instance-name example-instances \
    --size 30 --instance-redistribution-type NONE

API

所有 MIG 都需要实例模板。如果您没有实例模板,请创建一个

在 API 中,构建对 regionInstanceGroupManagers.insert 方法的 POST 请求。在请求正文中添加所需的组名、组大小、组中实例的基本名称以及实例模板的网址。

POST https://compute.googleapis.com/compute/v1/projects/project-id/regions/region/instanceGroupManagers

{
  "baseInstanceName": "base-instance-name",
  "instanceTemplate": "global/instanceTemplates/instance-template-name",
  "name": "instance-group-name",
  "targetSize": "target-size",
  "distributionPolicy": {
     "zones": [
       {"zone": "zones/zone"},
       {"zone": "zones/zone"}
      ]
   }
}

替换以下内容:

  • project-id:此请求的项目 ID。
  • region:该实例组所在的地区。
  • base-instance-name:实例组中创建的每个虚拟机实例的名称。例如,基本实例名称 example-instance 将创建名称类似于 example-instance-[RANDOM_STRING] 的实例,其中 [RANDOM_STRING] 由服务器生成。
  • instance-template-name:要使用的实例模板。
  • instance-group-name:MIG 的名称。
  • target-size:实例组中的虚拟机的目标数量。

如果您要选择特定区域,或者要在包含的区域少于或多于三个的地区中创建虚拟机,请在您的请求中添加 distributionPolicy 属性并提供区域列表。然后,将 [ZONE] 替换为要在其中创建虚拟机的区域的名称。

POST https://compute.googleapis.com/compute/v1/projects/project-id/regions/region/instanceGroupManagers

{
  "baseInstanceName": "base-instance-name",
  "instanceTemplate": "global/instanceTemplates/instance-template-name",
  "name": "instance-group-size",
  "targetSize": "target-size",
  "distributionPolicy": {
     "zones": [
       {"zone": "zones/zone"},
       {"zone": "zones/zone"}
      ]
   }
}

例如,以下命令会创建一个名为 example-rmig 的地区级 MIG,其中的 10 个代管实例分布在 us-east1-bus-east1-c 区域:

POST https://compute.googleapis.com/compute/v1/projects/myproject/regions/us-east1/instanceGroupManagers

{

  "baseInstanceName": "example-instance",
  "instanceTemplate": "global/instanceTemplates/example-instance",
  "name": "example-rmig",
  "targetSize": 10,
  "distributionPolicy": {
      "zones": [
        {"zone": "zones/us-east1-b"},
        {"zone": "zones/us-east1-c"}
      ]
   }
}

如果要停用主动式实例重新分布功能,请在您的请求中添加 updatePolicy 属性并将其 instanceRedistributionType 设置为 NONE

如果启用了自动扩缩,则无法停用主动式实例重新分布功能。

POST https://compute.googleapis.com/compute/v1/projects/project-id/regions/region/instanceGroupManagers

{
  "baseInstanceName": "base-instance-name",
  "instanceTemplate": "global/instanceTemplates/[INSTANCE_TEMPLATE_NAME]",
  "name": "instance-group-name",
  "targetSize": "target-size",
  "updatePolicy": {
     "instanceRedistributionType": "NONE"
   },
}

列出地区级代管实例组中的实例

如需获取地区级 MIG 的代管实例列表,请使用 Cloud Consolegcloud 命令行工具中的 instance-groups managed list-instances 命令,或向 regionInstanceGroupManagers.listManagedInstances 方法发出请求。

控制台

  1. 在 Cloud Console 中,转到实例组页面。

    转到“实例组”页面

  2. 点击要查看其实例的地区级 MIG 的名称。

此时系统会加载“实例组详情”页面,其中包含该实例组中的实例列表。

gcloud

运行 instance-groups managed list-instances 命令

gcloud compute instance-groups managed list-instances instance-group-name --region region

替换以下内容:

  • instance-group-name:MIG 的名称。
  • region:MIG 所在的地区。

例如,以下命令会列出地区 us-east1 中名为 example-rmig 的 MIG 内的实例:

gcloud compute instance-groups managed list-instances example-rmig --region us-east1

API

在 API 中,对 regionInstanceGroupManagers.listManagedInstances 方法构建空的 GET 请求。

GET https://compute.googleapis.com/compute/v1/projects/project-id/regions/region/instanceGroupManagers/instance-group-name

例如:

GET https://compute.googleapis.com/compute/v1/projects/myproject/regions/us-east1/instanceGroupManagers/example-rmig

更新地区代管实例组

您可以使用更新程序功能更新地区级 MIG。利用该更新程序,您可以将实例组中的部分虚拟机或所有虚拟机更新为新的实例模板。此外,您还可以使用该更新程序执行 Canary 更新并控制更新速度。

与此相关的是,您还可以使用 gcloud 中的 set-instance-template 命令或使用 API 中的 setInstanceTemplate 方法更改 MIG 的实例模板,而无需更新现有虚拟机。请注意,如果更改实例模板,系统不会自动根据新的实例模板来更新现有虚拟机。您必须重新创建各个实例或运行更新程序以应用这些更改。但是,实例组中的新虚拟机将使用新的实例模板。

停用和重新启用主动式实例重新分布功能

主动式实例重新分布功能可平衡地区内选定区域中的虚拟机数。此配置可在出现区域范围故障时最大限度地提高应用的可用性。

对于地区级 MIG,主动式实例重新分布功能默认启用,但您可以为非自动扩缩的 MIG 停用该功能。主动式实例重新分布功能停用时,实例组不会尝试主动跨地区重新分布虚拟机。在以下情况下,此机制很有用:

  • 手动删除或移除实例组中的代管实例而不影响其他正在运行的虚拟机。
  • 在作业完成时自动删除批处理工作器虚拟机,而不影响其他工作器。
  • 避免主动式实例重新分布功能意外自动删除具有有状态应用的虚拟机。

如果您删除或移除实例组中的代管实例,导致各区域的虚拟机数不平衡,则在重新启用主动式重新分布功能之前,您必须手动平衡实例组。如需手动重新平衡实例组,请调整实例组规模或删除包含较多虚拟机的区域中的代管实例

当您调整已关闭主动式实例重新分布功能的 MIG 的规模时,该实例组仍然会根据具体时机尽力实现平衡,通过每个调整规模操作来平衡实例组:扩大规模时,实例组总是会尝试为包含最少虚拟机的区域添加虚拟机;缩减规模时,实例组总是会从包含最多虚拟机的区域中移除虚拟机。

手动调整实例组规模以实现均匀重新分布的示例

您可以使用控制台、gcloud 工具或 API 创建停用了主动式实例重新分布功能的地区级 MIG,或为现有实例组关闭或启用主动式实例重新分布功能。

创建停用了主动式重新分布功能的实例组

控制台

  1. 在 Cloud Console 中,转到实例组页面。

    转到“实例组”页面

  2. 点击创建实例组以创建一个新的实例组。
  3. 位置下,选择多个区域
  4. 选择所需的地区。
  5. 如果要选择特定区域,请点击配置区域以选择要使用的区域。
  6. 如需停用主动式实例重新分布功能,请执行以下操作:
    1. 确保将自动扩缩模式设置为关闭
    2. 实例重新分布设置为关闭
  7. 为实例组选择一个实例模板或创建一个新实例模板。
  8. 指定此实例组内的虚拟机数量。请务必预配足够多的虚拟机,以便在一个区域发生故障时,您的应用可获得相应的支持。
  9. 继续完成 MIG 创建过程的剩余部分。

gcloud

如需创建不具备主动式实例重新分布功能的新的地区级 MIG,请使用 gcloud compute instance-groups managed create 命令,并将 --instance-redistribution-type 标志设置为 NONE

gcloud compute instance-groups managed create instance-group-name \
    --template template \
    --size target-size \
    --zones zones \
    --instance-redistribution-type NONE

替换以下内容:

  • instance-group-name:MIG 的名称。
  • template:要用于实例组的实例模板的名称。
  • target-size:是实例组的目标规模。
  • zones:您需要部署虚拟机的单个地区中的区域列表。

例如:

gcloud compute instance-groups managed create example-rmig \
    --template example-template \
    --size 30 \
    --zones us-east1-b,us-east1-c \
    --instance-redistribution-type NONE

API

如需创建不具备主动式实例重新分布功能的非自动扩缩地区级 MIG,请构建一个 POST 请求以调用 regionInstanceGroupManagers.insert 方法。在请求正文中,添加 updatePolicy 属性并将其 instanceRedistributionType 字段设置为 NONE

POST https://compute.googleapis.com/compute/v1/projects/project-id/regions/region/instanceGroupManagers/instance-group-name
{
    "name": "instance-group-name",
    "baseInstanceName": "base-instance-name",
    "instanceTemplate": "global/instanceTemplates/template",
    "targetSize": "target-size",
    "distributionPolicy": {
        "zones": [
            {"zone": "zones/zone"},
            {"zone": "zones/zone"}
        ]
    },
    "updatePolicy": {
        "instanceRedistributionType": "NONE"
    }
}

Replace the following:

  • project-id. The project ID for this request.
  • region. The region for the instance group.
  • instance-group-name. The name for the MIG.
  • base-instance-name. The name prefix for each instance. The instance name suffix is auto generated.
  • template. The name of the instance template to use for the group.
  • target-size. The target size of the instance group.
  • zone. The name of a zone in the single region where you need to deploy VMs.

关闭主动式实例重新分布功能

您必须先关闭自动扩缩功能,然后才能关闭主动式实例重新分布功能。

控制台

  1. 在 Cloud Console 中,转到实例组页面。

    转到“实例组”页面

  2. 选择要更新的 MIG,然后点击修改组
  3. 确保将自动扩缩模式设置为关闭
  4. 实例重新分布设置为关闭以停用自动重新分布功能。
  5. 点击保存

gcloud

如需为非自动扩缩的地区级 MIG 停用主动式实例重新分布功能,请使用 compute instance-groups managed update 命令,并将 --instance-redistribution-type 标志设置为 NONE

gcloud compute instance-groups managed update instance-group-name
    --instance-redistribution-type NONE 
--region region

替换以下内容:

  • instance-group-name:MIG 的名称。
  • region:实例组所在的地区。

API

在 API 中,构建对 regionInstanceGroupManagers.patch 方法的 PATCH 请求。在请求正文中,添加 updatePolicy 属性并将其 instanceRedistributionType 字段设置为 NONE

 PATCH https://compute.googleapis.com/compute/v1/projects/project-id/regions/region/instanceGroupManagers/[instance-group-name

{
    "updatePolicy": {
         "instanceRedistributionType": "NONE"
    }
}

替换以下内容:

  • project-id:此请求的项目 ID。
  • region:实例组所在的地区。
  • instance-group-name:非自动扩缩的 MIG 的名称。

启用主动式实例分布功能

如需启用主动式实例分布功能,请使用与停用主动式实例重新分布功能类似的命令,但将实例重新分布类型设置为 PROACTIVE

如果您手动删除或移除某些代管实例,导致地区内虚拟机分布不均匀,则必须先手动重新平衡实例组,然后才能重新启用主动式实例重新分布功能。任意两个区域的虚拟机数量差不应超过 1 个虚拟机。

您可以手动删除具有较多实例的区域中的虚拟机,或者调大实例组规模以填充具有较少虚拟机的区域,从而使各个区域的实例均匀分布。

当各个区域中的虚拟机分布不均匀(两个区域的虚拟机数量差为 2 个或以上虚拟机)时,地区级 MIG 不允许启用主动式实例重新分布功能。这是为了防止意外自动删除具有较多虚拟机的区域中的虚拟机,该操作会为了实现均匀分布而触发。

自动扩缩地区级代管实例组

Compute Engine 为 MIG 提供自动扩缩功能,因此您的实例组能够根据负载的增减自动添加虚拟机(横向扩容)或移除虚拟机(缩减)。

如果您为地区级 MIG 启用了自动扩缩功能,则该功能将按照如下方式运作:

  • 自动扩缩政策将应用于整个实例组(而不是单个区域)。例如,如果您启用了自动扩缩器,目标是实现 66% 的 CPU 利用率,则自动扩缩器会跟踪实例组中的所有虚拟机,以使所有区域中的所有虚拟机保持 66% 的平均利用率。

  • 自动扩缩功能会尽可能尝试在可用区域之间均匀分布虚拟机。通常,自动扩缩器保持各区域大小平衡的方法是增加实例较少区域的实例数量,预期负载会从实例较多的区域重定向(例如,通过负载平衡器的作用)。我们建议不要配置偏好一个区域的自定义负载平衡器,因为这可能会导致意外行为。

  • 如果您的工作流在 3 个地区均匀使用虚拟机,并且某个区域发生故障,或者某个区域内的一组实虚拟机发生故障,则可能会失去 1/3 的容量,但 2/3 的容量会保留在其他区域。我们建议您超额预配自动扩缩的地区级 MIG,以避免在某个区域发生故障期间,仍在继续运行的服务器过载。

  • 如果某个区域的资源(例如抢占式虚拟机)暂时不可用,则实例组会继续尝试在该地区创建这些虚拟机。资源再次可用后,实例组会获取所需数量的运行虚拟机。

  • 如果启用了负载平衡功能并且某个区域的资源不可用,导致该区域现有资源的利用率较高,则系统可能会在利用率较低的区域创建新虚拟机,从而可能导致分布暂时不均匀。

自动扩缩器向一个区域添加的虚拟机数量不会超过为实例组指定的虚拟机数上限的 1/n,其中 n 是预配区域的数量。例如,如果您使用的是默认设置(3 个区域),并且为自动扩缩功能配置的 maxNumReplicas 是 15,则自动扩缩器最多只能在每个区域为实例组添加 5 (1/3 * 15 = 5) 个虚拟机。如果一个区域发生故障,则自动扩缩器只会在剩下的两个区域中扩容到 maxNumReplicas 的 2/3。

预配自动扩缩器配置

与超额预配 MIG 的建议类似,您应该超额预配自动扩缩器配置,以便:

  • 自动扩缩的利用率目标是预计利用率目标的 2/3。
  • 为了适应利用率目标降低的情况,自动扩缩器将添加更多的虚拟机,因此您应该增大 maxNumReplicas 的值,使其比您设置的数量超出 50%,而不考虑超额预配。

例如,如果您预计 20 个虚拟机可以处理峰值负载,并且目标利用率为 80%,请对自动扩缩器进行如下设置:

  • 将目标利用率设置为 2/3 * 0.8 = 0.53 或 53%,而不是 80%
  • 将虚拟机数上限设置为 3/2 * 20 = 30,而不是 20

此设置可确保在单个区域发生故障时,您的 MIG 不会耗尽容量,因为剩余的 2/3 虚拟机应该能够处理因某个区域发生故障而增加的负载(这是因为您已将目标利用率降到其容量以下)。此外,自动扩缩器还会添加新虚拟机,以使虚拟机数量达到您为了维持 2/3 的利用率目标而指定的虚拟机数上限。

但是,您不应该仅依靠超额预配 MIG 来处理增加的负载。Google 建议的最佳做法是定期对应用进行负载测试,以确保应用可以处理可能因某个区域发生服务中断(因而使 1/3 的虚拟机被移除)而导致的利用率升高情况。

启用自动扩缩

控制台

  1. 在 Cloud Console 中,转到实例组页面。

    转到“实例组”页面

  2. 如果您没有实例组,请创建一个。否则,点击列表中现有地区级 MIG 的名称。
  3. 在实例组详情页面上,点击修改组按钮。
  4. 在“自动扩缩”下方,选中开启
  5. 填写自动扩缩配置的属性。
  6. 保存更改。

gcloud

依次使用 gcloud 命令行工具和 set-autoscaling 子命令启用地区自动扩缩,然后添加 --region 标志。如需详细了解如何创建自动扩缩器,请参阅自动扩缩文档

例如,以下代码段为示例实例组设置了自动扩缩器。将 us-east1 替换为代管实例组所在的地区,并将 example-rmig 替换为地区代管实例组的名称:

gcloud compute instance-groups managed set-autoscaling example-rmig \
    --target-cpu-utilization 0.8 --max-num-replicas 5 --region us-east1

API

如需在 API 中设置地区级自动扩缩,请调用 [regionAutoscalers.insert 方法[(/compute/docs/reference/rest/v1/regionAutoscalers/insert)

POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/[REGION]/regionAutoscalers/

请求正文必须包含 nametargetautoscalingPolicy 字段。autoscalingPolicy 必须定义 cpuUtilizationmaxNumReplicas

为便于识别,我们建议您以使用自动扩缩器资源的 MIG 资源的名字为相应自动扩缩器资源命名。

{
 "name": "<var>autoscaler-name</var>",
 "target": "regions/us-east1/instanceGroupManagers/<var>instance-group-name</var>",
 "autoscalingPolicy": {
    "maxNumReplicas": <var>max-number-of-instances</var>,
    "cpuUtilization": {
       "utilizationTarget": <var>target-utilization</var>
     },
    "coolDownPeriodSec": <var>seconds</var>
  }
}

例如:

{
 "name": "example-rmig",
 "target": "regions/us-east1/instanceGroupManagers/example-rmig",
 "autoscalingPolicy": {
    "maxNumReplicas": 10,
    "cpuUtilization": {
       "utilizationTarget": 0.8
     },
    "coolDownPeriodSec": 30
  }
}

更新自动扩缩器

您可以更新地区自动扩缩器,就像更新区域自动扩缩器一样。请参阅关于更新自动扩缩程序的文档。

将地区代管实例组添加到负载平衡器

Google Cloud Platform 负载平衡使用实例组来处理流量。您可以将实例组添加到目标池或后端服务中,具体取决于您使用的负载平衡器类型。如需详细了解代管实例组和负载平衡,请参阅实例组概览

您可以将地区级 MIG 指定为用于外部负载平衡内部负载平衡的后端服务的目标,或者将其指定为用于网络负载平衡的目标池的一部分。

对于 HTTP(S) 负载平衡,地区级 MIG 仅支持 maxRatePerInstancemaxUtilization

将地区级代管实例组添加到后端服务

如需创建以下类型的负载平衡服务,必须使用后端服务:

  • 外部 HTTP(S) 负载平衡
  • 内部 HTTP(S) 负载平衡
  • SSL 代理负载平衡
  • TCP 代理负载平衡
  • 内部 TCP/UDP 负载平衡

一个后端服务可以包含多个后端。实例组是一种后端。实例组中的实例会响应来自负载平衡器的流量,轮到的后端服务知道可以使用哪些实例、这些实例可以处理多少流量,以及它们当前正在处理多少流量。此外,后端服务会监控运行状况检查,并且不会向运行状况不佳的实例发送新连接。

可以按照以下说明将代管实例组添加到后端服务。

控制台

  1. 转到 Cloud Console 中的“负载平衡”页面。

    转到“负载平衡”页面

  2. 点击要向其中添加代管实例组的后端服务的名称。
  3. 点击修改
  4. 点击 +添加后端
  5. 选择要添加的实例组。
  6. 修改要更改的任何可选设置。
  7. 保存更改。

gcloud

gcloud 命令行工具中执行 add-backend 命令:

    gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
        --instance-group=INSTANCE_GROUP \
        [--instance-group-region=INSTANCE_GROUP_REGION | --instance-group-zone=INSTANCE_GROUP_ZONE] \
        --balancing-mode=BALANCING_MODE

所需的其他参数取决于代管实例组的平衡模式。如需了解详情,请参阅 SDK 中的 add-backend 命令

API

如需使用 REST API 添加后端服务,请参阅 backendService

将地区代管实例组添加到目标池

目标池是包含一个或多个虚拟机实例的对象。目标池可用于网络负载平衡操作,由网络负载平衡器将用户请求转发到附加的目标池。属于该目标池的实例会处理这些请求并返回响应。 您可以将代管实例组添加到目标池,因此,当您在实例组中添加或移除实例时,目标池也会自动更新并应用这些更改。

目标池必须已经存在,这样您才能将代管实例组添加到目标池。如需了解详情,请参阅关于添加目标池的文档。

如需将现有代管实例组添加到目标池,请按照以下说明操作。完成这些操作后,属于代管实例组的所有虚拟机实例都会被添加到目标池。

控制台

  1. 转到 Cloud Console 中的“目标池”页面。

    转到“目标池”页面

  2. 点击您要向其中添加实例组的目标池。
  3. 点击修改按钮。
  4. 向下滚动到虚拟机实例部分,然后点击选择实例组
  5. 从下拉菜单中选择一个实例组。
  6. 保存更改。

gcloud

gcloud 命令行工具中执行 set-target-pools 命令:

gcloud beta compute instance-groups managed set-target-pools [INSTANCE_GROUP] \
    --target-pools [TARGET_POOL,..] [--region REGION]

其中:

  • [INSTANCE_GROUP] 是此实例组的名称。
  • [TARGET_POOL] 是要向其中添加此实例组的一个或多个目标池的名称。
  • [REGION] 是实例组所在的地区。

API

在 API 中,向以下 URI 发出 POST 请求:

POST https://compute.googleapis.com/compute/beta/projects/[PROJECT_ID]/regions/[REGION]/regionInstanceGroupManagers/[INSTANCE_GROUP]/setTargetPools

其中:

  • [PROJECT_ID] 是此请求的项目 ID。
  • [REGION] 是实例组所在的地区。
  • [INSTANCE_GROUP] 是此实例组的名称。

请求正文应包含您要向其中添加此组的目标池的 URI 列表。例如:

{
  "targetPools": [
    "regions/us-central1/targetPools/example-targetpool-1",
    "regions/us-central1/targetPools/example-targetpool-2"
  ]
}

模拟地区级代管实例组在一个区域发生服务中断的情况

如需测试您的地区级 MIG 的超额预配是否足够,能否在发生区域服务中断后继续运行,您可以使用以下示例来模拟一个区域发生的故障。

默认情况下,此脚本会停止并启动 Apache。如果这不适用于您的应用,请将停止和启动 Apache 的命令替换为您遇到的故障和恢复方案。

  1. 在实例组中的每个虚拟机中连续部署并运行此脚本。您可以通过以下方式完成此操作:将此脚本添加到实例模板,或将此脚本添加到自定义映像中,并在实例模板中使用该映像。

    #!/usr/bin/env bash
    
    # Copyright 2016 Google Inc. All Rights Reserved.
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    set -o nounset
    set -o errexit
    set -o pipefail
    
    function GetMetadata() {
      curl -s "$1" -H "Metadata-Flavor: Google"
    }
    
    PROJECT_METADATA_URL="http://metadata.google.internal/computeMetadata/v1/project/attributes"
    INSTANCE_METADATA_URL="http://metadata.google.internal/computeMetadata/v1/instance"
    ZONE=$(GetMetadata "$INSTANCE_METADATA_URL/zone" | cut -d '/' -f 4)
    INSTANCE_NAME=$(hostname)
    
    # We keep track of the state to make sure failure and recovery is triggered only once.
    STATE="healthy"
    while true; do
      if [[ "$ZONE" = "$(GetMetadata $PROJECT_METADATA_URL/failed_zone)" ]] && \
         [[ "$INSTANCE_NAME" = *"$(GetMetadata $PROJECT_METADATA_URL/failed_instance_names)"* ]]; then
        if [[ "$STATE" = "healthy" ]]; then
          STATE="failure"
          # Do something to simulate failure here.
          echo "STARTING A FAILURE"
          /etc/init.d/apache2 stop
        fi
      else
        if [[ "$STATE" = "failure" ]] ; then
          STATE="healthy"
          # Do something to recover here.
          echo "RECOVERING FROM FAILURE"
          /etc/init.d/apache2 start
        fi
      fi
      sleep 5
    done
    
    
  2. 通过设置以下两个项目元数据字段来模拟在一个区域发生的故障:

    • failed_zone:设置您要在其中模拟服务中断情况的区域(假定只有一个区域发生了故障)。
    • failed_instance_names:按名称选择要离线的虚拟机(假定只有名称包含此字符串的虚拟机发生了故障)。

    您可以使用 gcloud 命令行工具设置此元数据。例如,以下命令设置 europe-west1-b 区域发生服务中断的情况,并影响名称以 instance-base-name 开头的虚拟机:

    gcloud compute project-info add-metadata --metadata failed_zone='europe-west1-b',failed_instance_names='instance-base-name-'
  3. 模拟完服务中断情况后,通过移除元数据键来进行故障恢复:

    gcloud compute project-info remove-metadata --keys failed_zone,failed_instance_names

以下是一些可使用此脚本运行的故障场景:

  • 完全停止应用以查看 MIG 的响应方式。
  • 在进行负载平衡运行状况检查时,使您的虚拟机返回“运行状况不佳”。
  • 修改 iptables 以阻止一部分流量进出虚拟机。
  • 关停虚拟机。默认情况下,地区级 MIG 很快就会重新创建虚拟机,但只要设置了元数据值,新的虚拟机将在脚本运行后立即自行关停。这会导致崩溃循环。

后续步骤