6

Я хочу использовать AWS AutoScaling для масштабирования группы экземпляров, когда очередь SQS коротка. Эти примеры выполняют тяжелую работу, которая иногда требует 5-10 минут. И я хочу, чтобы эта работа была завершена до завершения экземпляра.AWS AutoScaling, downscale - ждать завершения процессов

Я знаю, что многие люди столкнулись с одной и той же проблемой. Возможно ли, чтобы EC2 обработал запрос на завершение AWS и выполнил все мои запущенные процессы до того, как экземпляр фактически завершен? Каков наилучший подход к этому?

ответ

3

Предполагая, что вы используете Linux, вы можете создать предварительно испеченный 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, чтобы добавить его в правильное выключение запуска.

+0

Что делать, если моему работнику требуется 5-10 минут для завершения вычислений? Будет ли Amazon всегда ждать завершения всех сценариев завершения? Или это может привести к отключению экземпляра? –

+0

Я верю, что через некоторое время он отключится. Вы можете открыть подтверждающий билет для проверки. Способ обойти это для вас просто выпустить «shutdown -h now» на компьютере на ваш первоначальный сценарий завершения работы, а затем приступить к завершению работы экземпляра через AWS API, как только вы не сможете выполнить ping экземпляр или ваши пользовательские отчеты о проверке работоспособности 'down'. – Rico

1

Насколько я знаю, в настоящее время нет возможности прекратить действие экземпляра при грамотном завершении работы и завершить процесс завершения работы.

Предлагаю вам посмотреть http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/as-configure-healthcheck.html.

Мы внедрили его для работников resque, в то время как мы перемещаем экземпляр в нездоровое состояние, а затем уменьшаем AS. Существует сценарий, который проверяет состояние работоспособности каждого экземпляра. Когда экземпляр переместится в нездоровое состояние, он прекратит все службы изящно и отправит сигнал окончания в ec2.

Надеюсь, это поможет вам.

+4

я в настоящее время реализуется это следующим образом: когда очередь задача слишком коротка, мы должны уменьшение масштаба, а не вызывать автомасштаба политику я ставлю сообщение для специальной очереди SQS "стоп-работников, некоторые работник получает сообщение и изящно закрывает все. –

4

Вы также можете использовать Lifecycle hooks. Вам понадобится способ удаленного управления конкретным работником, поскольку AWS выберет конкретный экземпляр для ввода состояния Terminating:Wait, и вам необходимо управлять этим экземпляром. Вы должны предпринять следующие действия:

  1. указать, что рабочий процесс, запущенный на экземпляре, не принимает больше работы.
  2. Ждите, пока работник закончит работу, которую он уже обрабатывает
  3. позвонить по телефону complete-lifecycle.

AWS позаботится обо всем остальном.

пс. если вы используете celery для питания своих работников, то вы можете remotely ask a worker to shutdown gracefully. Он не будет завершен, если он не завершит задачи, которые он начал выполнять.

0

Я наткнулся на эту проблему, потому что я не хотел прерывать экземпляр, который выполнял работу. Думал, что поделился бы своими открытиями здесь. Есть два способа смотреть на это, хотя:

  1. мне нужно прекратить рабочий, но я только хочу, чтобы прекратить тот, который не работает
  2. мне нужно прекратить КОНКРЕТНЫЙ работник, и я хочу, что конкретный работник в подождите, пока это будет сделано с работой.

Если вы являетесь целью № 1, новая «защита экземпляров» Amazon выглядит так, как будто она была разработана для решения этой проблемы.

Смотрите ссылку ниже для примера, они дают этот фрагмент кода в качестве примера: 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, а затем при масштабировании In экземпляры не должны прерываться, если они защищены (в настоящее время работают).

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

Смежные вопросы