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

Параметр сервера maxconn в haproxy

Я использую 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 будут использовать ваши ресурсы, и каждый самостоятельно устанавливает ограничения на количество подключений. Процесс завершения не завершится, пока не будут опустошены все очереди. Поэтому вполне возможно, что новый процесс и его клиенты будут бороться за места.

Лучшее решение, которое я могу придумать, - это

  1. Принимайте ровно два подключения на рабочий процесс и
  2. будьте осторожны, чтобы не перезагрузить haproxy пока идет процесс отделки.