优雅地重启 Haproxy

优雅地重启 Haproxy

根据各种博客,可以使用以下命令正常重新启动 HAproxy:

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

为了验证这一点,我设置了一个 apache bench 脚本,该脚本会连续向 haproxy 发送消息。理想情况下,每当我重新启动服务器时,该脚本都不会影响 apache bundle 的执行。但是,似乎每当重新启动 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

~
请告诉我我这里遗漏了什么。

答案1

在对此进行故障排除时,请尝试使用“nbproc 1”而不是“nbproc 4”,增加进程数量很少需要,并且在某些情况下可能会导致问题。

但是,这很可能不是主要问题。您描述的场景实际上应该可以按预期工作。

HAProxy 的热重新配置实际上是这样工作的:

  1. 使用指定的配置启动一个新进程
  2. 旧进程收到 SIGTTOU 信号,以便新进程可以接管端口
  3. 旧进程完成当前工作然后退出
  4. 新流程处理端口上的流量

如果 2 之后出现任何问题,旧进程将会收到 SIGTTIN 信号并继续像以前一样。

问题中的一些额外细节可能会使解决这个问题变得更容易:

  • 你使用 ab 的哪些参数
  • 热重新配置后,您是否可以使用任何其他客户端连接到新进程
  • 您正在使用哪个(主要)版本的 HAProxy

相关内容