8

当 SQS 队列较短时,我想使用 AWS AutoScaling 缩减一组实例。这些实例会做一些繁重的工作,有时需要 5-10 分钟才能完成。我希望在实例终止之前完成这项工作。

我知道很多人应该面临同样的问题。EC2 是否可以在实例实际终止之前处理 AWS 终止请求并完成我所有正在运行的进程?最好的方法是什么?

4

4 回答 4

5

你也可以使用Lifecycle hooks。您需要一种远程控制特定工作人员的方法,因为 AWS 会选择一个特定的实例来设置Terminating:Wait状态,而您需要管理该实例。您需要采取以下措施:

  1. 指示在实例上运行的工作进程不再接受任何工作。
  2. 等待工人完成它已经在处理的工作
  3. 调用完整的生命周期操作。

AWS 将为您处理剩下的事情。

附言。如果您使用celery为您的工作人员供电,那么您可以远程要求工作人员正常关机。除非它完成已开始执行的任务,否则它不会关闭。

于 2015-01-08T12:05:44.347 回答
4

假设您使用的是 linux,您可以创建一个预烘焙 AMI,您可以在附加到 Auto Scaling 组的启动配置中使用该 AMI。

在 AMI 中,您可以在/etc/init.dsay下放置一个脚本/etc/init.d/servicesdown。该脚本将执行您需要关闭的任何内容,/usr/share/services例如下面的脚本。

这里有点像要点:

服务关闭

在进行正常关机时,它总是会被执行。

然后在 Ubuntu/Debian 上说你会做这样的事情来将它添加到你的关机序列中:

/usr/sbin/update-rc.d servicesdown stop 25 0 1 6 .

在 CentOS/RedHat 上,您可以使用chkconfig命令将其添加到正确的关闭运行级别。

于 2013-12-12T19:43:08.940 回答
2

我偶然发现了这个问题,因为我不想终止正在工作的实例。以为我会在这里分享我的发现。不过,有两种方法可以查看:

  1. 我需要终止一个工人,但我只想终止一个不工作的工人
  2. 我需要终止一个特定的工作人员,并且我希望那个特定的工作人员等到它完成工作。

如果你的目标是#1,亚马逊的新“实例保护”看起来就是为了解决这个问题而设计的。

有关示例,请参见以下链接,他们以此代码段为例: https ://aws.amazon.com/blogs/aws/new-instance-protection-for-auto-scaling/

while (true)
{
  SetInstanceProtection(False);
  Work = GetNextWorkUnit();
  SetInstanceProtection(True);
  ProcessWorkUnit(Work);
  SetInstanceProtection(False);
}

我自己没有对此进行测试,但我看到与设置保护相关的 API 调用,因此看来这可以集成到 EC2 Worker App 代码库中,然后在扩展时,如果实例不应该被终止受保护(当前工作)。

http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/autoscaling/AmazonAutoScaling.html

于 2016-07-15T15:08:22.667 回答
1

据我所知,目前没有选项可以在正常关闭时终止实例并让进程完成工作。

我建议您查看http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/as-configure-healthcheck.html

当我们将实例移动到不健康状态而不是缩小 AS 时,我们为 resque 工作人员实现了它。有一个脚本可以不断检查每个实例的健康状态。一旦实例进入不健康状态,它就会优雅地停止所有服务并向 ec2 发送终止信号。

希望它可以帮助你。

于 2013-12-12T18:59:39.683 回答