我想知道如果原始服务器瘫痪了,是否可以使用 HAProxy 将失败的请求重新发送到另一台服务器。
我们在多个 HAProxy 实例后面的多台服务器上运行 REST API。
没有平衡亲和力,平衡纯粹是依靠 来完成的round-robin
。
要升级一台服务器,我们只需重新启动它,并且由于健康检查,HAProxy 通常不会向该服务器发送任何数据。
但是:如果服务器在两次健康检查之间出现故障,并且 HAProxy 在不知道该服务器已故障的情况下将 HTTP 请求转发到该服务器 - 该请求将失败(显然)。
有没有办法配置 HAProxy,使其注意到连接已断开并在另一台服务器上重试?
或者至少让 HAProxy 直接将该服务器标记为不健康,这样我们在转换期间只会丢失一个请求,而不是多个请求。
HAProxy 在 docker 容器内运行,服务器也是 docker 容器。
答案1
是的,在 2.0 版本中,haproxy 已经实现了第 7 层重试。
新的重试配置指令定义在什么情况下重试向另一台服务器发送失败的 HTTP 请求。早期版本有option redispatch
,retries
但只会在出现连接问题时重新分派(例如,在建立连接后不会出现错误/超时)。
请注意不要重试 POST,以免在后端速度较慢等情况下导致多次重复的数据库提交。
例子:
backend test
balance roundrobin
option redispatch 1
retry-on all-retryable-errors
retries 3
http-request disable-l7-retry if METH_POST
server app1 192.168.0.1:80 maxconn 30 check
server app2 192.168.0.2:80 maxconn 30 check
server app3 192.168.0.3:80 maxconn 30 check