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

HAProxy перезагружается очень медленно (почти 3 минуты)

Мы используем HAProxy 1.6.3 для балансировки нагрузки и маршрутизации HTTP-трафика на сотни внутренних серверов. Мы часто перезагружаем конфигурацию (несколько раз в день), как автоматически при сбое сервера, так и вручную по административным причинам.

Проблема в том, что выполнение команды reload занимает до 3 минут на одном из наших серверов HAProxy (Ubuntu 16.04). Кажется, не имеет значения, есть ли у сервера трафик или нет. На других наших серверах с той же версией ОС и HAProxy перезагрузка занимает 1-5 секунд независимо от нагрузки. У нас есть куча длительно выполняемых запросов, но, как я уже сказал, не имеет значения, есть ли у сервера трафик или нет.

Мы видим, что создается новый процесс, но затем проходит несколько минут, прежде чем он начнет принимать трафик (или, по крайней мере, пока загрузка ЦП новым процессом не превысит 0%).

Возникает вопрос: из-за чего HAProxy так долго перезагружается? Что он делает так долго? Как я могу узнать (например, какой уровень ведения журнала мне нужно включить и что я буду искать в журнале?)

Запускаем следующую команду для перезагрузки:

haproxy -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid -D -sf $(cat /var/run/haproxy.pid)

А наш конфигурационный файл выглядит так:

global
    log 127.0.0.1 local0 notice             
    maxconn 20000                           
    user haproxy
    group haproxy
    tune.ssl.default-dh-param 2048

defaults
    log global
    mode http
    option httplog
    option dontlognull
    option http-keep-alive                  
    option forwardfor                       
    retries 3                               
    option redispatch                       
    timeout connect 5s                      
    timeout check 5s                        
    timeout client 60000                    
    timeout server 60000                    

    stats enable
    stats uri /haproxy?stats
    stats auth [REDACTED]

    option httpchk GET / HTTP/1.0           
    balance roundrobin                      
    default-server inter 10s fall 2 rise 2  

frontend http-in
        bind *:80

        # Define hosts
        acl host_1 hdr(host) -i somehost.somedomain.com
        [hundreds of host header configurations]

        ## switches
        use_backend 1 if host_1
        [hundreds of if-clauses]

frontend https-in
        bind *:443 ssl crt [REDACTED] crt [REDACTED] crt [REDACTED]

        # Define hosts
        acl host_1 hdr(host) -i somehost.somedomain.com
        [hundreds of host header configurations]

        ## switches
        use_backend 1 if host_1
        [hundreds of if-clauses]

backend 1
        server node1 [some IP] check
        server node2 [some IP] check

[lots more backends]

Спасибо!

ОБНОВЛЕНИЕ: единственное различие, которое мы обнаружили, заключается в том, что на медленном сервере используется Ubuntu 16.04, а на быстром - 16.04.1. Не уверен, что это актуально.

ОБНОВЛЕНИЕ 2: Некоторые другие серверы, которые у нас есть, также работают под управлением 16.04 и имеют быструю перезагрузку. Так что, наверное, дело не в этом. Следующий шаг - переустановить haproxy и посмотреть, поможет ли это.

ОБНОВЛЕНИЕ 3: Переустановка не помогла. В настоящее время мы работаем с strace, чтобы попытаться выяснить, что он делает. Похоже, он пытается подключиться ко всем нашим бэкэндам, но часто выходит из строя. Пока непонятно, почему только этот сервер получает таймауты и почему он отказывается принимать управление до тех пор, пока не будет завершен весь опрос.

Оказывается, медленный запуск нового процесса HAProxy был вызван тем, что он пытался разрешить DNS всех внутренних серверов. И поскольку у нас было много серверов и медленный (или не отвечающий) DNS-сервер, вызывал множество тайм-аутов запросов, что приводило к медленному запуску процесса.

Мы перешли на более качественный DNS-сервер, и теперь это занимает 2 секунды.