关于自动扩缩组的运行状况检查 - Amazon EC2 Auto Scaling
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

关于自动扩缩组的运行状况检查

本主题概述了可用的运行状况检查类型,并介绍了将 Amazon EC2 Auto Scaling 运行状况检查与您的应用程序集成的关键注意事项。

运行状况检查类型

Amazon EC2 Auto Scaling 可以使用以下一项或多项运行状况检查来确定InService实例的运行状况:

运行状况检查类型 检查内容

Amazon EC2 状态检查和计划事件

  • 检查实例是否正在运行。

  • 检查是否存在可能损害实例的底层硬件或软件问题。

这是自动扩缩组的默认运行状况检查类型。

Elastic Load Balancing 运行状况检查

  • 检查负载均衡器是否报告实例运行正常,确认该实例是否可用于处理请求。

要运行这种运行状况检查类型,您必须为自己的 Auto Scaling 组将其打开。

VPC Lattice 运行状况检查

  • 检查 VPC Lattice 是否报告实例运行正常,确认该实例是否可用于处理请求。

要运行这种运行状况检查类型,您必须为自己的 Auto Scaling 组将其打开。

自定义运行状况检查

  • 根据您的自定义运行状况检查,检查是否存在可能表明实例运行状况存在问题的任何其他问题。

Amazon EC2 运行状况检查

实例启动后,它会附加到自动扩缩组并进入 InService 状态。要详细了解 Auto Scaling 组中实例的不同生命周期状态,请参阅 Amazon EC2 Auto Scaling 实例生命周期

Amazon EC2 Auto Scaling 通过定期检查自动扩缩组中所有实例的运行状态,以确保所有实例都在运行并且运行正常。

状态检查

Amazon EC2 Auto Scaling 使用 Amazon EC2 实例状态检查和系统状态检查的结果来确定实例的运行状况。如果实例状态是除 running 以外的其他 Amazon EC2 状态,或者状态检查的状态变为 impaired,则 Amazon EC2 Auto Scaling 会认为实例运行不正常并予以替换。这包括当实例为任何以下状态时:

  • stopping

  • stopped

  • shutting-down

  • terminated

Amazon EC2 状态检查不需要任何特殊配置,并且始终处于启用状态。有关更多信息,请参阅 Amazon EC2 用户指南中的状态检查类型

重要

Amazon EC2 Auto Scaling 会允许这些状态检查偶尔失败,而不执行任何操作。当状态检查失败时,Amazon EC2 Auto Scaling 会等待几分钟 Amazon 才能修复问题。它不会在状态检查的状态变为 impaired 时立即将实例标记为 Unhealthy

但如果 Amazon EC2 Auto Scaling 检测到实例不再处于 running 状态,这种情况将被视为立即失败。在这种情况下,它会立即将实例标记为Unhealthy并替换它。

计划的事件

Amazon EC2 偶尔可以将实例上的事件安排在特定时间戳之后运行。有关更多信息,请参阅 Amazon EC2 用户指南中的实例计划事件

如果其中一个实例受到计划事件的影响,则 Amazon EC2 Auto Scaling 会认为实例运行不正常并将其替换。直到到达时间戳中指定的日期和时间后,实例才会开始关闭。

Elastic Load Balancing 运行状况检查

当您为 Auto Scaling 组启用 Elastic Load Balancing 运行状况检查时,Amazon EC2 Auto Scaling 可以使用这些运行状况检查的结果来确定实例的运行状况。

在为 Auto Scaling 组启用 Elastic Load Balancing 运行状况检查之前,您必须配置 Elastic Load Balancing 负载均衡器并为其配置运行状况检查以确定您的实例是否运行正常。有关更多信息,请参阅 准备将 Elastic Load Balancing 负载均衡器连接到您的 Auto Scaling 组

将负载均衡器连接到 Auto Scaling 组后,会发生以下情况:

  • Amazon EC2 Auto Scaling 会将自动扩缩组中的实例注册到该负载均衡器。

  • 实例完成注册后,它会进入 InService 状态并可与该负载均衡器一起使用。

