Nginx,同时使用粘性和最少连接算法进行负载平衡

标签 nginx load-balancing reverse-proxy

我们使用 Nginx 作为 websocket 应用程序的负载均衡器。每个后端服务器都保存 session 信息,因此来自客户端的每个请求都必须在同一台服务器上转发。所以我们使用ip_hash实现这一目标的指令:

upstream app {
    ip_hash;
    server 1;
}

当我们要添加另一个后端服务器时会出现问题:
upstream app {
    ip_hash;
    server 1;
    server 2;
}

新连接到服务器 1 和服务器 2 - 但在这种情况下这不是我们需要的,因为服务器 1 上的负载继续增加 - 我们仍然需要粘性 session ,但 least_conn算法也启用了——所以我们的两台服务器接收到大约相等的负载。

我们还考虑使用 Nginx-sticky-module但是文档说,如果没有可用的粘性 cookie,它将回退到循环默认 Nginx 算法 - 所以它也不能解决问题。

所以问题是我们可以使用 Nginx 结合粘性和最少连接逻辑吗?你知道还有哪些其他负载均衡器可以解决这个问题吗?

最佳答案

可能使用 split_clients模块可以帮助

upstream app {
    ip_hash;
    server 127.0.0.1:8001;
}

upstream app_new {
    ip_hash;
    server 127.0.0.1:8002;
}

split_clients "${remote_addr}AAA" $upstream_app {
    50% app_new;
    *   app;
}

这将拆分您的流量并创建变量 $upstreap_app你可以使用的那个:
server {
   location /some/path/ {
   proxy_pass http://$upstream_app;
}

这是 least_conn 的解决方法以及使用粘性 session 的负载均衡器,“缺点”是如果需要添加更多服务器,则需要创建一个新流,例如:
split_clients "${remote_addr}AAA" $upstream_app {
    30% app_another_server;
    30% app_new;
    *   app;
}

供测试用:
for x in {1..10}; do \
  curl "0:8080?token=$(LC_ALL=C; cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1)"; done

关于这个模块的更多信息可以在这篇文章中找到(Performing A/B testing)

关于Nginx,同时使用粘性和最少连接算法进行负载平衡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26408384/

相关文章:

使用带有 nginx rsync 的 docker 的 Symfony 缓存权限

nginx - 更新 GeoIP.dat 时 nginx 重新加载是否足够

java - Tomcat Web 应用程序可以告诉负载均衡器它的 Tomcat 已关闭吗?

node.js - 让 nginx 重定向到随机端口

javascript - 如何使用负载均衡器使meteor从一台服务器获取代码

php - Drupal 8 + Nginx 反向代理作为子目录

reverse-proxy - 在 artifactory 上复制远程 docker 注册表的正确设置是什么

docker - 为什么通过从容器中暴露 uwsgi 端口,nginx 会收到 502 BAD GATEWAY?

typescript - Nginx:上次重新加载配置是什么时候?

amazon-ec2 - Memcached 无法与 AWS Classic Load Balancer 一起使用