我们有 2 台 Web 服务器需要进行负载平衡。每台服务器都有一个供公众使用的主 Web 应用程序。每台服务器还具有多个由主应用程序内部使用的依赖微服务。
如果检测到任何一个服务器的微服务发生故障,我们希望负载均衡器排除该服务器。
http://server1/mainApp
http://server1/microservice1
http://server1/microservice2
http://server1/mainApp
http://server2/microservice1
http://server2/microservice2
因此如果http://server2/microservice2
下降那么我们想要服务器1为所有流量提供服务。或者如果http://server1/microservice1
发生故障,我们希望服务器2到服务器流量。
这种逻辑在 HAproxy 中可以实现吗?或者是否有其他技术可以为我们做到这一点?
谢谢!
答案1
HAproxy 没有内置此类复杂健康检查功能。
也就是说,您可以做的是在后端(或者在 LB 上,如果更容易/更好)编写一个快速而粗糙的页面,它对所有微服务执行 GET 请求并返回给定结果的给定状态代码或字符串;如果一切正常,则返回 200 和“OK”,否则返回 503 和“FAILED”。
我编写了一个类似的 .NET 页面来检查某个特定服务是否正在系统上运行,因为即使支持服务没有运行,IIS 也总是返回 200。
由于您只有 3 个微服务,所以它应该可以运行良好,但如果您有 10 个或数百个微服务,那么运行效果就不太好了。
答案2
您可以使用tcp-check
。在后端部分,添加类似以下内容:
option tcp-check
tcp-check connect
tcp-check send GET\ /\mainApp\/check HTTP/1.0\r\n
tcp-check send Host:\ haproxy.1wt.eu\r\n
tcp-check send \r\n
tcp-check expect rstring (2..|3..)
tcp-check connect
tcp-check send GET\ /\microservice1\/check HTTP/1.0\r\n
tcp-check send Host:\ haproxy.1wt.eu\r\n
tcp-check send \r\n
tcp-check expect rstring (2..|3..)
看:https://cbonte.github.io/haproxy-dconv/configuration-1.5.html#4.2-tcp-check%20connect