根据各种博客,可以使用以下命令正常重新启动 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 的热重新配置实际上是这样工作的:
- 使用指定的配置启动一个新进程
- 旧进程收到 SIGTTOU 信号,以便新进程可以接管端口
- 旧进程完成当前工作然后退出
- 新流程处理端口上的流量
如果 2 之后出现任何问题,旧进程将会收到 SIGTTIN 信号并继续像以前一样。
问题中的一些额外细节可能会使解决这个问题变得更容易:
- 你使用 ab 的哪些参数
- 热重新配置后,您是否可以使用任何其他客户端连接到新进程
- 您正在使用哪个(主要)版本的 HAProxy