【问题标题】:AWS AutoScaling, downscale - wait for processes terminationAWS AutoScaling,缩减 - 等待进程终止
【发布时间】:2013-12-26 11:07:58
【问题描述】:

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

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

【问题讨论】:

    标签: amazon-web-services amazon-ec2 amazon-sqs autoscaling amazon-sns


    【解决方案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 状态,并且您需要管理该实例。您需要采取以下措施:

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

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

    ps。如果您使用celery 为您的员工提供动力,那么您可以使用remotely ask a worker to shutdown gracefully。除非它完成已开始执行的任务,否则它不会关闭。

    【讨论】:

      【解决方案4】:

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

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

      如果您的目标是#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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-28
        • 1970-01-01
        • 2020-04-21
        • 2021-03-09
        • 2020-09-09
        • 1970-01-01
        • 2021-11-07
        • 1970-01-01
        相关资源
        最近更新 更多