我正在寻找一种解决方案,以便优雅地重新加载 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 的哈希),以便客户端重新连接到所需的后端服务器。但是,它应该是优雅的,因为连接是从第一个进程中耗尽的,而不是立即断开。
如果您在重新加载时观察进程表,那么您应该观察到上述情况,除非自我测试以来(几个月前)情况发生了变化。