Мы запускаем несколько бэкэнд-серверов с протоколом fastcgi и балансируем между ними с помощью HAproxy. Вот пример конфигурации:
listen Balancer 192.168.0.1:2000
mode tcp
option tcplog
timeout connect 2000
timeout server 2000
timeout queue 2000
timeout client 2000
balance leastconn
server backend1 192.168.0.2:2000 check inter 2000 rise 2 fall 5
server backend2 192.168.0.3:2000 check inter 2000 rise 2 fall 5
server backend3 192.168.0.4:2000 check inter 2000 rise 2 fall 5
server backend4 192.168.0.5:2000 check inter 2000 rise 2 fall 5
server backend5 192.168.0.6:2000 check inter 2000 rise 2 fall 5
server backend6 192.168.0.7:2000 check inter 2000 rise 2 fall 5
Общий тайм-аут установлен на 2 секунды, но большинство запросов обрабатываются менее 0,3 секунды. Проблема в том, что во время пиков иногда какой-то бэкэнд не может ответить на запрос менее 2 секунд, и тогда возвращается таймаут шлюза.
Что я хотел бы сделать, так это то, что когда выбран один сервер (например, backend1) и он не может доставить ответ за 1 секунду, HAproxy выберет другой backend и повторите попытку. Если снова произойдет сбой через 1 секунду, произойдет тайм-аут.
Итак, вместо ожидания одного сервера в течение 2 секунд, можно ли сначала подождать 1 секунду, если он не удастся, попробовать другой, а затем потерпеть неудачу?
Если я правильно понимаю ваш вопрос, используя настройку timeout server
до 1 секунды (1000 мс), и используя option redispatch
должен дать вам желаемый эффект.
вариант повторной отправки
нет возможности повторной отправки
Включение или отключение перераспределения сеанса в случае сбоя соединения. В режиме HTTP, если сервер, обозначенный файлом cookie, не работает, клиенты могут определенно придерживаться его, потому что они не могут очистить файл cookie, поэтому они больше не смогут получить доступ к службе.Указание "option redispatch" позволит прокси-серверу нарушить их постоянство и перераспределить их на рабочий сервер.
Это также позволяет повторить последнее подключение к другому серверу в случае нескольких сбоев подключения. Конечно, для этого требуется, чтобы для «повторных попыток» было установлено ненулевое значение.
Это предпочтительная форма, которая заменяет ключевые слова «redispatch» и «redisp».
Если этот параметр был включен в разделе «по умолчанию», его можно отключить в конкретном случае, добавив перед ним ключевое слово «no».