我们设置了一个负载均衡器来平衡 2 台服务器。配置如下:
global
maxconn 40960
user haproxy
group haproxy
daemon
defaults
log global
option dontlognull
retries 3
#option redispatch
timeout client 10s
timeout server 10s
timeout connect 4s
maxconn 40960
listen webpool lbIP:80
mode http
cookie SERVERID insert indirect
balance roundrobin
server slave1 slave1IP:80 cookie A check port 8981
server slave2 slave2IP:80 cookie B check port 8982
服务器从属 1 和从属 2 需要摘要身份验证。当客户端发送请求时,第一个请求被平衡到从属 1。这将返回 401:未授权。第二个请求被平衡到从属 2 并将成功,它返回 200:OK。问题是身份验证始终发生在从属 1 上,而响应始终来自从属 2。我希望将两个请求(身份验证和返回数据)放入一个连接/从属中。
是否可以在 HAproxy 中配置此功能?
答案1
如果我理解正确的话,您可以尝试使用不同的平衡算法balance source
而不是循环算法。使用此算法,来自同一 IP 的所有请求都将发送到同一后端服务器(除非该服务器已关闭)。这可以根据您的客户端 IP 地址均匀地在后端服务器之间分配负载。
答案2
是的,这可以很简单地完成。
balance uri
http://cbonte.github.io/haproxy-dconv/configuration-1.4.html#4.2-balance
乌里 此算法对 URI 的左侧部分(问号之前)或整个 URI(如果存在“whole”参数)进行哈希处理,并将哈希值除以正在运行的服务器的总权重。结果指定哪个服务器将接收请求。这可确保只要没有服务器启动或关闭,相同的 URI 就会始终指向相同的服务器。它与代理缓存和防病毒代理一起使用,以最大限度地提高缓存命中率。请注意,此算法只能在 HTTP 后端中使用。此算法默认为静态,这意味着动态更改服务器的权重不会产生任何影响,但可以使用“hash-type”进行更改。
此算法支持两个可选参数“len”和“depth”,后面都跟一个正整数。当需要仅根据 URI 的开头来平衡服务器时,这些选项可能会有所帮助。“len”参数表示算法应仅考虑 URI 开头的那么多字符来计算哈希值。请注意,将“len”设置为 1 几乎没有意义,因为大多数 URI 都以“/”开头。
“depth”参数表示用于计算哈希的最大目录深度。请求中的每个斜杠都计为一层。如果同时指定了两个参数,则在达到其中一个时评估停止。
uri 始终相同,因此挑战会发送到相同的后端。希望您的大多数 uri 都是唯一的(即具有用户 ID),这样就不会影响平衡。