在haproxy之后分发erlang otp节点的策略

我有一个标准的erlang应用程序build立在otp原则上。 我打算把我的erlang节点放在生产中,如下所述:

  1. 接收公共ip(haproxy)上的所有stream量
  2. haproxy他们到一个可用的后端erlang节点

所有这些工作都非常好,但是在基于会话的http事务的情况下,erlang节点接收到一个请求的机会之一,谁的会话相关的进程驻留在另一个erlang节点上。

我的问题与处理这种情况的最佳策略有关:

  1. 第一个选项是configurationhaproxy基于源(即IP地址)来平衡,这将始终保证从一个IP的会话的所有请求去相同的后端erlang节点
  2. 第二个select是configurationhaproxy基于一些会话相关的cookie参数(基本上给我像情况1一样)平衡)
  3. 最后,因为我的erlang节点可以很好地相互通信,所以也可以简单地configurationhaproxy以循环方式进行平衡,当一个erlang节点接收到一个请求时,其会话进程驻留在另一个erlang节点上,它可以在内部进行通信erlang节点使用rpc:call()并提供请求。

1),2)是非常直接的使用和设置,但是我读和testing基于source / cookie / url_param的平衡并不能确保后端之间的平衡。

3)可以使用erlang内部的mnesia复制function来实现。 与3)我可能会结束一个情况下,一个erlang节点内部通信到另一个erlang节点,然后才最终响应请求。

我想知道什么是可取的,为什么? 将长期考虑我的otp应用程序处理大量的实时数据(xmpp协议)将是一个更好的select。

我认为这在很大程度上取决于你的一个节点可以处理多less会话。 至less在HTTP方面,IP和cookie hashing在保持与大量短暂会话的平衡方面做得相当不错。

例如,一个IP后面可能有很多客户(基于cookie的散列应该有助于这一点)。 如果单个节点只能处理相对less量的同时会话,则节点可能会超载。 而且,如果会话长期存在,散列的不平衡可能会显着。 另一方面,如果会话的数量很大且短暂,则具有更多连接的一个节点的相对重要性可能并不重要。

从理论上讲,我也希望通过某种forms的源代码或基于cookie的平衡,您将获得更好的caching命中率。 还有一件事情要考虑的是,如果你有3个节点,那么如果一个节点下来,其他每个节点上的负载都会有16%的负担,即使有完美的负载平衡。 所以你也应该考虑configuration。

如果你可以在单个节点上处理很多请求,那么对我来说,第三个选项就好像你正在解决一个你没有的问题,而当一个更简单的选项是可行的时候,这个问题是不可能的。