Я ищу решение для балансировки нагрузки 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 в сочетании с балансировкой сетевой нагрузки. Основы