在我的设置中,我使用 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 标头值获得一致的目标节点,又可以根据某些标准分配请求。这两个目标是相互矛盾的。