2011-06-27 49 views
17

我正在将我的应用扩展到多个服务器,并且一个要求是客户端总是与同一服务器通信(太多的实时数据用于允许弹跳在服务器之间高效)。负载均衡(HAProxy或其他) - 粘滞会话

我目前的设置是一个小型服务器集群(使用Linode)。我有一个使用“平衡源”运行HAProxy的前端节点,因此IP始终指向同一个节点。

我注意到“平衡源”不是一个非常均匀的分布。使用当前的测试设置(2个后端服务器),当使用80-100个源IP的样本大小时,一台服务器的连接数通常为3-4倍。

有没有办法达到更均衡的分配?很明显,粘性会议禁止“完美”的平衡,但40/60分割将优于25/75分割。

回答

0

您可以调整HA-Proxy中的平衡算法,但有一些可用。像例如roundrobin或leastconn。

但是,您需要根据为其提供内容的用户的域来调整平衡。大部分时间你需要做实证测试,并根据你的发现重申你的决定。

25

HAProxy支持修改或插入Cookie,以提供会话持久性,并使用cookie参数。通过将服务器添加到一个名为COOKIENAME cookie的名称

cookie COOKIENAME prefix 

这个例子将修改现有的cookie:

在任一后端或听的部分,添加以下。您的客户将看到类似server1~someotherdata的东西,但您的应用只会看到someotherdata部分。所以你可以在现有的cookies上使用它。此外,此方法允许您只在该cookie存在时执行会话persitence,这意味着您仍然可以在您的站点的静态部分周围平衡人员,并且只在需要时强制实施粘性,但会将该cookie名称添加到会话中。

而且命名的服务器,让你的服务器产品线如下所示:

server server1 1.2.3.4 cookie server1 

更多细节是在HAProxy config guide,它也像您可以使用appsession配置参数为好。

完成此操作后,您可以从列表中选择自己的平衡方法,但我倾向于使用roundrobin,但在考虑粘性会话后,leastconn可能会为您提供更好的平衡。


从文档更使它更容易找到参考部分:

cookie <name> [ rewrite | insert | prefix ] [ indirect ] [ nocache ] 
       [ postonly ] [ preserve ] [ domain <domain> ]* 
       [ maxidle <idle> ] [ maxlife <life> ] 
    Enable cookie-based persistence in a backend. 
    May be used in sections : defaults | frontend | listen | backend 
           yes | no | yes | yes