如何解决 haproxy 负载均衡器上的后端连接错误?

如何解决 haproxy 负载均衡器上的后端连接错误?

haproxy 统计页面

以下是我的 haproxy 配置

global
    log /dev/log    local0 notice
    log /dev/log    local0 debug
    log 127.0.0.1 local0
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin
    stats timeout 30s
    user haproxy
    group haproxy
    daemon
    maxconn 5000
defaults
    log     global
    mode    tcp
    option  tcplog
    option  tcpka
    timeout connect 60s
    timeout client 1000s
    timeout server 1000s

frontend aviator-app
    option tcplog
    log /dev/log local0 debug
    bind *:4433 ssl crt /etc/haproxy/certs/{domain_name}.pem
    mode tcp
    option clitcpka
    option http-server-close
    maxconn 5000
    default_backend aviator-app-pool
    # Table definition
    stick-table type ip size 2000k expire 30s store conn_cur
    # Allow clean known IPs to bypass the filter
    tcp-request connection accept if { src -f /etc/haproxy/whitelist.lst }
    # Shut the new connection as long as the client has already 100 opened
    # tcp-request connection reject if { src_conn_cur ge 500 }
    tcp-request connection track-sc1 src

backend aviator-app-pool
    option tcplog
    log /dev/log local0 debug
    balance roundrobin
    mode tcp
    option srvtcpka
    option http-server-close
    maxconn 50
    # list each server
            server appserver1 10.0.1.205 maxconn 12
            server appserver2 10.0.1.183 maxconn 12
            server appserver3 10.0.1.75 maxconn 12
            server appserver4 10.0.1.22 maxconn 12
            # end of list

listen  stats
    bind            *:8000
    mode            http
    log             global

    maxconn 10

    clitimeout      100s
    srvtimeout      100s
    contimeout      100s
    timeout queue   100s

    stats enable
    stats hide-version
    stats refresh 30s
    stats show-node
    stats auth username:password
    stats uri  /haproxy?stats

当我以每秒约 12-13 个 http 请求的速度运行负载测试时,在测试的第一个小时内我没有看到任何错误。但在测试进行约 90 分钟后,大量请求开始失败。jmeter 的错误消息通常为“连接超时:连接”或““domain_name:4433”无法响应”。以下是来自 haproxy.log 的一些日志消息。我还看到大量“conn 错误”(如上图所示)和一些“resp 错误”。

May  7 19:15:00 ip-10-0-0-206 haproxy[30349]: 64.112.179.79:55894 
[07/May/2018:19:14:00.488] aviator-app~ aviator-app-pool/<NOSRV> 
60123/-1/60122 0 sQ 719/718/717/0/0 0/672
May  7 19:15:00 ip-10-0-0-206 haproxy[30349]: 64.112.179.79:49905 
[07/May/2018:19:12:53.483] aviator-app~ aviator-app-pool/appserver2 
60022/1/127171 2283568 -- 719/718/716/11/0 0/666

我在后端服务器上没有看到任何错误或堆栈跟踪。测试期间负载均衡器的 CPU 使用率较低(负载均衡器的 CPU 使用率低于 10%),每个后端服务器的 CPU 使用率约为 30%。如能帮助调试此问题,我们将不胜感激。

答案1

您的后端有,maxconn 50所以 HAProxy 正在将溢出队列放入队列,等待现有的 50 个连接中的一个完成。当每个连接断开时,另一个连接将被允许通过后端...但您的后端速度不够快。请求在代理处备份,最终,代理会在它们进入代理队列后将它们拆除timeout connect 60s

sQ日志条目中的内容解释了这一点。

s:等待服务器发送或接收数据时服务器端超时已到。

Q:代理正在 QUEUE 中等待连接槽。只有当服务器设置了“maxconn”参数时才会发生这种情况。

断开连接时的会话状态在 HAProxy 配置指南中。

相关内容