Как создать избыточные балансировщики нагрузки?

Как создать избыточные балансировщики нагрузки?

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

Я понимаю, что проверки работоспособности DNS могут быть полезны, но ведь существуют серьезные проблемы с задержками, не так ли?

Это предполагает, что вы не используете сторонние сервисы, такие как AWS ELB или что-то подобное. Что делать, если вы просто используете, скажем, Nginx?

решение1

Есть несколько способов достичь HA (высокой доступности) балансировщика нагрузки - или в этом отношении любой службы. Предположим, у вас есть две машины с IP-адресами:

  • 192.168.100.101
  • 192.168.100.102

Пользователи подключаются к IP, поэтому вам нужно отделить IP от конкретного ящика - например, создать виртуальный IP. Этот IP будет 192.168.100.100.

Теперь вы можете выбрать службу HA, которая будет заботиться об автоматическом отказоустойчивом/возвратном отказе IP-адреса. Некоторые из самых простых служб для unix — это (u)carp и keepalived, некоторые из более сложных — например, RedHat Cluster Suite или Pacemaker.

Давайте возьмем keepalived в качестве примера — две службы keepalived — каждая из которых работает на своем собственном ящике — и они общаются друг с другом. Такое общение часто называют heartbeat.

|   VIP   |                           |         |
|  Box A  | ------v^-----------v^---- |  Box B  |
|   IP1   |                           |   IP2   |

Если один из keepalived перестает отвечать (либо служба отключается по какой-либо причине, либо ящик отключается или зависает) - keepalived на другом ящике заметит пропущенные сигналы и предположит, что другой узел мертв, и предпримет действия по отказу. В нашем случае это действие будет заключаться в подъеме плавающего IP.

                                      |   VIP   |
    ------------------ -------------- |  Box B  |
                                      |   IP2   |

Худший вариант, который может произойти в этом случае, — потеря сеансов для клиентов, но они смогут переподключиться. Если вы хотите этого избежать, два балансировщика нагрузки должны иметь возможность синхронизировать данные сеансов между собой, и если они смогут это сделать, пользователи ничего не заметят, кроме, может быть, небольшой задержки.

Еще одна ловушка этой настройки — split brain — когда оба ящика находятся в сети, но связь разорвана, и оба ящика выдают один и тот же IP. Это часто решается с помощью какого-либо механизма ограждения (резервирование SCSI, перезапуск IPMI, отключение питания smart PDU, ...) или нечетного количества узлов, требующих, чтобы большинство членов кластера были активны для запуска службы.

|   VIP   |                           |   VIP   |
|  Box A  |                           |  Box B  |
|   IP1   |                           |   IP2   |

Более сложное программное обеспечение для управления кластером (такое как Pacemaker) может перемещать целые службы (например, останавливать их на одном узле и запускать на другом) — таким образом можно достичь высокой доступности для таких служб, как базы данных.

Другой возможный способ - если вы управляете маршрутизаторами рядом с вашими балансировщиками нагрузки, - использовать ECMP. Этот подход также позволяет вам горизонтально масштабировать балансировщики нагрузки. Это работает, когда каждый из ваших двух блоков связывается по BGP с вашим маршрутизатором(ами). Каждый блок должен рекламировать виртуальный IP (192.168.100.100), а маршрутизатор будет балансировать нагрузку трафика через ECMP. Если машина выходит из строя, она прекращает рекламировать VIP, что, в свою очередь, останавливает отправку трафика маршрутизаторами на нее. Единственное, о чем вам нужно позаботиться в этой настройке, - это прекратить рекламировать IP, если сам балансировщик нагрузки выходит из строя.

решение2

Использование Nginx в качестве балансировщика нагрузки позволит вам следовать перенаправлению, подробно описанному в этой статье, изменив конфигурацию для обнаружения тайм-аута отсутствия ответа:

nginx автоматическая балансировка нагрузки при отказе

Теоретически, если у вас среда высокой доступности, несколько балансировщиков нагрузки, объединенных в кластер, должны обеспечить поддержание работы сервиса в случае отказа одного из них.

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

решение3

Аппаратные балансировщики нагрузки поддерживают настройки "активный/пассивный" или "активный/активный" в течение многих лет, в обоих случаях они затем настраиваются параллельно с точки зрения уровня 1/2... активный/пассивный использует механизмы мониторинга/поддержки активности, как описано, активный/активный может быть реализован множеством способов. Чтобы выглядеть как один IP на фронтенде, два или более балансировщиков могут, пока они все/оба находятся в сети, делать что-то вроде:

  • выборочно отвечать на запросы ARP к общему IP-адресу на основе MAC-адреса или IP-адреса источника, когда клиенты находятся в одной сети
  • договариваются друг с другом, кто обрабатывает трафик данного нового TCP-соединения
  • позволять дублированному или ошибочному трафику уровней 3-7 происходить безрассудно и полагаться на стеки TCP клиента/маршрутизатора, чтобы разобраться с этим

А затем изменить свой режим на прием всего или большей части трафика, когда связь с партнерским устройством потеряна.

на стороне бэкэнда:

  • каждый из балансировщиков может в нормальном режиме работы использовать только заданный подпул серверов приложений
  • или здесь также могут быть сгенерированы дублирующиеся запросы...
  • или могут быть проведены переговоры между балансировщиками

Связанный контент