AWS - 如何防止负载均衡器终止负载下的实例?

时间:2017-01-24 16:32:01

标签: amazon-web-services amazon-elb

我正在编写一个将客户数据打包成zip文件的网络服务,然后将它们上传到S3进行下载。这是一个按需过程,数据量可以从几兆字节到几千兆字节,具体取决于客户订购的数据。 毋庸置疑,可扩展性对于此类服务至关重要。但是我遇到了麻烦。将数据打包成zip文件必须在服务器实例的本地硬盘上完成。

但负载均衡器很容易终止仍在工作的实例。我看了一下扩展策略: http://docs.aws.amazon.com/autoscaling/latest/userguide/as-instance-termination.html

但我需要的东西似乎并不存在。问题不应该那么困难:我将比例度量设置为CPU负载,并在低于1%时缩小。但我需要保证确切的实例将被终止,超过了阈值,而不是另一个仍在努力工作的实例,并且可用的策略似乎并没有向我提供该选项。现在,我不知道如何实现这一目标。有人可以给我一些建议吗?

3 个答案:

答案 0 :(得分:2)

您可以使用Auto Scaling Lifecycle Hooks在实例终止之前执行操作。您可以使用它来等待处理完成,然后再继续实例终止。

答案 1 :(得分:1)

您似乎已根据CPU利用率配置了 Auto Scaling组和扩展策略。

请注意, Elastic Load Balancer永远不会终止Amazon EC2实例 - 如果Load Balancer运行状况检查失败,它将仅停止为该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 - 只需在实例完成后关闭实例,并设置{ {3}}到terminate在关机时自动终止实例。 (这假设您有一个进程来在您希望执行工作时启动新实例。)

退一步看一下您的整体架构,看来您在Web服务器前面有一个Load Balancer,而您正在Web服务器上执行Zip操作?这不是一个可扩展的解决方案。如果您的Web服务器将消息推送到 Amazon Simple Queue Service(SQS)队列,然后您的后端服务器队列处理来自队列的消息,那会更好。这样,无论正在进行的处理量如何,您的前端都可以继续接收请求。

答案 2 :(得分:0)

听起来你需要的是Instance Protection,它实际上被提到了更多关于你链接到的文档的底部。只要您在特定实例上执行了工作,它就不应该由Auto-Scaling Group(ASG)自动终止。

Check out this blog post,在官方AWS博客上,概念性地讨论了如何使用实例保护来防止工作过早终止。