Продолжим серию постов про балансировку нагрузки, сегодня поговорим про транспортный уровень.
Балансировка на транспортном уровне (ECMP)
Клиент обращается к балансировщику, тот перенаправляет запрос одному из серверов, который будет его обрабатывать. Выбор сервера, на котором будет обрабатываться запрос, может осуществляться в соответствии с самыми разными алгоритмами: путём кругового перебора, путём выбора наименее загруженного сервера из пула и т.д.
Зачастую балансировку на транспортном уровне не отличить от балансировки на сетевом уровне. Рассмотрим следующее правило для сетевого Packet Filter в OpenBSD: тут идет речь про балансировку трафика на конкретном 80-ом порту TCP:
web_servers = "{ 3.3.3.1, 3.3.3.2, 3.3.3.3 }"
match in on $ext_if proto tcp to port 80 rdr-to $web_servers round-robin sticky-addressРассмотрим теперь другой пример:
pass in on $int_if from $lan_net \
route-to { ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) }\
round-robinЗдесь речь о балансировке исходящего трафика на сетевом уровне, порт и протокол не указаны.
В чем различие?
К сетевому уровню относятся решения, которые не терминируют на себе пользовательские сессии, а перенаправляют трафик и не работают в проксирующем режиме. Балансировщик решает на какой сервер передавать пакеты, пока сессию с клиентом осуществляет сервер.
На транспортном уровне общение с клиентом замыкается на балансировщике, который работает как прокси. Он взаимодействует с серверами от своего имени, передавая информацию о клиенте в дополнительных данных и заголовках. Таким образом работает небезызвестный программный балансировщик HAProxy.
Плюсы
• Все также не зависит от протоколов высокого уровня • Все также один публичный адресМинусы
• Надо устанавливать на серверы дополнительный софт, чтобы анонсировать серверную сеть на роутер • Ограниченное количество ECMP на роутер (от 8 до 32 маршрутов, в зависимости от роутера) • При такой схеме нагрузка на все серверы распределяется равномерно, что накладывает требование одинаковости на все серверы. И если добавлять в кластер более современный, мощный, сервер, нагрузка на него будет не больше, чем на соседа.#балансировка_нагрузки #транспортный_уровень #ecmp #engineering