如何使用 Nginx 中的 hash_ip 作为负载均衡器将客户端均匀分布到服务器上?

如何使用 Nginx 中的 hash_ip 作为负载均衡器将客户端均匀分布到服务器上?

我知道 Nginx 可以使用 hash_ip 将特定客户端绑定到服务器。

我的问题是,当 Nginx 使用客户端 IP 进行哈希处理时,它是否会将客户端均匀地分配给服务器,而不管所使用的客户端 IP 是什么,或者它是否取决于所使用的 IP?

如果它依赖于客户端IP,我该如何将客户端均匀地分配到服务器上?

此外,有没有办法检查 Nginx 使用 hash_ip 创建的哈希表?

答案1

由于客户端 IP 的哈希值不会完美,因此您几乎肯定会遇到不均匀分布的情况。此外,来自这些客户端 IP 的请求率也不会完全平衡。但是,如果客户端 IP 的数量足够多,不均匀性就会相对较小,在实际应用中可以忽略不计。

如果你需要绝对均匀的分配,那你就麻烦了。循环分配可以让你获得均匀的请求数数然而,在所有请求的处理时间都完全相同的情况下,这种系统极为罕见,因此加载在一组循环分配的后端上,负载不会完全均衡。面对变化很大且不可预测的服务时间,您可以通过使用最少连接路由算法来稍微改善负载情况,其中负载平衡器将作业发送到“进行中”作业数量最少的后端,假设每个并发连接对即时系统负载的贡献大致相等。

为了进一步改善这种情况,需要使用任意数量的越来越复杂的调度算法尝试平衡负载,但如果没有完美地预先了解服务每个请求所需的资源,您注定只能进行近似计算。请注意,据我所知,nginx 中没有内置任何高级调度算法。

如果平衡后端负载很重要,那么最好的办法就是在系统中添加某种“反馈”,以便平衡器了解后端的当前状态。要正确做到这一点,需要一定程度的基本控制理论,这是由于作业被路由到后端与该作业对系统负载的影响之间存在滞后。如果没有这样的控制,你最终会惊群效应你的系统将化为尘土。

是的,这是一个复杂的问题。这就是为什么每个人都只是将他们的负载均衡器配置为循环或最小连接,集中存储他们的会话和缓存,然后去酒吧。

答案2

不确定这是否仍然有效但我遇到了这个问题:

https://github.com/gnosek/nginx-upstream-fair

相关内容