gpt4 book ai didi

erlang - 在 Erlang 集群中的所有节点上运行 gen_server 的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-04 02:17:48 26 4
gpt4 key购买 nike

我正在构建一个 monitoring tool in Erlang .在集群上运行时,它应该在所有节点上运行一组数据收集功能,并使用 RRD 在单个“记录器”节点上记录该数据。

当前版本有一个在主节点(rolf_node_sup)上运行的监督者,它试图在集群中的每个节点(rolf_service_sup)上运行第二个监督者。然后,每个节点上的监督者应该启动并监视一堆进程,这些进程将消息发送回主节点上的 gen_server (rolf_recorder)。

这仅在本地有效。没有在任何远程节点上启动主管。我使用 following code尝试从记录器节点加载节点上的主管:

rpc:call(Node, supervisor, start_child, [{global, rolf_node_sup}, [Services]])

我发现有几个人建议主管真的只为本地流程设计。例如。
  • Starting processes at remote nodes
  • how: distributed supervision tree

  • 实现我要求在集群中的所有节点上运行监督代码的最 OTP 方式是什么?
  • 建议将分布式应用程序作为分布式主管树的一种替代方案。这些不适合我的用例。它们提供节点之间的故障转移,但保持代码在一组节点上运行。
  • pool模块很有趣。但是,它允许在当前负载最少的节点上运行作业,而不是在所有节点上运行。
  • 或者,我可以在使用 proc_lib:spawn_link 的主服务器上创建一组受监督的“代理”进程(每个节点一个)。在每个节点上启动一个主管。如果节点上出现问题,代理进程应该死掉,然后由它的主管重新启动,这反过来又应该重新启动远程进程。 slave模块在这里可能非常有用。
  • 或者,也许我过于复杂了。直接监督节点是一个坏主意,相反,也许我应该构建应用程序以更松散耦合的方式收集数据。通过在多个节点上运行应用程序来构建一个集群,告诉一个成为主节点,就这样吧!

  • 一些要求:
  • 该架构应该能够处理节点加入和离开池而无需人工干预。
  • 为了简单起见,我想构建一个单主解决方案,至少最初是这样。
  • 在我的实现中,我更愿意使用现有的 OTP 工具而不是手动代码。
  • 最佳答案

    有趣的挑战,有多种解决方案。以下只是我的建议,希望能让你更好地选择如何编写程序。

    据我了解您的程序,您希望拥有一个启动应用程序的主节点。这将在集群中的节点上启动 Erlang VM。 pool模块使用 slave模块来执行此操作,这需要双向基于 key 的 ssh 通信。它还要求您有适当的 dns 工作。
    slave 的一个缺点就是主人死了,奴隶也死了。这是设计使然,因为它可能非常适合原始用例,但是在您的情况下它可能很愚蠢(例如,即使主服务器关闭,您可能仍想收集数据)

    对于 OTP 应用程序,每个节点都可以运行相同的应用程序。在您的代码中,您可以使用配置或发现来确定集群中的节点角色。

    我建议使用一些操作系统工具或 daemontools 或类似工具来启动 Erlang VM。每个虚拟机都将启动相同的应用程序,其中一个将作为主机启动,其余的作为从机启动。这样做的缺点是更难在集群中出现的机器上“自动”运行软件,就像你可以用 slave 做的那样。 ,但是它也更加健壮。

    在每个应用程序中,您都可以根据节点的角色拥有合适的监督树。移除节点间监督和产卵使系统更加简单。

    我还建议将所有节点推送到主节点。这样master就不需要关心slave发生了什么,它甚至可以忽略节点宕机的事实。这也允许添加新节点而无需对主节点进行任何更改。 cookie 可用作身份验证。多个母版或“录音机”也相对容易。

    然而,“从”节点需要注意主节点的下降和上升并采取适当的措施,例如存储监控数据,以便稍后在主节点备份时发送。

    关于erlang - 在 Erlang 集群中的所有节点上运行 gen_server 的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5531966/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com