Haproxy 优雅重新加载

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

答案1

您发布的命令在我看来并非 100% 正确。在我的系统上,它显示为:

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

您输入了错误最后一个选项的值-sf

答案2

这可能是预期的,具体取决于您的测试方法。尽管如上所述,您似乎还缺少$重新加载命令末尾的?

当 HAProxy 执行“重新加载”时,它会启动一个新的 HAProxy 进程,发送会议数据通过 unix 域套接字从第一个进程传输到第二个进程,第一个进程解除其正在监听的 TCP 端口的绑定,第二个进程绑定。然后第一个进程终止。因此它们在任何阶段都不共享内存,并且似乎没有同步文件描述符(无论如何,从我自己的测试来看)。因此,重新加载的主要目的是维护持久性表(例如基于 cookie 的哈希),以便客户端重新连接到所需的后端服务器。但是,它应该是优雅的,因为连接是从第一个进程中耗尽的,而不是立即断开。

如果您在重新加载时观察进程表,那么您应该观察到上述情况,除非自我测试以来(几个月前)情况发生了变化。

相关内容