我们正在运行多个使用 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
总体超时设置为 2 秒,但大多数请求都在 0.3 秒内处理完毕。问题是,在高峰期,有时某些后端无法在 2 秒内回复查询,然后返回网关超时。
我想要做的是,当选择一台服务器(例如 backend1)并且它在 1 秒内无法提供回复时,HAproxy 会选择另一个后端并重试。如果它在 1 秒内再次失败,则会发生超时。
因此,不是等待一台服务器 2 秒,而是可以先等待 1 秒,如果失败了,再尝试另一台,然后失败?
答案1
如果我正确理解了你的问题,使用设置timeout server
为 1 秒(1000 毫秒),然后使用option redispatch
应该会给你预期的效果。
选项重新分派
无选择重新调度
在连接失败时启用或禁用会话重新分配在 HTTP 模式下,如果 cookie 指定的服务器关闭,客户端肯定会坚持使用它,因为它们无法刷新 cookie,所以它们将无法再访问该服务。指定“选项重新分派”将允许代理打破其持久性并将其重新分配到工作服务器。
它还允许在多次连接失败的情况下重试与另一台服务器的最后一次连接。当然,它要求将“重试”设置为非零值。
此形式是首选形式,它取代了“redispatch”和“redisp”关键字。
如果已在“默认”部分启用此选项,则可以在特定实例中通过在其前面添加“no”关键字来禁用它。