Haproxy - 停止维护节点的流量

Haproxy - 停止维护节点的流量

我们有 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.

相关内容