6

我正在查看从/池模块,它似乎与我想要的相似,但我的应用程序中似乎也存在单点故障(如果主节点出现故障)。

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

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

我该怎么做?

4

3 回答 3

6

我不知道是否已经实现了这个模块,但我可以说,负载平衡被高估了。我可以争辩的是,最好选择随机放置工作,除非您知道更多信息将来会如何负载,并且在大多数情况下您真的不知道。你写的:

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

你怎么知道所有那些负载最少的节点在接下来的毫秒内不会是最高负载的?你怎么知道所有那些你不会包含在列表中的高负载节点不会在接下来的毫秒内降低负载?除非您有非常罕见的情况,否则您真的无法知道。

只需测量(或计算)您的节点的性能并设置节点的概率被选择取决于它。无论当前负载如何,随机选择节点。将此作为初始方法。当你设置好之后,你就可以尝试编造一些更复杂的算法。我敢打赌,要击败这种最初的方法将是一项非常艰巨的工作。相信我,非常难。

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

于 2009-03-20T09:36:10.793 回答
1

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

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

于 2009-03-30T22:54:44.240 回答
0

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

于 2009-04-01T03:25:17.810 回答