Я ищу балансировщик нагрузки HTTP, который будет автоматически обрабатывать ошибки сервера. Я хочу сбалансировать нагрузку для каждого отдельного запроса, чтобы он работал, в худшем случае с небольшим таймаутом.
Если рабочий веб-узел возвращает ошибку сервера HTTP 500, балансировщик нагрузки должен будет повторить запрос с другим веб-узлом. Если второй узел возвращает еще одну ошибку 500, то же самое с последним узлом (я предполагаю, что у него 3 узла). Если последний узел возвращает ошибку 500, покажите ее конечному пользователю.
Если тайм-аут серверного узла (для ответа требуется более 1-2 секунд), запрос должен быть перенаправлен на другой сервер, клиент должен получить хороший ответ в течение 2+ секунд.
Вы можете использовать nginx HttpProxyModule (это довольно стандартный модуль и обычно находится внутри nginx) для реализации такого балансировщика нагрузки.
Nginx легкий, быстрый и имеет много функций (вы даже можете встраивать в него код lua).
Пример конфигурации для вашего варианта использования будет
upstream backend {
server 10.0.0.1;
server 10.0.0.2;
server 10.0.0.3;
}
server {
listen 80;
server_name _;
location / {
proxy_pass http://backend;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_redirect off;
proxy_buffering off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Секретный соус proxy_next_upstream директива, определяющая, в каких случаях запрос будет передан на следующий сервер. Возможные значения:
Я предполагаю, что вы хотите обслуживать HTTP?
Nginx предоставляет множество функций, включая все те, которые вам нужны: http://wiki.nginx.org
особенно проверьте настройки апстрима и прокси, там вы можете реализовать все свои требования: http://wiki.nginx.org/HttpUpstreamModule http://wiki.nginx.org/HttpProxyModule
Еще одно возможное решение для реализации ваших требований: LVS
(Виртуальные серверы Linux), которые реализованы в самом ядре Linux. если вы просто погуглите LVS tutorial
вы получите массу результатов.
Здесь вы ищете либо прокси, либо достаточно дорогой балансировщик нагрузки.
Что касается проксирования, то squid / nginx может выполнять эту работу относительно разумно - выбор того, что вы выберете, является в некоторой степени вопросом предпочтений, но также насколько важно иметь кухонную мойку в вашем распоряжении (если это не так, nginx, возможно, лучший выбор)
Что касается аппаратного обеспечения ... балансировщик нагрузки F5 может делать такие вещи, при этом обеспечивая высокую масштабируемость.