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

Pao*_*ato 6 timeout tcp centos haproxy amqp

我已经配置了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秒(> 120秒的keepalive数据包)并使用选项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
Run Code Online (Sandbox Code Playgroud)

Ste*_*ich 11

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

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

timeout client 200000ms
timeout server 200000ms
Run Code Online (Sandbox Code Playgroud)

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

  • 我不是HAProxy的专家,但似乎它在TCP级别运行,如http://serverfault.com/questions/589804/haproxy-configuration-for-rabbitmq/652326#652326中所述 (2认同)
  • @PaoloParlato:TCP级别很大:) HA代理在用户空间端起作用,您可以在其中控制保持活动计时器,但不能直接发送或接收TCP保持活动数据包。您只能读写大小大于0个字节的真实数据,并且保持活动数据包为空。同样,HA代理中的空闲超时仅关心数据传输,而TCP保持活动状态不传输任何数据。 (2认同)

kub*_*zyk 7

timeout client检测在响应客户端操作系统死客户端应用程序。您始终可以拥有一个占用连接但不与您通话的应用程序。这很糟糕,因为连接数不是无限的 ( maxconn)。

同样,timeout server为后端设置。

这些选项用于 haproxy 与应用程序的对话。现在,在 OS 与 OS 对话的地方有一个完全独立的检查(不涉及应用程序或 haproxy):

使用option clitcpkaoroption srvtcpkaoption tcpka您允许操作系统检测并终止不活动的连接,即使 haproxy 没有主动检查它。这主要需要操作系统设置 (Linux)。

如果 110 秒内没有数据发送,则立即发送第一个保持连接(KA),不要终止连接:

 sysctl net.ipv4.tcp_keepalive_time=110
Run Code Online (Sandbox Code Playgroud)

每次 KA 后等待 30 秒,一旦在此连接上启用它们:

 sysctl net.ipv4.tcp_keepalive_intvl=30
Run Code Online (Sandbox Code Playgroud)

允许 3 个 KA 未被确认,然后终止 TCP 连接:

 sysctl net.ipv4.tcp_keepalive_probes=3
Run Code Online (Sandbox Code Playgroud)

在这种情况下,操作系统会在数据包停止到来 200 秒后终止连接。