19

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

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

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

有什么方法可以实现更均衡的分布?显然,粘性会话禁止“完美”平衡,但 40/60 拆分比 25/75 拆分更可取。

4

2 回答 2

27

HAProxy 支持修改或插入 cookie 以提供带有cookie参数的会话持久性。

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

cookie COOKIENAME prefix

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

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

server server1 1.2.3.4 cookie server1

更多细节在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
于 2011-06-29T11:42:09.953 回答
0

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

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

于 2011-06-27T19:50:46.860 回答