Мы используем 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 секунды.