Haproxy 平衡 - 如果第一次超时,请重试另一台服务器

j99*_*j99 5 haproxy

我们使用 fastcgi 协议运行多个后端服务器,我们使用 HAproxy 在它们之间进行平衡。这是一个配置示例:

listen Balancer 192.168.0.1:2000
    mode tcp
    option tcplog
    timeout connect 2000
    timeout server 2000
    timeout queue 2000
    timeout client 2000
    balance leastconn
    server backend1 192.168.0.2:2000 check inter 2000 rise 2 fall 5
    server backend2 192.168.0.3:2000 check inter 2000 rise 2 fall 5
    server backend3 192.168.0.4:2000 check inter 2000 rise 2 fall 5
    server backend4 192.168.0.5:2000 check inter 2000 rise 2 fall 5
    server backend5 192.168.0.6:2000 check inter 2000 rise 2 fall 5
    server backend6 192.168.0.7:2000 check inter 2000 rise 2 fall 5
Run Code Online (Sandbox Code Playgroud)

总超时设置为 2 秒,但大多数请求在 0.3 秒内处理。问题是在高峰期间有时某些后端无法在 2 秒内回复查询,然后返回网关超时。

What I would like to do is that when one server is selected (eg backend1) and it fails to deliver the reply in 1 second, HAproxy would select another backend and retry. 如果它在 1 秒内再次失败,则超时将发生。

因此,不是等待一个服务器 2 秒,是否可以先等待 1 秒,如果失败,请尝试另一个然后失败?

Gre*_*egL 6

如果我正确阅读您的问题,使用设置timeout server为 1 秒(1000 毫秒),并且使用option redispatch应该会给您所需的效果。

option redispatch
no option redispatch
在连接失败的情况下启用或禁用会话重分配 在 HTTP 模式下,如果 cookie 指定的服务器宕机,客户端肯定会坚持下去,因为他们无法刷新 cookie,因此他们将无法访问服务了。

指定“option redispatch”将允许代理打破它们的持久性并将它们重新分配到工作服务器。

它还允许在多次连接失败的情况下重试与另一台服务器的最后一次连接。当然,它需要将“重试”设置为非零值。

这种形式是首选形式,它替代了“redispatch”和“redisp”关键字。

如果此选项已在“默认值”部分启用,则可以通过在其前面添加“no”关键字在特定实例中禁用它。

  • 如果我正确理解了这个问题,用户 j99 想要在响应需要很长时间时重试_after_请求已发送到服务器。AFAIK,`redispatch` 只会在服务器无法连接到 TCP 级别(或者可能无法发送完整请求 - 不清楚)时重新调度。 (3认同)