预设情况下,Amazon EC2 Auto Scaling 会忽略 Elastic Load Balancing 运行状况检查的结果。在您为 Auto Scaling 组开启这些运行状况检查后,当 Elastic Load Balancing 将注册实例报告为时Unhealthy,Amazon EC2 Auto Scaling 会在下一次定期运行状况检查中标记该实例Unhealthy并将其替换。

如果为负载均衡器启用了连接耗尽(注销延迟),则在终止运行不正常的实例之前,Amazon EC2 Auto Scaling 会等待进行中的请求完成或等待最大超时过期。

注意

有关如何连接负载均衡器以及如何为 Auto Scaling 组启用 Elastic Load Balancing 运行状况检查的说明,请参阅将 Elastic Load Balancing 负载均衡器附加到您的 Auto Scaling 组

当您为组启用 Elastic Load Balancing 运行状况检查时,Amazon EC2 Auto Scaling 可以替换 Elastic Load Balancing 报告为运行状况不佳的实例,但前提是负载均衡器处于该InService状态。有关更多信息,请参阅 验证负载均衡器的附加状态

VPC Lattice 运行状况检查

预设情况下,Amazon EC2 Auto Scaling 会忽略 VPC Lattice 运行状况检查的结果。您可以选择为自己的 Auto Scaling 组开启这些运行状况检查。完成此操作后,当 VPC Lattice 报告某个注册的实例为 Unhealthy 时,Amazon EC2 Auto Scaling 会在下一次定期运行状况检查中将实例标记为 Unhealthy 并予以替换。注册实例然后检查其运行状况的过程与 Elastic Load Balancing 运行状况检查的过程相同。

注意

有关如何连接 VPC 莱迪思目标组以及如何为您的 Auto Scaling 组启用 VPC 莱迪思运行状况检查的说明,请参阅。将 VPC Lattice 目标组附加到您的自动扩缩组

当您为群组启用 VPC Lattice 运行状况检查时,Amazon EC2 Auto Scaling 可以替换 VPC Lattice 报告为运行状况不佳的实例,但前提是目标组处于该状态。InService有关更多信息,请参阅 验证您的 VPC Lattice 目标组的附件状态

Amazon EC2 Auto Scaling 如何尽可能减少停机时间

默认情况下,新实例是在终止现有实例的同时配置的,这可能会阻止新请求在新实例完全运行之前被接受。

如果 Amazon EC2 Auto Scaling 确定任何实例已停止运行(或者它们被标有 Unhealthy s et-instance-health 命令),它会立即替换它们。但如果发现其他实例运行不正常,Amazon EC2 Auto Scaling 将使用以下故障恢复方法。这种方法可尽可能减少可能因临时问题或运行状况检查配置错误导致的任何停机时间。

  • 如果扩展活动正在进行中,并且您的 Auto Scaling 组的容量少于其所需容量 10% 或更多,则 Amazon EC2 Auto Scaling 会等待正在进行的扩展活动,然后再替换运行状况不佳的实例。

  • 在进行横向扩展时,Amazon EC2 Auto Scaling 将首先等待实例通过初始运行状况检查。它还会等待默认实例预热完成,以确保新实例准备就绪。

  • 在实例完成预热并且该组已达到所需容量的 90% 以上之后,Amazon EC2 Auto Scaling 将按如下方式替换运行状况不佳的实例:

    • Amazon EC2 Auto Scaling 一次只替换该组所需容量的 10%。它将在所有运行不正常的实例都被替换之前持续这样操作。

    • 在替换实例时,它会等待新实例通过初始运行状况检查。它还会等待默认的实例预热期结束,然后再继续操作。

注意

如果 Auto Scaling 组的大小足够小,结果值 10% 小于 1,则 Amazon EC2 Auto Scaling 会逐一替换运行状况不佳的实例。这可能会导致该组出现短暂停机。

此外,如果 Elastic Load Balancing 运行状况检查报告自动扩缩组中的所有实例都不正常,并且负载均衡器位于 InService 状态,则 Amazon EC2 Auto Scaling 可能会减少一次标记为运行不正常的实例数量。这可能会导致一次替换的实例数量少于在其他场景中执行的 10% 这一比例。这使您有时间修复问题,而不会让 Amazon EC2 Auto Scaling 自动终止整个群组。

