使用Erlang,我应该如何在群集中分配负载?

时间:2009-03-19 13:08:33

标签: erlang load-balancing

我正在看奴隶/池模块,它看起来和我的相似 想要,但似乎我的一点失败 应用程序(如果主节点发生故障)。

客户端有一个网关列表(为了回退 - 一切都做到了 同样的事情)接受连接,一个选择 由客户随机。当客户端连接所有节点时 检查哪个负载最小,然后是最少的IP- 加载的服务器被转发回客户端。然后是客户 连接到这个服务器,一切都在那里执行。

总之,我希望所有节点都充当网关和实际的网关 处理客户请求。负载平衡仅在完成时才进行 客户端最初连接 - 所有实际数据包并进行处理 客户的“家”节点。

我该怎么做?

3 个答案:

答案 0 :(得分:6)

我不知道是否已实施此模块,但我可以说,负载均衡被高估了。我可以争辩说,随机放置工作是最好的选择,除非你知道更多的信息将来会有多少负载,在大多数情况下你真的不知道。你写的是什么:

  

当客户端连接时,检查所有节点以查看哪个节点负载最小,然后将负载最少的服务器的IP转发回客户端。

你怎么知道所有那些负载最小的节点在下一个ms中不会被加载到最高?你怎么知道所有那些你不会包含在列表中的高负载节点不会在下一个ms中降低负载?除非你的情况非常罕见,否则你真的无法知道。

只需测量(或计算)节点的性能,并根据它选择设置节点的概率。无论当前负载如何,随机选择节点。使用此作为初始方法。当你设置它时,你可以尝试组成一些更复杂的算法。我敢打赌,击败这种初步方法将是非常艰苦的工作。相信我,非常努力。

编辑:为了更清楚地了解一个细微的细节,我强烈主张您无法预测当前和历史负载的未来负载,但您应该使用有关任务持续时间概率和当前分解的知识。任务的一生。这项工作很难尝试实现。

答案 1 :(得分:1)

监督树的目的是管理不一定转发请求的流程。您无法使用不同的代码将请求直接发送到可用进程列表的成员。有关获取这些列表的一种方法,请参阅pool:get_nodes或pool:get_node()函数。

您可以让池模块处理进程的管理(重新启动,监视和终止处理),并使用其他一些模块将请求透明地重定向到进程池。也许您正在寻找分布式池?在不使用分布式节点的情况下,很难摆脱erlang中的主进程。整个运行系统几乎是一个大型的监督树。

答案 2 :(得分:0)

我最近记得pg模块允许您设置进程组。发送到组的消息将转到组中的每个进程。它可能会让你朝着你想要的方向发展。你必须编写代码来决定哪个进程处理真实的请求,但你会得到一个没有主人使用它的池。