如何处理自动缩放期间网络流量的突然激增

How to handle a sudden spike in web traffic during Autoscaling

我在 ELB 后面和 Auto Scaling 组中有两个 EC2 实例。扩容政策如下:

CPUUtilization >= 70 持续 300 秒(添加一台服务器)

在进行 Atoscaling activity 时,现有实例上的负载已经达到 99%,并且正在断开连接。

有什么方法可以更有效地处理这个问题吗?

Auto Scaling 的诀窍在于定义一个可以准确识别系统负载的警报。

CPU 利用率并不总是正确的衡量标准——您的应用程序可能只能处理有限数量的连接,它可能会压缩 RAM,并且请求的类型也可能会有所不同。

一个好主意是 在峰值负载 期间密切监视您的系统以确定准确的信号 来识别繁忙时段(或者,甚至更好的是,可以帮助您预测即将到来的繁忙时段)。在您的个人实例上使用标准监控工具,例如监控可用内存、应用程序用户数、事务数等

您可以使用普通的监控工具,或者您可以编写将指标推送到 Amazon CloudWatch 的东西,这样您就可以超越基本的 CPU 和网络指标CloudWatch 通常提供。您甚至可以使用 Load Balancer 的 Latency 指标在应用程序变慢时触发缩放(需要自定义代码)。

一旦您有可靠的信号来检测系统何时接近容量并需要横向扩展,您就可以专注于缩短添加新容量的时间。测量新实例启动和开始接受流量所需的时间。尝试通过使用完全配置的 AMI 而不是通过用户数据安装软件来减少启动时间。也许您可以删除或关闭实例上的服务以使其启动更快。尝试使用不同的 EBS 卷类型(例如,通用 SSD 可以爆发高达 3000 IOP)和不同的实例类型。

甚至可以更早地横向扩展(例如 50%)——与为用户提供的改进服务相比,额外费用可能微不足道。

您的目标应该是确保用户永远不会遇到服务缓慢或连接中断的情况。

检查您的实例的状态是否健康。如果突然出现大量流量,实例/容器实例通常会进入不健康/耗尽静态状态。
在这种情况下,设置自动缩放策略以检测被丢弃的最小健康实例数,并相应地将您的实例缩放到至少比最小阈值高出 50%。例如,一个系统 运行 30 个健康实例突然下降到 25 个,然后自动扩展到额外的 45 个实例,以便它可以处理突然的峰值。 稍后随着流量降温,您对 CPU、内存等指标的缩减策略可以将这 45 个实例减少到所需数量。