Почему балансировщик нагрузки Azure по-прежнему отправляет трафик на узлы после сбоя проверки работоспособности?

У меня есть две виртуальные машины Azure, расположенные за стандартным балансировщиком нагрузки Azure.

Подсистема балансировки нагрузки проверяет работоспособность каждые 5 секунд с включенным HTTP / работоспособностью для каждой виртуальной машины.

Интервал установлен на 5, порт установлен на 80 и / здоровье, а порог неработоспособности установлен на 2.

Во время развертывания приложения мы устанавливаем / health-endpoint на возврат 503, а затем ждем 35 секунд, чтобы позволить подсистеме балансировки нагрузки пометить экземпляр как неработающий и, таким образом, прекратить отправку нового трафика.

Однако балансировщик нагрузки, похоже, не полностью освобождает виртуальную машину от нагрузки. Он по-прежнему отправляет входящий трафик в неработающий инстанс, вызывая простои наших клиентов.

В журналах IIS я вижу, что конечная точка / health-endpoint действительно возвращает 503, когда должна.

Есть идеи, что не так? Может это какой-то TCP keep-alive?


person klas mack    schedule 26.06.2020    source источник


Ответы (3)


Балансировщик нагрузки - это сквозная служба, которая не прерывает существующие TCP-соединения, при этом поток всегда идет между клиентом и гостевой ОС виртуальной машины и приложением. Если проверка работоспособности серверной конечной точки завершается неудачно, установленные TCP-соединения с этой внутренней конечной точкой продолжаются, но она перестанет отправлять новые потоки в соответствующий неработоспособный экземпляр. Это сделано специально для того, чтобы дать вам возможность корректно завершить работу из приложения, чтобы избежать неожиданного и внезапного завершения текущего рабочего процесса приложения.

Также вы можете рассмотреть возможность настройки сброса TCP при простое https://docs.microsoft.com/en-us/azure/load-balancer/load-balancer-tcp-reset, чтобы уменьшить количество неактивных подключений.

person krishg    schedule 29.06.2020
comment
Спасибо за ваш ответ. Это подтверждает Microsoft. В балансировщике нагрузки нет опции разгрузки соединения. Это делает его плохо подходящим для веб-приложений, поскольку мы не хотим адаптировать наши приложения к конкретной инфраструктуре (настройка http-заголовков и т. Д.). Рекомендуемый путь вперед с точки зрения MS - перейти на шлюз приложений, который мы не хотели использовать из-за агрессивных цен. - person klas mack; 15.07.2020

Я получил подтверждение от Microsoft, что это работает должным образом, что делает Azure Load Balancer плохо подходящим для веб-приложений. Это ответ от Microsoft:

Мне удалось обсудить ваше наблюдение с внутренней командой.

Они объяснили, что балансировщик нагрузки в настоящее время не имеет функции «Осушение соединения» и не прерывает существующие соединения.

Осушение соединения доступно с осушением соединения шлюза приложений.

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

person klas mack    schedule 15.07.2020

Я бы предложил вам следующий подход. Возможно, вам придется разместить страницу healthcheck.html на каждой из ваших виртуальных машин. Пока зонд может получить страницу, балансировщик нагрузки будет продолжать отправлять запросы пользователей на виртуальную машину.

При развертывании просто переименуйте файл healthcheck.html на другое имя, например _healthcheck.html. Это приведет к тому, что зонд начнет получать ошибки HTTP 404 и выведет этот компьютер из режима вращения с балансировкой нагрузки.

После завершения развертывания переименуйте _healthcheck.html обратно в healthcheck.html. Зонд Azure LB начнет получать ответы HTTP 200 и в результате снова начнет отправлять запросы на эту виртуальную машину.

Спасибо, Ману

person Manu Philip    schedule 26.06.2020
comment
Это почти то же самое, что и сейчас, но балансировщик нагрузки показывает, что зонд упал на 33,3%, только если я проверю страницу с метриками. И он все еще забирает трафик - person klas mack; 26.06.2020
comment
Я разговаривал с Microsoft, и, по-видимому, балансировщик нагрузки Azure поддерживает уже установленные TCP-соединения, даже если проверка работоспособности выводит узел из ротации. Новые соединения не достигнут этого, но все существующие соединения будут отправлены на неработоспособный узел. Не очень полезно для веб-приложений. - person klas mack; 28.06.2020
comment
вы должны написать это как ответ! Не могу поверить, что М.С. это делает. Хорошо знать - person dariogriffo; 29.06.2020