AWS AutoScaling,缩减 - 等待进程终止
Posted
技术标签:
【中文标题】AWS AutoScaling,缩减 - 等待进程终止【英文标题】:AWS AutoScaling, downscale - wait for processes termination 【发布时间】:2013-12-26 11:07:58 【问题描述】:我想在 SQS 队列较短时使用 AWS AutoScaling 缩减一组实例。 这些实例会做一些繁重的工作,有时需要 5-10 分钟才能完成。我希望在实例终止之前完成这项工作。
我知道很多人应该面临同样的问题。 EC2 是否可以在实例实际终止之前处理 AWS 终止请求并完成我所有正在运行的进程?最好的方法是什么?
【问题讨论】:
【参考方案1】:据我所知,目前没有选项可以在正常关闭时终止实例并让进程完成工作。
建议你看看http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/as-configure-healthcheck.html。
当我们将实例移动到不健康状态而不是缩小 AS 时,我们为 resque 工作人员实施了它。有一个脚本可以不断检查每个实例的健康状态。一旦实例进入不健康状态,它就会优雅地停止所有服务并向 ec2 发送终止信号。
希望对您有所帮助。
【讨论】:
我目前是这样实现的:当任务队列太短时,我们需要缩减规模,而不是调用自动扩展策略,我将消息放入特殊的 sqs 队列'stop-workers',一些工作人员收到了消息并优雅地关闭一切。【参考方案2】:假设您使用的是 linux,您可以创建一个预烘焙的 AMI,您可以在附加到 Auto Scaling 组的启动配置中使用该 AMI。
在 AMI 中,您可以将脚本放在 /etc/init.d
下,例如 /etc/init.d/servicesdown
。该脚本将执行您需要关闭的任何内容,例如 /usr/share/services
下的脚本。
这里有点像要点:
servicesdown
在正常关机时它总是会被执行。
然后说在 Ubuntu/Debian 上你会做这样的事情来将它添加到你的关机序列中:
/usr/sbin/update-rc.d servicesdown stop 25 0 1 6 .
在 CentOS/RedHat 上,您可以使用 chkconfig
命令将其添加到正确的关闭运行级别。
【讨论】:
如果我的工作人员需要 5-10 分钟来完成计算怎么办?亚马逊会一直等待所有终止脚本完成吗?还是可以强制实例关闭? 我相信它会在一段时间后强制关机。您可以打开支持票证进行验证。解决此问题的方法是,您只需在初始关闭脚本上的机器上发出shutdown -h now
,然后在无法 ping 实例或自定义运行状况检查报告 down
时继续通过 AWS API 关闭实例.【参考方案3】:
您也可以使用Lifecycle hooks。您需要一种远程控制特定工作人员的方法,因为 AWS 将选择一个特定实例以置于 Terminating:Wait
状态,并且您需要管理该实例。您需要采取以下措施:
-
指示在实例上运行的工作进程不再接受任何工作。
等待工作人员完成它已经在处理的工作
调用complete-lifecycle 操作。
AWS 会为您处理剩下的事情。
ps。如果您使用celery 为您的员工提供动力,那么您可以使用remotely ask a worker to shutdown gracefully。除非它完成已开始执行的任务,否则它不会关闭。
【讨论】:
【参考方案4】:我偶然发现了这个问题,因为我不想终止正在工作的实例。以为我会在这里分享我的发现。不过有两种方法可以查看:
-
我需要终止一名员工,但我只想终止一名不工作的员工
我需要终止特定工作人员,我希望该特定工作人员等到工作完成。
如果您的目标是#1,亚马逊的新“实例保护”似乎就是为了解决这个问题而设计的。
请参阅下面的链接以获取示例,他们以该代码 sn-p 为例: 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
【讨论】:
以上是关于AWS AutoScaling,缩减 - 等待进程终止的主要内容,如果未能解决你的问题,请参考以下文章
AWS Auto Scaling - 在服务器终止前缩减规模等待 x 分钟