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

Изящный перезапуск Haproxy

Согласно различным блогам, HAproxy можно корректно перезапустить с помощью следующей команды:

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

Чтобы проверить это, я создал сценарий apache bench, который непрерывно отправлял сообщение на haproxy. В идеале всякий раз, когда я перезапускаю свой сервер, сценарий не должен влиять на выполнение группы apache. Но кажется, что всякий раз, когда Haproxy перезапускается, сценарии apache bench завершаются, и соединение с балансировщиком нагрузки теряется.

Вот подробности моего файла конфигурации HaProxy:

global
    nbproc 4
    log 127.0.0.1   local0
    log 127.0.0.1   local1 notice
    #log loghost    local0 info
    maxconn 4096
    #chroot /usr/share/haproxy
    user haproxy
    group haproxy
    daemon
    pidfile /var/run/haproxy.pid
    stats socket /home/ubuntu/haproxy.sock
    #debug
    #quiet

    defaults
    log     global
    mode    http
    option  httplog
    option  dontlognull
    retries 3
    option redispatch
    maxconn 2000
    contimeout      5000
    clitimeout      50000
    srvtimeout      50000

    listen webstats
    bind 0.0.0.0:1000
    stats enable
    mode http
    stats uri /lb?stats
    stats auth anand:aaaaaaaa
    #stats refresh

    listen web-farm 0.0.0.0:80
         mode http
         balance roundrobin
         option httpchk HEAD /index.php HTTP/1.0
         server server2.com  1.1.1.1:80
         server serve1.com  1.1.1.2:80

~
Пожалуйста, дайте мне знать, что мне здесь не хватает.

При устранении неполадок попробуйте использовать «nbproc 1» вместо «nbproc 4», увеличение количества процессов требуется редко и в некоторых случаях может потенциально привести к проблемам.

Однако, скорее всего, не в этом главная проблема. Описанный вами сценарий должен действительно работать так, как вы ожидаете.

Горячая реконфигурация HAProxy на самом деле работает так:

  1. Новый процесс запускается с указанной конфигурацией
  2. Старый процесс получает сигнал SIGTTOU, чтобы новый процесс мог занять порт (-ы)
  3. Старый процесс завершает свою текущую работу, а затем завершается
  4. Новый процесс обрабатывает трафик через порт (порты).

Если что-то пойдет не так после 2, старый процесс вместо этого получит сигнал SIGTTIN и продолжит работу, как прежде.

Некоторые дополнительные сведения в вашем вопросе могут упростить устранение этой проблемы:

  • Какие параметры вы используете с ab
  • После горячей реконфигурации вы сможете подключиться к новому процессу с любыми другими клиентами или нет
  • Какую (основную) версию HAProxy вы используете