我正在将我们的 Web 负载均衡从 Nginx 切换到 HAProxy。目前我们的设置在 nginx 中运行良好,但我们希望通过服务检查实现更多的冗余。我们的后端是 Golang 应用程序。
为了简单起见,我们只使用一个配置相当简单的 HAProxy 服务器,但似乎在加载大约 1-2 分钟后,客户端就会报告向应用程序发送超时信息。我们的超时时间相当短(100 毫秒),但都是本地流量,应用程序通常在 2-3 毫秒内响应。
但是,我们平台上每秒发布的帖子数约为 2k,因此我对 Linux 进行了一些小调整,以降低 TCP 连接数。也许我在这里遗漏了什么。
以下是这些请求的简单流程。所有这些请求都位于我们的数据中心内。
请求者 -> 本地 nginx 服务器(路由器) -> haproxy -> 应用服务器
/etc/sysctl.conf
# Decrease TIME_WAIT seconds
net.ipv4.tcp_fin_timeout = 30
# Recycle and Reuse TIME_WAIT sockets faster
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
这是我们的 haproxy 配置。这里没什么奇怪的。
global
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
ssl-default-bind-options no-sslv3
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
defaults
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
frontend http-in
bind *:80
default_backend data_api
backend data_api
option httpchk GET /status/version
server gopp1 10.10.85.3:8000 check
server gopp2 10.10.85.4:8000 check
server gopp3 10.10.85.5:8000 check
stats enable
stats hide-version
stats scope .
stats uri /admin?stats
stats realm Haproxy\ Statistics
stats auth admin:secret
stats admin if TRUE
答案1
您maxcon
在 HAProxy 中的值是多少?另外,请maxsock
在 HAProxy 统计界面中检查您的值(通常为ulimit -n
),以确保您没有用尽文件描述符。
我们已经对 400,000 RPM 进行了负载测试(注意:不使用 SSL Offload)。这是我们的 haproxy 配置,前端/后端没有特别的性能相关。
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 25000
user haproxy
group haproxy
daemon
spread-checks 4
tune.maxrewrite 1024
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 25000
这是我们使用的内核参数。
net.ipv4.ip_nonlocal_bind=1
net.ipv4.ip_local_port_range = 1025 65534
net.ipv4.tcp_mem = 786432 1697152 1945728
net.ipv4.tcp_rmem = 4096 4096 16777216
net.ipv4.tcp_wmem = 4096 4096 16777216
net.ipv4.tcp_max_syn_backlog = 10240
net.ipv4.tcp_max_tw_buckets = 400000
net.ipv4.tcp_max_orphans = 60000
net.ipv4.tcp_synack_retries = 3
net.core.somaxconn = 10000
fs.file-max = 65536
fs.nr_open = 65536
还设置 /etc/security/limits.conf 以允许 65536 个文件描述符。
haproxy soft nofile 63536
haproxy hard nofile 63536
root soft nofile 63536
root hard nofile 63536