在可用区之间平衡 Amazon ECS 服务
为了帮助您的应用程序实现高可用性,我们建议将您的多任务服务配置在多个可用区之间运行。对于指定其第一个放置策略为可用区分布的服务,Amazon 会尽最大努力在可用的可用区之间均匀分配服务任务。但是,有时在一个可用区中运行的任务数可能与其他可用区中运行的任务数不同,例如发生可用区中断之后。要解决这种任务不平衡问题,您可以启用可用区重新平衡功能。通过重新平衡可用区,Amazon ECS 可以持续监控每项服务在可用区之间的任务分配。当 Amazon ECS 检测到任务分配不均匀时,它会自动采取措施在可用区之间重新平衡工作负载。这包括在运行最少任务的可用区中启动新任务,以及在过载的可用区中终止任务。这种重新分配可确保任意一个可用区都不会成为故障点,从而有助于保持容器化应用程序的总体可用性。自动重新平衡过程无需手动干预,从而缩短了事件发生后的恢复时间。
下面概述了可用区重新平衡过程:
-
Amazon ECS 在达到稳定状态后开始对服务进行监控,并查看每个可用区中运行的任务数。
-
当 Amazon ECS 检测到每个可用区中运行的任务数不平衡时,它会执行以下操作:
-
发送服务事件,指示可用区重新平衡已启动。
-
在运行任务数量最少的可用区中启动任务
-
在运行任务数量最多的可用区中终止任务。
-
调度程序会等待新启动的任务变为
HEALTHY
和RUNNING
状态,然后再终止过载的可用区中的任务。 -
发送包含可用区重新平衡结果的服务事件。
-
可用区的重新平衡支持 Fargate 和 EC2 启动类型。对于 Fargate,Amazon ECS 将自动在可用区之间重新分配任务以保持平衡。对于 EC2 启动类型,Amazon ECS 会尽最大努力在现有容器实例之间重新平衡任务,同时兼顾您定义的放置策略和限制。但是,在重新平衡过程中,ECS 无法在未充分利用的可用区中预置新实例,因此只能对现有容器实例进行重新平衡。
可用区重新平衡适用于以下配置:
-
使用
Replica
策略的服务 -
将可用区分布指定为第一个任务放置策略或未指定放置策略的服务。
您不能将可用区重新平衡用于满足以下任何条件的服务:
-
使用
Daemon
策略 -
使用
EXTERNAL
启动类型(ECS Anywhere) -
使用 100% 作为
maximumPercent
值 -
使用经典负载均衡器
-
使用
attribute:ecs.availability-zone
作为任务放置约束
可用区重新平衡的放置策略和放置约束
放置策略决定了 Amazon ECS 如何选择容器实例和可用区来终止任务放置。任务放置约束是确定是否允许在特定容器实例上运行任务的规则。对于 EC2 启动类型,您可以将放置策略和放置约束与可用区重新平衡配合使用。但是,要使可用区重新平衡正常运行,必须首先指定可用区分布放置策略。可用区重新平衡与各种放置策略组合兼容。例如,您可以创建一种策略,其首先在多个可用区之间平均分配任务,然后根据每个可用区内的内存装填任务。在这种情况下,由于首先指定了可用区分布策略,因此可用区重新平衡能正常运行。值得注意的是,如果放置策略阵列中的第一个策略不是可用区分布组件,则可用区重新平衡将无法正常运行。这一要求可确保任务分配的主要重点是保持可用区之间的平衡,这对于确保高可用性至关重要。有关任务放置策略和约束的更多信息,请参阅Amazon ECS 如何将任务放置在容器实例上。
以下示例策略可在多个可用区中平均分配任务,然后根据每个可用区内的内存装填任务。由于首先指定了 spread
策略,因此可用区重新平衡能够与服务兼容。
"placementStrategy": [ { "field": "attribute:ecs.availability-zone", "type": "spread" }, { "field": "memory", "type": "binpack" } ]
开启可用区重新平衡
您需要为新服务和现有服务启用可用区重新平衡。
您可以使用控制台、API 或 Amazon CLI 启用和禁用可用区重新平衡。
服务类型 | API | 控制台 | CLI |
---|---|---|---|
现有 | UpdateService | 使用控制台更新 Amazon ECS 服务 | update-service |
New | CreateService | 使用控制台创建 Amazon ECS 服务 | create-service |