首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nginx,同时使用粘性和最少连接算法的负载均衡

Nginx,同时使用粘性和最少连接算法的负载均衡
EN

Stack Overflow用户
提问于 2014-10-16 23:34:34
回答 2查看 2.6K关注 0票数 17

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

代码语言:javascript
复制
upstream app {
    ip_hash;
    server 1;
}

当我们想要添加另一台后端服务器时,问题出现了:

代码语言:javascript
复制
upstream app {
    ip_hash;
    server 1;
    server 2;
}

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

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

所以问题是我们能不能用Nginx把粘性逻辑和最少连接逻辑结合起来?你知道还有哪些负载均衡器解决了这个问题吗?

EN

回答 2

Stack Overflow用户

发布于 2017-10-08 01:53:29

也许使用split_clients模块会有所帮助。

代码语言:javascript
复制
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,您可以使用该变量,如下所示:

代码语言:javascript
复制
server {
   location /some/path/ {
   proxy_pass http://$upstream_app;
}

这是对使用粘性会话的least_conn和负载均衡器的一种解决方法,“缺点”是,如果需要添加更多的服务器,则需要创建一个新的流,例如:

代码语言:javascript
复制
split_clients "${remote_addr}AAA" $upstream_app {
    30% app_another_server;
    30% app_new;
    *   app;
}

用于测试:

代码语言:javascript
复制
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)

票数 8
EN

Stack Overflow用户

发布于 2017-10-09 03:58:58

使用HAProxy可以很容易地实现这一点,我确实建议您访问through it thoroughly,看看您当前的设置如何受益。

使用HA代理,您将拥有以下内容:

代码语言:javascript
复制
backend nodes
    # Other options above omitted for brevity
    cookie SRV_ID prefix
    server web01 127.0.0.1:9000 cookie check
    server web02 127.0.0.1:9001 cookie check
    server web03 127.0.0.1:9002 cookie check

这仅仅意味着代理通过使用cookie来跟踪来回于服务器的请求。

但是,如果您不想使用HAProxy,我建议您将会话实现更改为使用内存中的DB,如redis/memcached。这样,您可以使用leastconn或任何其他算法,而无需担心会话。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26408384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档