我设置了两个专用的 haproxy 服务器,以将负载分散到三个应用服务器上。我设置了常规 http 80 平衡,还设置了一个专用的以与 websockets 配合使用。
大约 2 小时后,它运行良好,但之后速度变得非常慢,页面加载大约需要 30 秒。当我重新启动 haproxy 时,它又恢复正常了。
以下是我的配置。知道是什么原因造成的吗?
global
user haproxy
group haproxy
defaults
mode http
timeout connect 5s
timeout client 5s
timeout server 60s
stats enable
stats auth aa:bb
frontend proxy
# listen on 80
bind 0.0.0.0:80
# allow for many connections, with long timeout
maxconn 200000 # total maximum connections, check ulimit as well
timeout client 24h
# default to webapp backend
default_backend webapp
# is this a socket io request?
acl is_websocket hdr_end(host) -i node.domain.com
use_backend websocket if is_websocket
backend webapp
balance roundrobin # assuming that you don't need stickiness
# allow client connections to linger for 5s
# but close server side requests to avoid keeping idle connections
option httpchk HEAD /check.txt HTTP/1.0
option http-server-close
option forwardfor
server app1 x.y.149.133:80 cookie app1 weight 10 check
server app2 x.y.149.134:80 cookie app2 weight 15 check
server app3 x.y.149.135:80 cookie app3 weight 15 check
backend websocket
balance source
# options
option forwardfor # add X-Forwarded-For
# Do not use httpclose (= client and server
# connections get closed), since it will close
# Websockets connections
no option httpclose
# Use "option http-server-close" to preserve
# client persistent connections while handling
# every incoming request individually, dispatching
# them one after another to servers, in HTTP close mode
option http-server-close
option forceclose
server app1 x.y.149.133:3000 cookie app1 weight 10 check
server app2 x.y.149.134:3000 cookie app2 weight 15 check
server app3 x.y.149.135:3000 cookie app3 weight 15 check
答案1
WebSocket 与日常的 http 负载平衡的不同之处在于,与到达率相比,WebSocket 最终会获得较高的并发连接数。这是系统中的一个重要区别,所以如果你不清楚,可以看看在我的这个回答中。
所以,无论你的问题是什么,我猜当你达到某个阈值时,它就会发生。并发连接数。根据您提供的信息,这是我的最佳猜测:
后端 Web 套接字包含 3 个服务器。负载均衡器通过同一个 IP 与所有服务器通信。这意味着您总共拥有 source_port_range * 目标 IP。如下所示:
[root@ny-kbrandt01 ~]# cat /proc/sys/net/ipv4/ip_local_port_range
32768 61000
[root@ny-kbrandt01 ~]# echo $(( (61000-32768) * 3 ))
84696
因此,当您达到大约 84k 个连接时,您的 haproxy 实例将缺少源端口,CPU 会出现峰值,因为它会执行类似于垃圾收集的操作来查找更多的源端口。
如果不是,我敢打赌这肯定是出了什么问题,使用 haproxy 统计页面监控你的并发连接,并监控你的 CPU,以便更好地了解当速度变慢时发生了什么。