负载平衡(HAProxy或其他) - 粘性会话

Mic*_*see 17 load-balancing cluster-computing haproxy

我正在努力将我的应用程序扩展到多个服务器,并且一个要求是客户端始终与同一服务器通信(过多的实时数据用于允许服务器之间的有效弹跳).

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

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

有没有办法实现更均衡的分配?显然,粘性会议禁止"完美"平衡,但是40/60分割将优于25/75分割.

Ric*_*son 25

HAProxy支持修改或插入cookie以使用cookie参数提供会话持久性.

在后端或监听部分中,添加以下内容:

cookie COOKIENAME prefix
Run Code Online (Sandbox Code Playgroud)

此示例将通过将名称服务器添加到名为cookie的cookie来修改现有cookie COOKIENAME.您的客户会看到类似server1~someotherdata但您的应用程序只能看到该someotherdata部分.所以你可以在现有的cookie上使用它.此外,此方法允许您仅在该cookie存在时强制执行会话持久性,这意味着您仍然可以均匀地平衡网站静态部分周围的人员,并且仅在需要时强制执行粘性,但将cookie名称添加到会话中.

同时命名您的服务器,因此您的服务器行如下所示:

server server1 1.2.3.4 cookie server1
Run Code Online (Sandbox Code Playgroud)

更多详细信息在HAProxy配置指南中,看起来您也可以使用appsessionconfig参数.

一旦你完成了这个,你可以从列表中选择你自己的余额方法,我倾向于使用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
Run Code Online (Sandbox Code Playgroud)


fyr*_*fyr 0

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

但总体而言,您需要根据为其提供内容的用户域来调整平衡。大多数时候,您需要进行实证测试并根据您的发现重申您的决定。