Я искал решение для изящной перезагрузки haproxy. У меня работает сервер nginx, который передает запросы в Haproxy, и иногда я перезагружаю конфигурацию Haproxy. Но я наблюдаю, что во время перезагрузки все существующие соединения отключаются, а очередь бэкэнда haproxy показывает 0 запросов (полученных из статистики сокетов haproxy).
Я использую метод, упомянутый в нескольких сообщениях в блогах и документации haproxy по этой проблеме:
Перезарядка:
haproxy -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid -D -sf (</var/run/haproxy.pid)
Начало :
haproxy -D -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid
Буду признателен, если кто-нибудь может предложить какое-либо решение. Ниже мой файл конфигурации haproxy
global
maxconn 64000
ulimit-n 200000
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
spread-checks 5
stats socket /etc/haproxy/stats
defaults
log global
mode http
balance roundrobin
maxconn 64000
option abortonclose
option httpclose
retries 3
option redispatch
timeout client 30000
timeout connect 30000
timeout server 30000
stats enable
stats uri /haproxy?stats
stats realm Haproxy Statistics
stats auth haproxy:stats
timeout check 5000
Опубликованная вами команда не кажется мне на 100% правильной. В моей системе это гласит:
haproxy -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid -D -sf $(cat /var/run/haproxy.pid)
Вы неправильно ввели значение последней опции -sf
.
Этого можно ожидать в зависимости от вашей методологии тестирования. Хотя, как упоминалось выше, вам также не хватало $
ближе к концу вашей команды перезагрузки?
Когда HAProxy выполняет перезагрузку, он запускает новый процесс HAProxy, отправляет сессия данные через сокет домена unix от первого процесса ко второму процессу, первый процесс отключается от TCP-портов, которые он прослушивает, а второй процесс выполняет привязку. Затем первый процесс завершается. Таким образом, они не разделяют память на любом этапе и, похоже, не синхронизируют дескрипторы файлов (по крайней мере, из моего собственного тестирования). Таким образом, основной смысл перезагрузки заключается в том, что таблицы сохраняемости (например, хэш на основе файлов cookie) поддерживаются, чтобы клиент повторно подключился к требуемому внутреннему серверу. Однако он должен быть изящным в том смысле, что соединения удаляются из первого процесса, а не сразу.
Если вы следите за таблицей процессов во время перезагрузки, вы должны соблюдать вышеуказанное, если только что-то не изменилось с тех пор, как я тестировал (несколько месяцев назад).