如何查看/重新计算 nginx 中基于哈希的负载平衡

如何查看/重新计算 nginx 中基于哈希的负载平衡

在我的设置中,我使用 Nginx 作为 IIS 前面的反向代理和负载平衡器,使用哈希指示。

对于哈希键,我使用包含客户 ID 的 cookie - 通过这种方式,我根据用户当前工作的客户对用户(连接)进行分组。(该应用程序有 N 个客户,每个客户有 N 个用户,每个用户可以为不同的客户工作,但在单个时间点它为一个客户工作)。通过这种方式,我可以更好地利用 IIS 内部缓存,因为转发到相同后端的用户通常使用相同的数据。哈希指令的问题在于它无法保证客户端在后端之间分布良好。

以下是我关于哈希负载平衡的问题:

  • 我能否以某种方式看到哪个后端上的哈希被分配了?
  • 我可以根据每日应用程序使用情况重置/重新计算已分配的密钥吗?似乎在重新启动/重新加载时哈希值也会保留。

这是我的配置:

upstream backend_web { 
  hash $http_currentcustomerid;
  server 192.168.0.1:80 max_fails=1 fail_timeout=20s weight=9 ;
  server 192.168.0.2:80 max_fails=1 fail_timeout=20s weight=11 ;
  server 192.168.0.3:80 max_fails=1 fail_timeout=20s weight=4 ;
}

提前感谢任何帮助。

答案1

我能否以某种方式看到哪个后端上的哈希被分配了?

据我所知,在 nginx 中没有办法看到这一点。您可以在来自 nginx 的上游请求中看到这些值,并可能在那里进行记录。

另一种选择是编写一个 Perl 脚本,您可以在其中使用 Cache::Memcached 库从用户 ID 生成哈希值。

我可以根据每日应用程序使用情况重置/重新计算已分配的密钥吗?似乎在重新启动/重新加载时哈希值也会保留。

不是。哈希函数始终是从两个值(哈希键和上游数量)到输出键的映射函数,并且除非上游数量发生变化或“来自”值发生变化,“到”值不会改变。

这个事实也意味着weight你的指令中的参数server没有任何作用。weight仅适用于对上游请求使用循环模式的情况。

我不知道是否存在任何方法既可以根据 HTTP 标头值获得一致的目标节点,又可以根据某些标准分配请求。这两个目标是相互矛盾的。

相关内容