检查失败后 HAProxy 无法恢复

检查失败后 HAProxy 无法恢复

全部,

我遇到了 HAProxy 在后端服务器重新启动后无法恢复的问题。我使用代理不是为了负载平衡,而是为了将不同的 URL 定向到不同的服务器(Web 和 Web 服务)以避免跨域问题。代理在第一次检查失败之前工作正常,但 HAProxy 在恢复后永远不会恢复转发到它。代理在 docker 容器内运行(https://registry.hub.docker.com/u/dockerfile/haproxy/dockerfile/),并且它应该运行HAProxy 1.5.3。

haproxy配置文件

global
    log         127.0.0.1 local0
    log         127.0.0.1 local1 notice
    user        haproxy
    group       haproxy

defaults
    mode        http
    log         global
    option      dontlognull
    option      httpclose
    option      httplog
    option      forwardfor
    option      persist
    option      redispatch
    option      http-server-close
    contimeout 5000
    clitimeout 50000
    srvtimeout 50000
    maxconn     60000
    retries     3
    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
    stats enable
    stats uri /haproxy-stats

frontend http-in
    bind *:80

    default_backend       server1
    acl url_server1       path_beg -i     /server1
    acl url_server2       path_beg -i     /services/server2
    use_backend server1   if url_server1
    use_backend server2   if url_server2

backend server1
    balance roundrobin
    option httpchk GET /server1/content/
    server server1 server1:8080 check inter 10s rise 1 fall 5

backend server2
    balance roundrobin
    option httpchk GET /services
    server server2 server2:8181 check inter 5s rise 1

在 HAProxy 的日志中,我看到以下错误消息:

[WARNING] 040/210248 (1) : Server server1/server1 is DOWN, reason: Layer4 connection problem, info: "Connection refused", check duration: 0ms. 0 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
[ALERT] 040/210248 (1) : backend 'server1' has no server available!

在浏览器中我看到:

503 Service Unavailable
No server is available to handle this request.

一旦我重新启动服务器,我就再也看不到表明 HAProxy 已确定它已恢复的日志消息,并且我仍然在浏览器中收到 503 错误,即使我可以访问 server1:8080 并看到该站点已恢复。

答案1

我们也有类似的情况。运行一个月左右后,服务器将被标记为关闭,并且不会重新启动。

默认情况下,HAProxy 在启动时会将所有主机名解析为 IP。如果服务器更改 IP 地址,HAProxy 不会再次解析 DNS,直到重新启动。具体来说,我们是 AWS,并且指向 ALB/ELB。一个月后,ALB/ELB 会更改其 IP(很可能是进行维护)。此时 IP 已损坏,将继续出现故障。

我们的解决方案是向 HAProxy.cfg 添加一个解析器:

resolvers myresolver
  nameserver dns1 10.110.0.2:53
  resolve_retries       30
  timeout retry         1s
  hold valid           30s

server myserver <server_name>:443 maxconn 32 check ssl verify none resolvers myresolver

HApRoxy 文档

答案2

我遇到了同样的问题,我的理解是,如果后端的所有服务器都宕机了,HaProxy 会认为整个后端都宕机了。一旦后端被标记为宕机,它就不会再恢复(这没有记录,我根据我的经验得出这个结论)。

由于您只有一台服务器,因此您的服务器很可能在重启期间被标记为关闭。如果您有多台服务器,这将是负载平衡器的正确行为。

我的解决方案是增加检查间隔和跌倒参数:

  • 上升参数设置服务器必须通过的检查次数,才能宣布其正常运行。默认值为 2。
  • 落下参数设置服务器必须失败多少次才能被宣布死亡。默认值为 3。
  • 跨国公司参数设置这些检查之间的间隔。默认值为 2000 毫秒。

例如:

server foo 1.2.3.4:80 check inter 5000 fall 5 rise 1

答案3

我遇到了同样的问题,我的服务托管在 kubernetes 中。原来这是 k8s dns 问题。我通过添加解决了这个问题

resolvers mydns
  parse-resolv-conf
  hold valid 10s
backend your_backend
  ...
  server server_name ip:port resolvers mydns check inter 1s

除了手动重启 haproxy 之外,您还可以执行以下操作来调试:

设置 haproxy 统计页面,单击force up您的后端服务器。并检查您的 haproxy 是否恢复工作。

答案4

我偶然发现了完全相同的问题,我认为这是设计使然。HAProxy 有一个fall对此行为负责的财产

fall <count>  
   The "fall" parameter states that a server will be considered as dead after
   <count> consecutive unsuccessful health checks. This value defaults to 3 if
   unspecified. See also the "check", "inter" and "rise" parameters.

我不知道如何恢复一个死亡的实例。我甚至尝试了这个问题中提到的交互式控制台

相关内容