tcp - HAProxy 关闭长期存在的 TCP 连接,忽略 TCP keepalive

标签 tcp centos timeout amqp haproxy

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

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

在 HAProxy 中,我将客户端/服务器超时设置为 200 秒(>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

最佳答案

TCP keep alive 位于传输层,仅用于连接上的一些流量,因此像数据包过滤器这样的中间系统不会丢失任何状态,并且终端系统可以注意到是否与另一端的连接断开(可能是因为出现故障或网络电缆断开)。

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

timeout client 200000ms
timeout server 200000ms

如果连接空闲,即没有数据传输,则会触发此超时。 TCP keep alive 不传输任何数据,这些数据包的负载是空的。

关于tcp - HAProxy 关闭长期存在的 TCP 连接,忽略 TCP keepalive,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32634980/

相关文章:

tcp - SCTP 中的多流与在 TCP 中打开多个连接有何不同?

java - 无法启动 Cassandra(CentOS7 上的单节点集群)

jquery - 无法使用 WebApplicationException 的响应,因为该响应已提交。重新抛出到HTTP容器

python - 使用 urllib2 或任何其他 http 库读取超时

linux - 局域网病毒传播技术

c# - 通过 TCP 发送大字符串 - Windows Phone

linux - 设置tcp超时

php - 生成 XML

linux - Linux(CentOS)中/proc/meminfo文件中的 "Mlocked"有何意义

python - 为什么我的 except 子句从未捕获到 gevent 超时异常?