在haproxy中支持TCP_KEEPCNT功能?

时间:2014-09-29 22:24:25

标签: sockets tcp haproxy

我有一个基于TCP的应用程序,它的功能依赖于TCP保持活动行为。我想使用haproxy代理并负载平衡此应用程序。

除了应用程序依赖于TCP keepalive行为之外,使用haproxy一切似乎都很好。应用程序依赖于TCP_KEEPCNT套接字选项,以在尚未回复特定数量的Keepalive时关闭连接。看起来这个功能在haproxy中不可用,因此应用程序在连接状态下的功能是错误的。

是否可以使用haproxy来影响连接上的TCP_KEEPCNT设置,或者与TCP_KEEPIDLE和TCP_KEEPINTVL相关的选项?谢谢!

2 个答案:

答案 0 :(得分:1)

您可以使用以下选项启用在HAProxy中发送TCP keepalive包:

  • option clitcpka - 启用在客户端和HAProxy之间发送keepalive包,以便在前端使用
  • option srvtcpka - 启用在haproxy和后端服务器之间发送keepalive包,以便在后端使用

请注意,您无法从后端服务器一直向客户端发送keepalive软件包。这是因为HAProxy总是有两个独立的TCP连接:一个在客户端和HAProxy之间,另一个在HAProxy和服务器之间。由于keepalive包没有到达应用程序但是由TCP堆栈(以及内核)完全处理,因此它们不能由应用程序转发。

答案 1 :(得分:0)

使用option clitcpkaoption srvtcpkaoption tcpka,OS会检测并终止非活动连接,而不是haproxy。我认为无法在haproxy 1.5.x上调整它。

 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秒后集体终止连接。