我们有 2 个活动主机,用于使用 haproxy 进行负载平衡。Haproxy 在两个主机上运行。由于维护,我们需要停止主机 1 上的服务。在维护期间,我们希望 haproxy 实例停止向主机 1 发送流量,并将所有请求发送到主机 2。
目的:服务器维护期间没有中断。
当前行为:当主机 1 上的服务发生故障时,流量仍会发送到主机 1 和 2。由于主机 1 上的后端服务发生故障,请求超时,然后 Haproxy 停止向主机 1 发送请求。第一次故障事件发生后,所有流量都会发送到主机 2 并正常处理。
有没有办法避免丢失这 1 个事务(主机 1 上的第一次故障)?我读到过使用套接字文件启用和禁用后端服务器,这需要 socat 或 netcat。还没有测试过,但正在寻找使用 haproxy 配置的解决方案来解决这个问题。
haproxy 配置中的后端定义
backend myBackend
balance leastconn
option httpchk HEAD /
default-server inter 5s fastinter 1s downinter 10s fall 2 rise 2
timeout server 20s
server s1 ActiveHost1:port check maxconn 10
server s2 ActiveHost2:port check maxconn 10
server s3 standByHost1:port check maxconn 10 backup
server s4 standByHost1:port check maxconn 10 backup
答案1
注释该行并重新加载 haproxy 对您来说可以吗?
sed -i \"/server s1/c\\ #server s1 ActiveHost1:port check maxconn 10\" /etc/haproxy/haproxy.cfg && sudo service haproxy reload
答案2
Haproxy 的控制套接字支持发送许多不同的命令来控制服务器的行为。如果您希望允许所有现有连接完成,但不发送新连接,则可以将后端置于 DRAIN 模式(确保控制套接字已启用):
echo "set server backend/serv state drain" | sudo socat stdio /run/haproxy/haproxysock
如果您想立即停止所有流量,可以将后端设置为维护模式而不是 DRAIN。
答案3
您还可以通过定义服务检查选项来减少主机被视为 DOWN 的时间。根据文档,例如对于 HTTP 服务:
定义要检查的服务
定义期望的结果
定义主机何时关闭 - 每 3 秒检查一次。3 次尝试失败后,主机被视为关闭。当 2 次检查具有预期状态时,主机被视为开启
定义您的主机
option httpchk GET /check http-check expect status 200 default-server inter 3s fall 3 rise 2 server srv1 10.0.0.1:80 check server srv2 10.0.0.2:80 check
答案4
So, you can do it with admin socket.
in haproxy.cfg, check if admin socket is enabled. if not add the below lines if needed. Haproxy supports 3 type of user - admin, operator and user.
========================
stats socket /var/lib/haproxy/admin.sock mode 600 level admin
stats socket /var/lib/haproxy/operator.sock mode 660 level operator user haproxy group haproxy
stats socket /var/lib/haproxy/user.sock mode 660 level user uid 106 gid 112
========================
install socat and expect utility in the server.
========================
apt-get install expect socat rlwrap
yum install install expect socat rlwrap
========================
Bring the server in Maintenance, Drain or Ready
========================
[root@LB003 templates]# echo "set server be_beta-backend_shadow_om/IP_da-live-b000005 state drain" | socat stdio unix-connect:/var/lib/haproxy/admin_beta.sock
[root@LB003 templates]# echo "set server be_beta-backend_shadow_om/IP_da-live-b000005 state maint" | socat stdio unix-connect:/var/lib/haproxy/admin_beta.sock
[root@LB003 templates]# echo "set server be_beta-backend_shadow_om/IP_da-live-b000005 state ready" | socat stdio unix-connect:/var/lib/haproxy/admin_beta.sock
========================
Once beckend server is drained and put in maintenance you can bring down the server.
open the stats web uri and monitor the server. or check in command line.
========================
echo "show stat" | socat stdio unix-connect:/var/lib/haproxy/admin_beta.sock
========================
Happy Haproxying.