【问题标题】:AWS - how to prevent load balancer from terminating instances under load?AWS - 如何防止负载均衡器在负载下终止实例?
【发布时间】:2017-01-24 16:32:01
【问题描述】:
【问题讨论】:
标签:
amazon-web-services
amazon-elb
【解决方案2】:
您似乎已为 Auto Scaling 组配置了基于 CPU 利用率的扩展策略。
请注意,弹性负载均衡器永远不会终止 Amazon EC2 实例——如果负载均衡器运行状况检查失败,它只会停止向该 EC2 实例提供流量,直到它再次通过运行状况检查。可以将 Auto Scaling 配置为使用 ELB 健康检查,在这种情况下,Auto Scaling 将终止 ELB 标记为不健康的任何实例。
因此,由于您的扩展策略,Auto Scaling 似乎负责终止您的实例。您说您希望终止未使用的特定实例。但是,这不是 Auto Scaling 的总体意图。相反,Auto Scaling 用于提供可通过启动新实例和终止不需要的实例来扩展的资源池。触发 Auto Scaling 的指标通常基于整个 Auto Scaling 组的聚合指标(例如平均 CPU 利用率)。
鉴于 Amazon EC2 实例按小时计费,让实例运行更长时间通常是个好主意——“快速扩展,缓慢缩减”。
一旦 Auto Scaling 决定终止实例(它通过 termination policy 选择),使用 Auto Scaling lifecycle hook 将终止延迟到准备就绪(例如,将日志文件复制到 S3,或等待很长的进程完成)。
如果您确实希望在实例完成特定工作负载后终止它,则无需使用 Auto Scaling - 只需在实例完成时关闭实例,然后设置 @ 987654323@ 到 terminate 在关闭时自动终止实例。 (这假设您有一个流程可以在您有想要执行的工作时启动新实例。)
回过头来看看您的总体架构,您似乎在 Web 服务器前面有一个负载均衡器,并且您正在 Web 服务器上执行 Zip 操作?这不是一个可扩展的解决方案。如果您的 Web 服务器将消息推送到 Amazon Simple Queue Service (SQS) 队列中,然后您的后端服务器队列处理来自队列的消息,那就更好了。这样,您的前端可以继续接收请求,而不管正在进行的处理量如何。
【解决方案3】:
听起来您需要的是实例保护,实际上在您链接到的文档底部更多地提到了它。只要您在特定实例上执行工作,它就不会被 Auto-Scaling Group (ASG) 自动终止。
Check out this blog post,在官方 AWS 博客上,从概念上讨论了如何使用实例保护来防止工作被过早终止。