Назад | Перейти на главную страницу

Балансировщик нагрузки HTTP с маршрутизацией на основе заголовков?

Я ищу решение для балансировки нагрузки HTTP, которое обеспечит следующее:

1) Принимайте HTTP-соединения на порту X и перенаправляйте их на один из нескольких других хостов (и / или портов) случайным образом или циклически.

2) Если ответ сервера содержит определенный HTTP-заголовок с определенным значением (например, «Magic-Number: 12345»), запомните его и пересылайте все последующие запросы, содержащие тот же заголовок, этому серверу.

3) Через определенные интервалы выполняйте проверку активности, отправляя указанный HTTP-запрос всем целевым серверам. Если какой-либо из серверов не отвечает, прекратите пересылку на него, пока он снова не подключится к сети.

4) (Не критично, но приятно иметь) Принимать HTTPS-соединения от клиентов и преобразовывать их в HTTP-соединения с серверами.

Решение должно состоять из бесплатного программного обеспечения и / или программного обеспечения с открытым исходным кодом и работать под управлением Windows 200x Server.

Какие-либо предложения?

Обновить: Cygwin или Portable Ubuntu (или другой дистрибутив Colinux) также являются жизнеспособными вариантами, если они могут запускать соответствующие решения * nix.

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

HAProxy является прокси-сервером HTTP (и может проксировать все, что угодно, кроме уровня 4 и ниже). Он делает практически все, что вы хотите. Документация не очень красивая, но если вы потратите время на ее чтение, вы обнаружите, что в ней есть вся необходимая информация.

Он работает практически на чем угодно, поэтому, если вы не используете много SSL, вам не нужно покупать большую и дорогую машину.

Я использую nginx уже пару лет и очень им доволен.

nginx (произносится как «движок X») - это легкий, высокопроизводительный веб-сервер / обратный прокси-сервер и прокси-сервер электронной почты (IMAP / POP3), лицензированный по лицензии, подобной BSD.

Это хорошо для балансировки нагрузки и обратного проксирования. Посмотрите примеры Вот

Обратите внимание на Pound Load Balancer, который выполняет LB на основе HTTP-заголовка:

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

Итак, мой ответ:

Конечно, вы можете сделать это с помощью Apache mod_proxy_balancer. У вас должно получиться что-то вроде этого:

ProxyPassReverse / http://host1:80/
ProxyPassReverse / http://host2:80/

<Proxy balancer://cluster>
  BalancerMember http://host1:80 route=LB1
  BalancerMember http://host2:80 route=LB2
  ProxySet stickysession=MYSESSIONID
</Proxy>

Итак, что касается пункта 1, прочтите mod_proxy_balancerраздел "Алгоритм подсчета запросов".

Что касается пункта 2: я действительно не знаю о парсинге HTTP-заголовка. В приведенном выше примере используется дополнительный параметр URL MYSESSIONID для прокси-трафика, являющегося частью одного и того же соединения с одним и тем же хостом. Я думаю, вы также можете использовать файлы cookie. В любом случае это должно обрабатываться приложением, идентифицированным как LB1 или LB2 (они добавляются как часть идентификатора сеанса или файла cookie).

По вопросу 3: балансировщик нагрузки отслеживает всех своих участников и отключает их, когда они не отвечают. Вы также можете включить / отключить узлы через веб-интерфейс (mod_statusсм. «Включение поддержки Balancer Manager»).

Что касается пункта 4, вы можете настроить VirtualHost с поддержкой SSL, прослушивающий порт 443, который проксирует весь трафик на порт 80 участников балансировщика.

В прошлом я использовал Apache с mod_cache в среде Unix. Он отлично работал с низкой пользовательской нагрузкой, но в дни с большой нагрузкой система выходила из строя весь день.

После некоторых тестов мы перешли на Varnish Cache, и теперь все работает лучше.

Проблема в том, что поддерживается только среда Unix, существует новая версия на основе cygwin для окон с лаком, но сейчас нет, если она подходит для производственной среды:

Я бы сказал, что это возможно и с IIS 7, используя перезапись URL в сочетании с балансировкой сетевой нагрузки. Основы

  • распределять трафик по нескольким хостам с NLB
  • писать правила перезаписи на основе заголовков с помощью IIS URL Rewrite.