我们担心基于 IP 的服务负载平衡(例如,移动客户端从 3G 切换到 Wifi)。有没有办法基于 URL 的一部分而不是通过 IP 哈希来实现负载平衡?
答案1
答案2
一个非常简单的方法(自 1.7.2 起)实现方法是对传入的 URL 中的参数进行哈希处理:
upstream upstream_name {
hash $arg_loadBalancingToken consistent;
server 192.168.1.2:1234;
server 192.168.1.3:1234;
}
这部分有什么诀窍:
hash $arg_loadBalancingToken consistent;
它只是意味着将对查询 URL 中的nginx
参数进行哈希处理(在 中,它将对 进行哈希处理),并根据此哈希的结果平衡负载。您可以用任何您想到的名称替换。 关键字是可选的,意味着如果有一天您从上游添加或删除服务器,将尝试重新分配尽可能少的密钥。从loadBalancingToken
https://yourserver.com/path?arg1=toto&loadBalancingToken=123
123
loadBalancingToken
consistent
nginx
文档:
hash 指令的可选一致参数可启用 ketama 一致哈希负载平衡。请求根据用户定义的哈希键值均匀分布在所有上游服务器中。如果上游服务器被添加到上游组或从上游组中删除,则只有少数键会被重新映射,这可最大限度地减少负载平衡缓存服务器或其他累积状态的应用程序的缓存未命中。
您还可以决定对已知的任何内容进行哈希处理nginx
。cookie
的值toto
:
hash $cookie_toto [consistent];
查询中的所有参数:
hash $args [consistent];
您可以使用的完整列表是这里。
答案3
这可能并不完全适合您,但通过 cname 进行“平衡”可能会引起您的兴趣。
server1 IN A 192.168.0.101
server2 IN A 192.168.0.102
www IN CNAME server1
mobile IN CNAME server2
实际上,任何访问“mobile.example.com”的人最终都会向 server2 请求数据。然后在 sever1/www 上适当设置用户代理重写规则。