Haproxy 需要每 2 小时重启一次

Haproxy 需要每 2 小时重启一次

我设置了两个专用的 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,以便更好地了解当速度变慢时发生了什么。

相关内容