运行gen的最佳方式是什么?

我正在Erlang建立一个监控工具。 在群集上运行时,它应该在所有节点上运行一组数据收集功能,并在单个“记录器”节点上使用RRD记录该数据。

当前版本在主节点( rolf_node_sup )上运行一个管理程序,该管理程序试图在集群中的每个节点上运行第二个管理程序( rolf_service_sup )。 然后,每个节点监控程序都应该启动并监控将消息发送回主节点上的gen_server( rolf_recorder )的一堆进程。

这只适用于本地。 没有管理员在任何远程节点上启动。 我使用以下代码尝试从记录器节点加载节点监督器:

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

我发现有几个人认为主管们确实只是为本地流程而设计的。 例如

  • 在远程节点上启动进程
  • 如何:分布式监督树
  • 实现我的要求以监督在集群中所有节点上运行的代码的最有效的OTP方式是什么?

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

  • 该体系结构应该能够处理加入和离开池的节点,而无需人工干预。
  • 为了简单起见,我想建立一个单主解决方案,至少在最初阶段。
  • 我希望在我的实现中使用现有的OTP工具而不是手动编码。

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

    据我了解你的程序,你想有一个主节点,你开始你的应用程序。 这将在集群中的节点上启动Erlang VM。 pool模块使用slave模块执行此操作,这需要在两个方向上进行基于密钥的ssh通信。 它还要求你有适当的DNS工作。

    slave的缺点是,如果主人死亡, slave也会死亡。 这是完全设计的,因为它可能完全适合原始用例,但在您的情况下,它可能很愚蠢(例如,即使主服务器已关闭,您仍可能仍要收集数据)

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

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

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

    我也建议让所有节点都推送给主人。 通过这种方式,主机并不需要关心从机中发生了什么,甚至可以忽略节点关闭的事实。 这也允许添加新的节点而不需要对主设备进行任何改变。 该cookie可以用作身份验证。 多个主人或“录音机”也相对容易。

    然而,“从属”节点需要注意主站正在下降并采取适当的行动,比如存储监控数据,以便在主站备份后可以发送。


    我会研究riak_core。 它提供了一个用于管理分布式应用程序的基础设施层,这些应用程序在erlang和otp本身的原始功能之上。 在riak_core下,不需要将节点指定为主节点。 没有节点是otp意义上的中心,任何节点都可以接管其他失败的节点。 这是容错的本质。 此外,riak_core提供了优雅的节点加入和离开集群的处理,而不需要诉诸主/从策略。

    虽然这种“拓扑”分散是方便的,但分布式应用通常需要逻辑上特殊的节点。 出于这个原因,riak_core节点可以通告它们提供了特定的集群服务,例如,如您的用例所示,结果收集器节点。

    另一个有趣的功能/体系结构的后果是,riak_core提供了一种机制,通过“八卦”协议维护集群成员可见的全局状态。

    基本上,riak_core包括一堆有用的代码来开发高性能,可靠和灵活的分布式系统。 你的应用程序听起来很复杂,以至于拥有一个强大的基础将会比以后付出更多的报酬。

    otoh,几乎没有文件。 :(

    这里有一个人谈论他用riak_core写的一个内部AOL应用程序:

    http://www.progski.net/blog/2011/aol_meet_riak.html

    以下是关于钢筋模板的说明:

    http://lists.basho.com/pipermail/riak-users_lists.basho.com/2011-March/003632.html

    ......这里是关于该钢筋模板的一个分支的文章:

    https://github.com/rzezeski/try-try-try/blob/7980784b2864df9208e7cd0cd30a8b7c0349f977/2011/riak-core-first-multinode/README.md

    ...在riak_core上聊天:

    http://www.infoq.com/presentations/Riak-Core

    ... riak_core公告:

    http://blog.basho.com/2010/07/30/introducing-riak-core/

    链接地址: http://www.djcxy.com/p/38241.html

    上一篇: What's the best way to run a gen

    下一篇: Using more than one erlang behaviour