HAProxy随机HTTP 503错误

问题描述 投票:15回答:5

我们设置了3台服务器:

  • 服务器A使用Nginx + HAproxy来执行负载平衡
  • 后端服务器B.
  • 后端服务器C.

这是我们的/etc/haproxy/haproxy.cfg

global
        log /dev/log   local0
        log 127.0.0.1   local1 notice
        maxconn 40096
        user haproxy
        group haproxy
        daemon

defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        retries 3
        option redispatch
        maxconn 2000
        contimeout      50000
        clitimeout      50000
        srvtimeout      50000
                stats enable
                stats uri /lb?stats
                stats realm Haproxy\ Statistics
                stats auth admin:admin
listen statslb :5054 # choose different names for the 2 nodes
        mode http
        stats enable
        stats hide-version
        stats realm Haproxy\ Statistics
        stats uri /
        stats auth admin:admin

listen  Server-A 0.0.0.0:80    
        mode http
        balance roundrobin
        cookie JSESSIONID prefix
        option httpchk HEAD /check.txt HTTP/1.0
        server  Server-B <server.ip>:80 cookie app1inst2 check inter 1000 rise 2 fall 2
        server  Server-C <server.ip>:80 cookie app1inst2 check inter 1000 rise 2 fall 3

所有三台服务器都有大量的RAM和CPU核心来处理请求

浏览时会显示随机HTTP 503错误:503 Service Unavailable - No server is available to handle this request.

还在服务器的控制台上:

Message from syslogd@server-a at Dec 21 18:27:20 ...
 haproxy[1650]: proxy Server-A has no server available!

请注意,90%的时间没有错误。这些错误随机发生。

haproxy
5个回答
26
投票

我遇到过同样的问题。经过几天拉头发后,我发现了这个问题。

我有两个HAProxy实例在运行。一个是僵尸,在某个更新或haproxy重启期间不知何故从未被杀过。刷新/ haproxy统计信息页面时我注意到了这一点,PID会在两个不同的数字之间发生变化。带有其中一个数字的页面具有荒谬的连接统计数据。确认我做了

netstat -tulpn | grep 80

并看到两个haproxy进程侦听端口80。

为了解决这个问题,我做了一个“杀死xxxx”,其中xxxx是带有可疑统计数据的pid。


6
投票

在这里添加我的答案给其他遇到这个完全相同问题的人,但上面列出的解决方案都不适用。请注意,我的回答不适用于上面列出的原始代码。

对于可能遇到此问题的其他任何人,请检查您的配置,看看您是否可能错误地将相同的“绑定”行放在配置的多个部分中。 Haproxy在启动期间不会检查这一点,我计划将此作为推荐的验证检查提交给开发人员。在我的情况下,我有3个不同的配置部分,我错误地将相同的IP绑定放在两个不同的地方。关于是否使用正确的部分或使用了错误的部分大约是50/50。即使使用了正确的部分,大约一半的请求仍然得到503。


1
投票

您的服务器可能共享一个在特定时间超时的公共资源,并且您的健康检查请求是同时进行的(因此同时将后端服务器拉出)。

您可以尝试使用HAProxy选项spread-checks随机化运行状况检查。


1
投票

我有同样的问题,因为Linux框中运行了2个HAProxy服务,但名称/ pid /资源不同。除非我停止不需要的操作,否则所需的实例会随机抛出503错误,例如5次中的1次。

试图使用单个linux盒子进行多个URL路由,但在haproxy或我定义的haproxy的配置文件中看起来有限制。


0
投票

很难说没有更多细节,但是你有可能超过每个后端配置的maxconn吗?统计UI在前端和单个后端上显示这些统计信息。

© www.soinside.com 2019 - 2024. All rights reserved.