【问题标题】:Nginx, load-balancing using sticky and least connections algorithms simulteniouslyNginx,同时使用粘性和最少连接算法进行负载平衡
【发布时间】:2014-12-12 01:19:26
【问题描述】:

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

upstream app {
    ip_hash;
    server 1;
}

当我们要添加另一个后端服务器时出现问题:

upstream app {
    ip_hash;
    server 1;
    server 2;
}

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

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

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

【问题讨论】:

  • 也许这应该被移到 serverfault 以获得答案?
  • 有趣的问题是为什么“服务器 1 上的负载继续增加” - 是不是您的大多数用户都坐在同一个或几个 NAT 后面?在这种情况下,对源 IP 进行哈希处理效率不高,您可以考虑通过 hash 指令使用更复杂的密钥,而不是 `ip_hash'。例如,您可能希望将一些用户特定的 URI 部分或参数添加到键...
  • 有用的答案,但我不确定他们是否回答了最初提出的问题。亚历克斯?

标签: nginx load-balancing reverse-proxy


【解决方案1】:

可能使用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 和使用粘性会话的负载平衡器的解决方法,“缺点”是如果需要添加更多服务器,则需要创建新流,例如:

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)

【讨论】:

  • 注意,split_clients 将使用一致的散列进行负载平衡,这可能会或可能不会比循环法更好,但不是操作要求的(基于least_conn 的负载平衡)
【解决方案2】:

您可以使用HAProxy 轻松实现此目的,我确实建议您前往through it thoroughly 看看您当前的设置如何受益。

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

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,我建议您设置更改会话实现以使用内存数据库,例如 redis/memcached。这样,您就可以使用 minimumconn 或任何其他算法,而无需担心会话。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 2021-11-27
    相关资源
    最近更新 更多