Health 检查温池中实例的运行状况

Amazon EC2 Auto Scaling 还会对温池中的实例执行运行状况检查。有关更多信息,请参阅 查看运行状况检查状态以及运行状况检查失败的原因

运行状况检查注意事项

以下是使用 Amazon EC2 Auto Scaling 运行状况检查时的注意事项。

  • 如果您需要在正在终止的实例上或正在启动的实例上执行某些操作,则可以使用生命周期钩子。借助这些钩子,您可以在 Amazon EC2 Auto Scaling 启动或终止实例时执行自定义操作。有关更多信息,请参阅 Amazon EC2 Auto Scaling 生命周期钩子

  • Amazon EC2 Auto Scaling 没有提供从运行状况检查中移除 Amazon EC2 状态检查和计划事件的方法。如果您不想替换实例,则建议暂停任何单个 Auto Scaling 组的 ReplaceUnhealthyHealthCheck 进程。有关更多信息,请参阅 暂停和恢复 Amazon EC2 Auto Scaling 流程

  • 您可以尝试使用 set-instance-health 命令,从而手动将运行不正常实例的运行状态重新设置为Healthy。如果您收到错误消息,则可能是因为该实例已经开始终止。通常,使用 set-instance-health 命令将实例的运行状态重新设置为Healthy的方法仅在ReplaceUnhealthy进程或Terminate进程已暂停时有用。

  • 如果您需要在不受运行状况检查干扰的情况下对实例进行故障排除,则可以将该实例置于Standby状态。在您恢复使用Standby状态之前,Amazon EC2 Auto Scaling 不会对处于该状态的实例执行运行状况检查。有关更多信息,请参阅 临时从 Auto Scaling 组中移除实例

  • 实例终止后,任何关联的弹性 IP 地址都会取消关联,并且不会自动与新实例关联。必须手动将弹性 IP 地址关联到新实例,或者使用基于生命周期挂钩的解决方案自动完成关联。有关更多信息,请参阅《Amazon EC2 用户指南》中的弹性 IP 地址

  • 同样,实例终止后,其挂载的 EBS 卷也将被分离(或删除,具体取决于卷的 DeleteOnTermination 属性)。必须手动将这些 EBS 卷挂载到新实例,或者使用基于生命周期挂钩的解决方案自行完成挂载。有关更多信息,请参阅《Amazon EBS 用户指南》中的将 Amazon EBS 卷挂载到实例

自定义运行状况检查

您也可以选择在自动扩缩组中的实例上运行自定义运行状况检测任务,如果任务失败,则将实例的运行状况设为运行Unhealthy。从而通过组合使用自定义运行状况检查、Amazon EC2 状态检查和 Elastic Load Balancing 运行状况检查(如果启用)来扩展运行状况检查的范围。

您可以使用 Amazon CLI 或 SDK 将实例运行状况信息直接发送到 Amazon EC2 Auto Scaling。以下示例说明如何使用配置实例的运行状况,然后验证实例的运行状况。 Amazon CLI

使用以下 set-instance-health 命令,将指定实例的运行状态设置为 Unhealthy

aws autoscaling set-instance-health --instance-id i-1234567890abcdef0 --health-status Unhealthy

默认情况下,此命令会执行运行状况检查宽限期。不过,您可以通过包括 --no-should-respect-grace-period 选项来覆盖此行为,不执行此宽限期。

使用以下 describe-auto-scaling-groups 命令验证实例运行状况为 Unhealthy

aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names my-asg

下面是一个示例响应,说明实例的运行状况为 Unhealthy 并且实例正在终止。

{ "AutoScalingGroups": [ { .... "Instances": [ { "ProtectedFromScaleIn": false, "AvailabilityZone": "us-west-2a", "LaunchTemplate": { "LaunchTemplateName": "my-launch-template", "Version": "1", "LaunchTemplateId": "lt-1234567890abcdef0" }, "InstanceId": "i-1234567890abcdef0", "InstanceType": "t2.micro", "HealthStatus": "Unhealthy", "LifecycleState": "Terminating" }, ... ] } ] }