在可用区之间平衡 Amazon ECS 服务
为了帮助您的应用程序实现高可用性,我们建议将您的多任务服务配置在多个可用区之间运行。对于指定其第一个放置策略为可用区分布的服务,Amazon 会尽最大努力在可用的可用区之间均匀分配服务任务。
但是,有时在一个可用区中运行的任务数可能与其他可用区中运行的任务数不同,例如发生可用区中断之后。要解决这种任务不平衡问题,您可以启用可用区重新平衡功能。
通过重新平衡可用区,Amazon ECS 可以持续监控每项服务在可用区之间的任务分配。当 Amazon ECS 检测到任务分配不均匀时,它会自动采取措施在可用区之间重新平衡工作负载。这包括在运行最少任务的可用区中启动新任务,以及在过载的可用区中终止任务。
这种重新分配可确保任意一个可用区都不会成为故障点,从而有助于保持容器化应用程序的总体可用性。自动重新平衡过程无需手动干预,从而缩短了事件发生后的恢复时间。
下面概述了可用区重新平衡过程:
-
Amazon ECS 在达到稳定状态后开始对服务进行监控,并查看每个可用区中运行的任务数。
-
当 Amazon ECS 检测到每个可用区中运行的任务数不平衡时,它会执行以下操作:
-
发送服务事件,指示可用区重新平衡已启动。
-
在运行任务数量最少的可用区中启动任务
-
在运行任务数量最多的可用区中终止任务。
-
调度程序会等待新启动的任务变为
HEALTHY
和RUNNING
状态,然后再终止过载的可用区中的任务。 -
发送包含可用区重新平衡结果的服务事件。
-
Amazon ECS 如何检测任务未平均分配
Amazon ECS 通过将服务所需任务数除以已配置可用区数来确定每个可用区中运行的任务数是否不平衡。如果所需任务数没有平均分配,则 Amazon ECS 会将剩余的任务平均分配到已配置的可用区。每个可用区必须至少有一个任务。
例如,假设一项 Amazon ECS 服务为两个可用区配置了两个所需的任务数。在这种情况下,所需的任务数平均分配。均衡分配即每个可用区一个任务。如果可用区 1 中有两个任务,而可用区 2 中有零个任务,则 Amazon ECS 将在可用区 2 中启动一个任务,然后在可用区 1 中停止一个任务,从而启动重新平衡。
现在,假设一项 Amazon ECS 服务为两个可用区配置了三个所需的任务数。在这种情况下,所需的任务数无法平均分配。均衡分配是可用区 1 中有一个任务而可用区 2 中有两个任务,因为每个可用区至少有一个任务,并将剩余的任务放在可用区 2 中。
假设一项 Amazon ECS 服务为三个可用区配置了五个所需的任务数。在这种情况下,所需的任务数无法平均分配。均衡分配是可用区 1 中有一个任务,可用区 2 和 3 中各有两个任务。考虑到每个可用区各有一个任务后,剩下的两个任务将平均分配到各个可用区。
配置可用区重新平衡的注意事项
要配置可用区重新平衡时,请考虑以下事项:
可用区的重新平衡支持 Fargate 和 EC2 启动类型。对于 Fargate,Amazon ECS 将自动在可用区之间重新分配任务以保持平衡。对于 EC2 启动类型,Amazon ECS 会尽最大努力在现有容器实例之间重新平衡任务,同时兼顾您定义的放置策略和限制。但是,在重新平衡过程中,Amazon ECS 无法在未充分利用的可用区中启动新实例,因此,只能对现有容器实例进行重新平衡。
-
可用区重新平衡适用于以下配置:
-
使用
Replica
策略的服务 -
将可用区分布指定为第一个任务放置策略或未指定放置策略的服务。
-
-
您不能将可用区重新平衡用于满足以下任何条件的服务:
-
使用
Daemon
策略 -
使用
EXTERNAL
启动类型(ECS Anywhere) -
使用 100% 作为
maximumPercent
值 -
使用经典负载均衡器
-
使用
attribute:ecs.availability-zone
作为任务放置约束
-
可用区重新平衡的放置策略和放置约束
放置策略决定了 Amazon ECS 如何选择容器实例和可用区来终止任务放置。任务放置约束是确定是否允许在特定容器实例上运行任务的规则。
对于 EC2 启动类型,您可以将放置策略和放置约束与可用区重新平衡配合使用。但是,要使可用区重新平衡正常运行,必须首先指定可用区分布放置策略。
可用区重新平衡与各种放置策略组合兼容。例如,您可以创建一种策略,其首先在多个可用区之间平均分配任务,然后根据每个可用区内的内存装填任务。在这种情况下,由于首先指定了可用区分布策略,因此可用区重新平衡能正常运行。
值得注意的是,如果放置策略阵列中的第一个策略不是可用区分布组件,则可用区重新平衡将无法正常运行。这一要求可确保任务分配的主要重点是保持可用区之间的平衡,这对于确保高可用性至关重要。
有关任务放置策略和约束的更多信息,请参阅Amazon ECS 如何将任务放置在容器实例上。
使用 Fargate 启动类型的任务不支持任务放置策略和约束。Fargate 将尽最大努力将任务分散到各个可访问的可用区。如果容量提供程序同时包含 Fargate 和 Fargate Spot,则每个容量提供程序的分散行为是独立的。
以下示例策略可在多个可用区中平均分配任务,然后根据每个可用区内的内存装填任务。由于首先指定了 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 |
以下示例显示了如何在创建新服务时启用服务重新平衡:
aws ecs create-service \ --cluster my-cluster \ --service-name my-service \ --task-definition my-task-definition:1 \ --desired-count 6 \ --availability-zone-rebalancing ENABLED
对服务重新平衡进行问题排查
如果遇到服务重新平衡问题,请考虑以下问题排查步骤:
- 重新平衡无法启动
-
验证:
-
服务已启用重新平衡
-
服务使用受支持的配置(请参阅配置可用区重新平衡的注意事项)
-
服务已达到稳定状态
-
- 重新平衡期间任务放置失败
-
如果出现
SERVICE_TASK_PLACEMENT_FAILURE
事件:-
对于 EC2 启动类型:检查目标可用区中是否有可用的容器实例
-
对于 Fargate 启动类型:检查是否存在限制任务放置的资源限制或服务配额
-
查看任务放置限制,确保其不会妨碍正确分配任务
-
- 重新平衡意外停止
-
如果出现
SERVICE_REBALANCING_STOPPED
事件:-
检查是否存在可能阻止操作的任务保护
-
查找可能中断重新平衡的并发服务部署
-
检查服务事件,了解有关重新平衡停止原因的更多信息
-
服务重新平衡的最佳实践
遵循以下最佳实践以充分利用服务重新平衡:
-
监控重新平衡操作:设置 CloudWatch 警报以监控与重新平衡相关的服务事件,从而快速发现任何问题。
-
考虑性能影响:请注意,重新平衡操作可能会暂时增加资源使用量,因为新任务会在旧任务停止之前启动。
-
策略性地使用任务保护:如果在重新平衡期间有不应终止的关键任务,请考虑使用任务保护。
-
规划 EC2 容量:对于 EC2 启动类型,请确保所有可用区都有足够的容器实例来支持有效的重新平衡。
-
测试重新平衡行为:在生产环境中依赖重新平衡之前,在非生产环境中测试服务在重新平衡操作期间的行为。