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

Изящная перезагрузка Haproxy

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

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