需要帮助对 HAProxy 中的间歇性 TCP 超时进行故障排除

ima*_*ive 5 networking load-balancing tcp haproxy

我有一个应用程序,其中客户端通过基于 TLS/SSL 的简单基于 TCP 的协议连接到服务器。在开发中,当我们构建应用程序时,这已经运行了好几个月。最近,当我们准备发布时,我继续将 HAProxy 添加到组合中,以促进负载分配的某些顺序。从技术上讲,一切正常,但问题是,客户端现在看到的是完全随机的超时。它们通常不一致,但发生在大约 60 秒时。有时它会在 25 秒后发生。haproxy 将 TCP 连接转发到通知并完全断开连接的服务器,问题是您不希望一堆同时发生的连接无故中断并一遍又一遍地重新连接。除了其他方面,这对我们的发布/订阅基础设施也有影响。客户端足够聪明,可以立即重新连接——但这不是我们想要的行为。负责通过 SSL 接受这些 TCP 连接的服务器不需要保持活动状态。我将继续假设有一些我在我的 HAProxy 配置中没有看到的隐式值导致这些随机超时,或者需要 TCP 保持活动的东西。然而,超时并不总是一致的事实让我怀疑。如果每次都是 60 秒,我就会确信这是一个配置问题。在这种特殊情况下,并不总是 60 秒。这是我的配置现在的样子:客户端足够聪明,可以立即重新连接——但这不是我们想要的行为。负责通过 SSL 接受这些 TCP 连接的服务器不需要保持活动状态。我将继续假设有一些我在我的 HAProxy 配置中没有看到的隐式值导致这些随机超时,或者需要 TCP 保持活动的东西。然而,超时并不总是一致的事实让我怀疑。如果每次都是 60 秒,我就会确信这是一个配置问题。在这种特殊情况下,并不总是 60 秒。这是我的配置现在的样子:客户端足够聪明,可以立即重新连接——但这不是我们想要的行为。负责通过 SSL 接受这些 TCP 连接的服务器不需要保持活动状态。我将继续假设有一些我在我的 HAProxy 配置中没有看到的隐式值导致这些随机超时,或者需要 TCP 保持活动的东西。然而,超时并不总是一致的事实让我怀疑。如果每次都是 60 秒,我就会确信这是一个配置问题。在这种特殊情况下,并不总是 60 秒。这是我的配置现在的样子:负责通过 SSL 接受这些 TCP 连接的 s 不需要保持活动状态。我将继续假设有一些我在我的 HAProxy 配置中没有看到的隐式值导致这些随机超时,或者需要 TCP 保持活动的东西。然而,超时并不总是一致的事实让我怀疑。如果每次都是 60 秒,我就会确信这是一个配置问题。在这种特殊情况下,并不总是 60 秒。这是我的配置现在的样子:负责通过 SSL 接受这些 TCP 连接的 s 不需要保持活动状态。我将继续假设有一些我在我的 HAProxy 配置中没有看到的隐式值导致这些随机超时,或者需要 TCP 保持活动的东西。然而,超时并不总是一致的事实让我怀疑。如果每次都是 60 秒,我就会确信这是一个配置问题。在这种特殊情况下,并不总是 60 秒。这是我的配置现在的样子:如果每次都是 60 秒,我就会确信这是一个配置问题。在这种特殊情况下,并不总是 60 秒。这是我的配置现在的样子:如果每次都是 60 秒,我就会确信这是一个配置问题。在这种特殊情况下,并不总是 60 秒。这是我的配置现在的样子:

global
stats socket /home/haproxy/status user haproxy group haproxy
    log 127.0.0.1   local1 info
#   log 127.0.0.1   local5 info 
    maxconn 4096
    ulimit-n 8250
        # typically: /home/haproxy
    chroot /home/haproxy
    user haproxy    
    group haproxy
    daemon
    quiet
    pidfile /home/haproxy/haproxy.pid

defaults
    log global
    mode    http
    option  httplog
    option  dontlognull
    retries 3
    option redispatch
    maxconn 2000
    contimeout  5000
    clitimeout  60000
    srvtimeout  60000

# Configuration for one application:
# Example: listen myapp 0.0.0.0:80
listen www 0.0.0.0:443
        mode tcp
        balance leastconn
    # Example server line (with optional cookie and check included)
    # server    srv3.0 10.253.43.224:8000 srv03.0 check inter 2000 rise 2 fall 3
# Status port (by default, localhost only...for debugging purposes)
    server ANID3 10.0.1.2:8888 check inter 3000 rise 2 fall 3 maxconn 500
    server ANID1 10.0.1.3:8888 check inter 3000 rise 2 fall 3 maxconn 500
    server ANID2 10.0.1.4:8888 check inter 3000 rise 2 fall 3 maxconn 500

listen health 0.0.0.0:9999
        mode http
        balance roundrobin
        stats uri /haproxy-status
Run Code Online (Sandbox Code Playgroud)

我通过让我们的客户端绕过它并直接转到一个没有超时并且一切都很好的应用服务器来验证 HAProxy 是问题所在。一旦我将它路由到我们的两个 haproxy 服务器之一,随机断开连接就会发生在 25-60 秒之间。

感谢您查看此内容。这很令人沮丧,但我确信这是因为我对 HAProxy 对我的客户的期望缺乏了解。

Gre*_*kew 0

你能测试一下吗:

defaults  
    timeout client 60000  
    option http-server-close  
Run Code Online (Sandbox Code Playgroud)

而不是 clitimeout option http-server-close,:

设置“option http-server-close”会在服务器端启用 HTTP 连接关闭模式,同时保持在客户端支持 HTTP keep-alive 和管道的能力。

http://cbonte.github.io/haproxy-dconv/2.3/configuration.html#option%20http-server-close