Я провожу несколько тестов на алгоритме балансировки нагрузки "uri all" на HAProxy. Моя ОС - Ubuntu 16.04.2 LTS, а мой выпуск - HA-Proxy версии 1.7.7-1ppa1 ~ xenial 2017/06/27.
РЕДАКТИРОВАТЬ: Я использую Server-Sent-Events (SSE) для длительных запросов.
Вот моя конфигурация бэкэнда:
backend Proxy
mode http
balance uri whole
hash-type consistent
http-reuse safe
http-request set-header X-Forwarded-Port %[dst_port]
http-request add-header X-Forwarded-Proto https if { ssl_fc }
option http-server-close
option httpchk
http-check expect ! rstatus ^503
timeout tunnel 24h
server xxxx 192.168.0.10:8080 check maxconn 2 maxqueue 1
server yyyy 192.168.0.11:8080 check maxconn 2 maxqueue 1
Вот что я наблюдаю:
1 - Запрос A отправляется на один из этих серверов, в зависимости от хэша после вопросительного знака и некоторых других параметров. Скажем, на сервере xxxx.
2 - Следующий запрос, нацеленный на тот же самый URI, будет отправлен на сервер xxxx с maxconn на 2.
3 - Третий останется в очереди.
4 - Четвертый ничего не достигнет, и я получил сообщение «503 Service Unavailable - Нет сервера для обработки этого запроса». от HAProxy. Единственный способ отправить запросы на другой сервер - это пометить сервер xxxx как «Неработающий» или «Технический». То же самое без «согласованного типа хэша» или с опцией «резервного копирования».
5 - Все проверки работоспособности отправляются на один и тот же сервер.
Мои вопросы по пунктам 4 и 5:
Я думал, что uri whole - это алгоритм балансировки нагрузки. Должен ли 4-й запрос не быть сбалансирован на сервере yyyy, если сервер xxxx недоступен для его обработки (я понимаю, что хэш не меняется)?
Чтобы обойти это поведение, я попытался настроить проверку работоспособности, чтобы HAProxy пометил сервер, отвечающий на код 503, как «Выключен». Это не работает ... Я что-то упускаю в моем определении серверной части?
Даже проверки работоспособности привязаны к одному серверу. Это бесполезно ... Я чего-то не понимаю?
Моя цель здесь - сбалансировать 4-й запрос (а в идеале 3-й) на втором сервере :)
Спасибо за помощь!
Похоже, что у запросов 1 и 2 все еще открыто соединение с серверной частью (длительный запрос?). Запрос 3 поставлен в очередь (разрешено только 2 соединения), запрос 4 отбрасывается, поскольку вы ограничили очередь одним запросом.
Бэкэнд не отключен - еще два соединения открыты.
Пометка бэкэнда как выключенного на 503 не срабатывает, потому что 503 исходит от haproxy, а не от бэкэнда.
Извините, если это не решит вашу проблему, но, возможно, это поможет вам лучше понять ее :)