HAProxy关闭长生活TCP连接,忽略TCP keepalive

时间:2015-09-17 16:02:23

标签: tcp centos timeout amqp haproxy

我已经配置了HAProxy(1.5.4,但我也试过1.5.14)来平衡TCP模式两个服务器在5672端口上暴露AMQP协议(WSO2 Message Broker)。 客户端通过HAProxy创建并使用与AMQP服务器的永久连接。

我已更改客户端和服务器TCP keepalive超时,设置net.ipv4.tcp_keepalive_time = 120(CentOS 7)。

在HAProxy中,我将超时客户端/服务器设置为200秒(> keepalive数据包的> 120秒),并使用选项clitcpka。

然后我启动了wireshark并嗅探了所有tcp流量:在客户端的最后一个请求之后,tcp keepalived数据包在120秒后定期发送,但是在客户端的最后一次请求后200秒之后连接关闭(因此忽略了keepalived数据包)。

配置下方:

haproxy.conf

global
    log 127.0.0.1   local3
    maxconn 4096
    user haproxy
    group haproxy
    daemon
    debug

listen messagebroker_balancer 172.19.19.91:5672
    mode tcp
    log global
    retries 3
    timeout connect 5000ms
    option redispatch
    timeout client 200000ms
    timeout server 200000ms
    option tcplog
    option clitcpka 
    balance leastconn
    server s1 172.19.19.79:5672 check inter 5s rise 2 fall 3
    server s2 172.19.19.80:5672 check inter 5s rise 2 fall 3

2 个答案:

答案 0 :(得分:8)

TCP保持活动位于传输层,仅用于在连接上进行一些流量,因此像包过滤器这样的中间系统不会丢失任何状态,并且终端系统可以注意到与另一方的连接中断(可能是因为某些东西坠毁或网络电缆坏了)。

TCP keep alive与您明确设置为200s的应用程序级别空闲超时无关:

timeout client 200000ms
timeout server 200000ms

如果连接空闲,即没有数据传输,则会触发此超时。 TCP保持活动状态不传输任何数据,这些数据包的有效负载为空。

答案 1 :(得分:1)

您需要将timeout client设置为非常大或无限期。此超时用于检测响应客户端OS上的死客户端应用程序。您可以随时拥有一个占用连接但不会与您通话的应用程序。这很糟糕,因为连接数不是无限的(maxconn)。

后端同样timeout server

使用option clitcpkaoption srvtcpkaoption tcpka,操作系统会检测并终止非活动连接,而不是haproxy。

 sysctl net.ipv4.tcp_keepalive_time=110  # if no data sent for 110 seconds, enable KA, then immediately send the first KA, don't kill connection yet
 sysctl net.ipv4.tcp_keepalive_intvl=30  # wait for 30 seconds after each KA, once they're enabled
 sysctl net.ipv4.tcp_keepalive_probes=3  # send 3 KAs unacknowledged, then kill the TCP connection

当数据包停止运行时,这些操作系统设置会在200秒后集体终止连接。