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

Сделайте так, чтобы HAProxy повторно ретранслировал запрос на отказавший сервер

Мне было интересно, есть ли способ с помощью HAProxy повторно отправить неудавшийся запрос на другой сервер, если исходный сервер не работает.

Мы запускаем REST API на нескольких серверах за несколькими экземплярами HAProxy.

Балансового сродства нет, баланс делается исключительно на round-robin.

Чтобы обновить один сервер, мы можем просто перезапустить его, и из-за проверок работоспособности HAProxy обычно не отправляет никаких данных на этот сервер.

НО: если сервер выходит из строя между двумя проверками работоспособности, и HAProxy перенаправляет HTTP-запрос на этот сервер, еще не зная, что он не работает - этот запрос не выполняется (очевидно).

Есть ли способ настроить HAProxy таким образом, чтобы он заметил, что соединение прервано, и повторил попытку на другом сервере?

Или, по крайней мере, сделайте так, чтобы HAProxy пометил этот сервер как неисправный напрямую, чтобы мы потеряли только один запрос, а не несколько во время перехода.

HAProxy работает внутри контейнера докеров, и серверы также являются контейнерами докеров.

Да, в версии 2.0 haproxy реализовал повторные попытки уровня 7.

Новый повторная попытка Директива конфигурации определяет, в каком случае повторить неудачный HTTP-запрос к другому серверу. В более ранних версиях option redispatch и retries но будет перенаправляться только в случае проблем с подключением (не например, при ошибках / тайм-аутах после установления соединения).

Будьте осторожны, чтобы не повторить попытку POST, чтобы не получить несколько дублирующихся отправок базы данных в случае, например,. медленные бэкенды.

Пример:

backend test
    balance roundrobin
    option redispatch 1
    retry-on all-retryable-errors
    retries 3
    http-request disable-l7-retry if METH_POST

    server app1 192.168.0.1:80 maxconn 30 check
    server app2 192.168.0.2:80 maxconn 30 check
    server app3 192.168.0.3:80 maxconn 30 check