У нас есть группа автомасштабирования, которая порождает рабочие серверы. Каждый рабочий сервер запускает процессы сельдерея. Мы отслеживаем длину очереди сельдерея с помощью cloudwatch и, в зависимости от длины очереди, создаем / убиваем сервер автоматического масштабирования. В этом ответе вы видите, как мы это делаем: Есть ли способ использовать длину очереди RabbitMQ, используемой Celery для запуска экземпляра в группе автомасштабирования?
Наша политика завершения - сначала убить самый старый сервер. Это происходит, когда длина очереди равна нулю в течение 300 секунд.
Обычная установка имеет 3 сервера, которые всегда доступны. Группа автомасштабирования срабатывает только тогда, когда длина очереди превышает определенное число. Предположим, что в очереди постоянно находится 10 заданий на 30 секунд.
Я не настраивал ни маршрутизацию, ни приоритет в моей конфигурации сельдерея.
Вот в чем проблема. Когда происходит уменьшение масштаба, я не совсем уверен, что убиваемый хост свободен, потому что ко всем рабочим относятся одинаково. Задачи иногда занимают до 5-10 минут, и я не хочу, чтобы сервер был убит, если он находится в процессе выполнения задачи.
Пока с проблемами не сталкивался. Но я боюсь, что некоторые из наших клиентов могут столкнуться с проблемой из-за этого.
Вы можете использовать событие жизненного цикла для выполнения настраиваемых действий, когда экземпляр находится в состоянии «завершение: ожидание».
Создайте крючок жизненного цикла в соответствии с шагами на эта страница, скопировано ниже. В этом состоянии скрипт или Lambda могут держать экземпляр открытым до тех пор, пока не будут выполнены все задания. На странице, на которую я указал, есть дополнительная информация о периодах восстановления.
Группа Auto Scaling реагирует на события масштабирования запуском экземпляров, а события масштабирования - завершением экземпляров.
Ловушка жизненного цикла переводит экземпляр в состояние ожидания (Pending: Wait или Terminating: Wait). Экземпляр приостанавливается до тех пор, пока вы не продолжите или не истечет время ожидания.
Вы можете выполнить настраиваемое действие, используя один или несколько из следующих вариантов:
Определите цель CloudWatch Events для вызова функции Lambda при возникновении действия жизненного цикла. Функция Lambda вызывается, когда Amazon EC2 Auto Scaling отправляет событие для действия жизненного цикла в CloudWatch Events. Событие содержит информацию об экземпляре, который запускается или завершается, и токен, который можно использовать для управления действием жизненного цикла.
Определите цель уведомления для ловушки жизненного цикла. Amazon EC2 Auto Scaling отправляет сообщение цели уведомления. Сообщение содержит информацию об экземпляре, который запускается или завершается, и токен, который можно использовать для управления действием жизненного цикла.
Создайте сценарий, который запускается на экземпляре при запуске экземпляра. Сценарий может управлять действием жизненного цикла, используя идентификатор экземпляра, на котором он выполняется.
По умолчанию экземпляр остается в состоянии ожидания в течение одного часа, а затем группа Auto Scaling продолжает процесс запуска или завершения (Pending: Proceed или Terminating: Proceed). Если вам нужно больше времени, вы можете перезапустить период тайм-аута, записав сердцебиение. Если вы закончите до истечения периода тайм-аута, вы можете завершить действие жизненного цикла, которое продолжит процесс запуска или завершения.