我们正在开发一个使用 haproxy 进行负载平衡的 HTTP web 服务。该 web 服务通过 SSL 访问。它是一种 RESTful HTTP 服务,只接受 JSON、执行一些工作并返回 JSON。没有会话的概念。
我们在两个冗余的 Web 服务服务器前设置了冗余的负载均衡器。每个服务器都位于 Apache 后面,Apache 用作代理来处理 SSL 和日志记录。如果重要的话,我们的 Web 服务是一个使用 compojure (jetty) 来处理 HTTP 的 Clojure (java) 应用程序。
这是显示客户端请求通过我们现有系统的路径的简要图表。
client request -> haproxy (load balancing) -> apache (ssl, logging) -> webservice
我们希望与负载均衡器的任何连接都建立持久连接,然后由同一台服务器为通过该持久连接发送的所有后续请求提供服务。换句话说,我们不希望与 haproxy 的持久连接向多个 webservice 服务器发出请求。
您建议我们如何实现这一点?我们如何将负载均衡器上的给定连接“固定”到特定的 Web 服务服务器?我们如何防止意外地用多个密集请求压垮特定的 Web 服务服务器?
答案1
您正在寻找 HAProxy 的cookie
指令,它将确保客户端坚持使用相同的后端。
至于避免使给定后端过载,您将完全依赖于初始负载平衡 - 在会话中将客户端移动到不同的服务器不符合从负载平衡器强制执行的会话持久性。如果负载问题很大,那么也许可以重新考虑让 HAProxy 进行会话持久性,而是在后端之间保持集中的会话状态?
答案2
balance source
在块中使用defaults
并删除option httpclose
条目就可以达到目的。