Эта идея использует способность ELB обнаруживать нездоровый узел и удалять его из пула, НО он полагается на то, что ELB ведет себя так, как ожидается в предположениях ниже.Это то, что я хотел проверить на себе, но еще не успел.Когда я это сделаю, я обновлю ответ.
Обзор процесса
Следующая логика может быть обернута и запущена в тот момент, когда необходимо завершить работу узла.
- Блокируйте новые HTTP-соединения с nodeX, но продолжайте разрешать существующие соединения
- Дождитесь истечения существующих соединений, либо отслеживая существующие соединения с вашим приложением, либо предоставляя «безопасное» количествовремя.
- Инициируйте завершение работы на экземпляре nodeX EC2, используя API-интерфейс EC2 напрямую или абстрактные сценарии.
«безопасно» в соответствии с вашим приложением, которое может быть невозможно определить длянекоторые приложения.
Предположения, которые необходимо проверить
Мы знаем, что ELB удаляет нездоровые экземпляры из своего пула Я ожидаю, что это будет изящно, так что:
- Новое соединение с недавно закрытым портом будет изящно перенаправлено на следующий узел в пуле
- Когда узел помечен как Bad, уже установленные соединения с этим узлом не затрагиваются.
возможные тестовые случаи:
- Fire HTTP-соединения на ELB (например, от завиткаscript) регистрация результатов во время скриптового открытия закрытия одного из узлов HTTP-портов.Вам нужно будет поэкспериментировать, чтобы найти приемлемое количество времени, которое позволяет ELB всегда определять изменение состояния.
- Поддерживать длительный сеанс HTTP (например, загрузку файла), при этом блокируя новые соединения HTTP, следует надеяться, что длинный сеанс долженпродолжить.
1.Как заблокировать HTTP-соединения
Используйте локальный брандмауэр на nodeX для блокировки новых сеансов, но продолжайте разрешать установленные сеансы.
Например, таблицы IP:
iptables -A INPUT -j DROP -p tcp --syn --destination-port <web service port>