AWS - 如何防止负载均衡器在负载下终止实例?
AWS - how to prevent load balancer from terminating instances under load?
我正在编写一个网络服务,将客户数据打包成 zip 文件,然后将它们上传到 S3 以供下载。这是一个按需过程,数据量可以从几兆字节到几千兆字节不等,具体取决于客户订购的数据。
不用说,可扩展性对于此类服务至关重要。但是我遇到了麻烦。必须在服务器实例的本地硬盘驱动器上将数据打包成 zip 文件。
但是负载均衡器很容易终止仍在工作的实例。我查看了扩展策略:
http://docs.aws.amazon.com/autoscaling/latest/userguide/as-instance-termination.html
但是我需要的好像没有。这个问题应该没有那么难:我将比例指标设置为 CPU 负载,并在低于 1% 时缩小比例。但我需要保证将终止违反阈值的确切实例,而不是另一个仍在努力工作的实例,并且可用的策略似乎没有向我提供该选项。现在,我不知道如何实现这一目标。有人可以给我一些建议吗?
您可以使用 Auto Scaling Lifecycle Hooks 在实例终止前执行操作。您可以使用它来等待处理完成,然后再继续实例终止。
听起来您需要的是实例保护,实际上在您链接到的文档的底部提到了它。只要您在特定实例上执行工作,它就不应该被 Auto-Scaling 组 (ASG) 自动终止。
Check out this blog post,在 AWS 官方博客上,从概念上讨论了如何使用实例保护来防止工作过早终止。
您似乎已经配置了一个 Auto Scaling 组,其扩展策略基于CPU 利用率。
请注意,弹性负载均衡器永远不会终止 Amazon EC2 实例——如果负载均衡器健康检查失败,它只会停止向该 EC2 实例提供流量,直到它再次通过健康检查。可以将 Auto Scaling 配置为使用 ELB 健康检查,在这种情况下,Auto Scaling 将终止 ELB 标记为不健康的任何实例。
因此,由于您的扩展策略,Auto Scaling 似乎负责终止您的实例。您说您希望终止未使用的特定实例。然而,这并不是 Auto Scaling 的一般意图。相反,Auto Scaling 用于提供可以通过启动新实例和终止不需要的实例来扩展的资源池。触发 Auto Scaling 的指标通常基于整个 Auto Scaling 组的聚合指标(例如 average CPU Utilization)。
鉴于 Amazon EC2 实例按小时收费,通常最好将实例 运行 保持更长的时间——“快速扩展,缓慢扩展".
一旦 Auto Scaling 决定终止一个实例(它通过 termination policy), use an Auto Scaling lifecycle hook 选择延迟终止直到准备就绪(例如,将日志文件复制到 S3,或等待一个漫长的过程完成)。
如果您希望在实例完成特定工作负载后终止实例,则无需使用 Auto Scaling——只需在实例完成后将其关闭即可, 并将 Shutdown Behavior 设置为 terminate
以在关闭时自动终止实例。 (这假设您有一个流程可以在您有工作要执行时启动新实例。)
退一步看看你的整体架构,看起来你在网络服务器前面有一个负载平衡器,并且你正在网络服务器上执行 Zip 操作?这不是一个可扩展的解决方案。如果您的 Web 服务器将消息推送到 Amazon 简单队列服务 (SQS) 队列,然后您的 back-end 服务器群处理来自队列的消息,那就更好了。这样,无论正在进行的处理量如何,您的 front-end 都可以继续接收请求。
我正在编写一个网络服务,将客户数据打包成 zip 文件,然后将它们上传到 S3 以供下载。这是一个按需过程,数据量可以从几兆字节到几千兆字节不等,具体取决于客户订购的数据。 不用说,可扩展性对于此类服务至关重要。但是我遇到了麻烦。必须在服务器实例的本地硬盘驱动器上将数据打包成 zip 文件。
但是负载均衡器很容易终止仍在工作的实例。我查看了扩展策略: http://docs.aws.amazon.com/autoscaling/latest/userguide/as-instance-termination.html
但是我需要的好像没有。这个问题应该没有那么难:我将比例指标设置为 CPU 负载,并在低于 1% 时缩小比例。但我需要保证将终止违反阈值的确切实例,而不是另一个仍在努力工作的实例,并且可用的策略似乎没有向我提供该选项。现在,我不知道如何实现这一目标。有人可以给我一些建议吗?
您可以使用 Auto Scaling Lifecycle Hooks 在实例终止前执行操作。您可以使用它来等待处理完成,然后再继续实例终止。
听起来您需要的是实例保护,实际上在您链接到的文档的底部提到了它。只要您在特定实例上执行工作,它就不应该被 Auto-Scaling 组 (ASG) 自动终止。
Check out this blog post,在 AWS 官方博客上,从概念上讨论了如何使用实例保护来防止工作过早终止。
您似乎已经配置了一个 Auto Scaling 组,其扩展策略基于CPU 利用率。
请注意,弹性负载均衡器永远不会终止 Amazon EC2 实例——如果负载均衡器健康检查失败,它只会停止向该 EC2 实例提供流量,直到它再次通过健康检查。可以将 Auto Scaling 配置为使用 ELB 健康检查,在这种情况下,Auto Scaling 将终止 ELB 标记为不健康的任何实例。
因此,由于您的扩展策略,Auto Scaling 似乎负责终止您的实例。您说您希望终止未使用的特定实例。然而,这并不是 Auto Scaling 的一般意图。相反,Auto Scaling 用于提供可以通过启动新实例和终止不需要的实例来扩展的资源池。触发 Auto Scaling 的指标通常基于整个 Auto Scaling 组的聚合指标(例如 average CPU Utilization)。
鉴于 Amazon EC2 实例按小时收费,通常最好将实例 运行 保持更长的时间——“快速扩展,缓慢扩展".
一旦 Auto Scaling 决定终止一个实例(它通过 termination policy), use an Auto Scaling lifecycle hook 选择延迟终止直到准备就绪(例如,将日志文件复制到 S3,或等待一个漫长的过程完成)。
如果您希望在实例完成特定工作负载后终止实例,则无需使用 Auto Scaling——只需在实例完成后将其关闭即可, 并将 Shutdown Behavior 设置为 terminate
以在关闭时自动终止实例。 (这假设您有一个流程可以在您有工作要执行时启动新实例。)
退一步看看你的整体架构,看起来你在网络服务器前面有一个负载平衡器,并且你正在网络服务器上执行 Zip 操作?这不是一个可扩展的解决方案。如果您的 Web 服务器将消息推送到 Amazon 简单队列服务 (SQS) 队列,然后您的 back-end 服务器群处理来自队列的消息,那就更好了。这样,无论正在进行的处理量如何,您的 front-end 都可以继续接收请求。