使用nginx开源软件实现粘性会话负载均衡器

14
nginx plus中提供的粘性会话(sticky session)和开源版本中的基于哈希cookie的会话保持(session persistence),它们的主要区别是什么?
根据文档,nginx open source允许基于哈希不同的全局变量进行会话持久化,包括$cookie_
以下是配置示例:
    upstream myserver {
        hash $cookie_sessionID;
        server localhost:8092;
        server localhost:8093;
        server localhost:8094 weight=3;
    }

    location / {
       proxy_pass http://myserver;
    }
假设所有新请求都有一个集中机制生成唯一的sessionID cookie,那么这种方法与nginx plus粘性会话方法相比有哪些主要缺点?

2
如果您想要使用粘性负载平衡,您可能需要将 consistent 添加到哈希配置中,以便它读取 hash $cookie_sessionID consistent;;请参阅以下nginx文档:选择负载平衡方法;选项4.通用哈希。 - m01
2
在Nginx开源版本中,它是否可以与hash $cookie_sessionID consistent;一起使用? - Max
2个回答

7

IP Hash 负载均衡可以作为“粘性会话”,但是要记住,这种负载均衡方法本身效果相对较差,因为在现代世界中,许多用户/设备共享同一个外部 IP 地址。

我们在一个相当高负载的应用程序上进行了实验(数千个并发用户),使用 IP Hash 时观察到服务器之间存在数十%的不平衡。

从理论上讲,随着负载和服务器数量的增加,情况应该得到改善,但例如,当我们使用3个和5个服务器时,并没有看到任何显着差异。

因此,我强烈建议不要在生产环境中使用 IP Hash。

作为基于开源的粘性会话解决方案,使用 HAProxy 不失为一个好主意,因为 HAProxy 支持它的开箱即用。 或者使用 HAProxy + Nginx 组合,其中 HAProxy 负责“粘性会话”。 (我知道一个极其高负载的系统成功地使用了这样的组合来达到这个目的,所以这是可行的想法。)


2
这个问题更多地涉及到通过哈希$cookie_cookievalue来构建自定义会话持久性的能力,就像在免费nginx版本中提供的通用哈希选项中所描述的$request_uri一样。更具体地说,与付费nginx版本中建议的类似的“粘性cookie”选项相比,如果所有必要的自定义代码用于分发、维护和生成唯一的会话ID都正常工作,这种选项将有多可靠。 - Vasyl Nekohda

1
您的方法是可行的。根据官方 NGINX 文档(配置基本会话持久性):
“如果您的应用程序需要基本会话持久性(也称为粘性会话),则可以使用 IP Hash 负载平衡算法在 NGINX Open Source 中实现它。”
而 NGINX Plus “提供了一种更复杂的会话持久性形式”。例如,“最少时间”方法——每次请求都选择具有最低平均延迟和最低活动连接数的服务器。

1
我认为问题不在于IP哈希,而在于利用免费的nginx版本中的通用哈希选项构建自定义“粘性cookie”持久性系统的能力。 - Vasyl Nekohda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接