Я использую HAProxy в производстве для балансировки запросов к серии экземпляров сервера, которые могут обрабатывать только 1 запрос за раз (по нашему собственному решению). Зная, что я установил параметр maxconn в строке определения сервера конфигурации бэкэнда в файле haproxy.cfg на 1, но сервер по-прежнему получает запросы, потому что я вижу в журнале нашего сервера такие сообщения, как «запрос отклонен, уже обрабатывается», а также в HAProxy запросы журнала, которые возвращаются клиенту с кодом состояния 502 http.
Это конфигурация HAProxy:
# this config needs haproxy-1.1.28 or haproxy-1.2.1
global
log 127.0.0.1 local6 debug
user haproxy
group haproxy
daemon
stats socket /tmp/haproxy
defaults
log global
mode http
balance roundrobin
option httplog
retries 10
option redispatch
frontend custom 0.0.0.0:50000
backlog 2000
acl p5queue avg_queue(custombe) gt 200
tcp-request content reject if p5queue
default_backend custombe
timeout client 15000
backend custombe
retries 10
option redispatch
timeout queue 600000
timeout connect 1000
timeout server 120000
server custom-server-1 0.0.0.0:50001 weight 1 maxconn 1 check inter 2000 rise 2 fall 1
server custom-server-2 0.0.0.0:50002 weight 1 maxconn 1 check inter 2000 rise 2 fall 1
server custom-server-3 0.0.0.0:50003 weight 1 maxconn 1 check inter 2000 rise 2 fall 1
server custom-server-4 0.0.0.0:50004 weight 1 maxconn 1 check inter 2000 rise 2 fall 1
server custom-server-5 0.0.0.0:50005 weight 1 maxconn 1 check inter 2000 rise 2 fall 1
server custom-server-6 0.0.0.0:50006 weight 1 maxconn 1 check inter 2000 rise 2 fall 1
server custom-server-7 0.0.0.0:50007 weight 1 maxconn 1 check inter 2000 rise 2 fall 1
server custom-server-8 0.0.0.0:50008 weight 1 maxconn 1 check inter 2000 rise 2 fall 1
server custom-server-9 0.0.0.0:50009 weight 1 maxconn 1 check inter 2000 rise 2 fall 1
server custom-server-10 0.0.0.0:50010 weight 1 maxconn 1 check inter 2000 rise 2 fall 1
Кто-нибудь знает, почему экземпляры сервера получают запросы, когда параметр maxconn установлен в единицу? я прочел Вопросы StackOverflow, где объясняется maxconn и как он работает в разных разделах, поэтому я спрашиваю об этом сейчас, это не должно работать так.
Убедитесь, что нет другого процесса, который имеет открытые подключения к вашей службе.
Обратите особое внимание на то, что во время haproxy reload
, есть временные рамки, в течение которых два процесса haproxy будут использовать ваши ресурсы, и каждый самостоятельно устанавливает ограничения на количество подключений. Процесс завершения не завершится, пока не будут опустошены все очереди. Поэтому вполне возможно, что новый процесс и его клиенты будут бороться за места.
Лучшее решение, которое я могу придумать, - это
haproxy
пока идет процесс отделки.