12

我正在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 工具而不是手动代码。
4

2 回答 2

5

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

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

一个缺点slave是,如果主人死了,奴隶也会死。这是设计使然,因为它可能非常适合原始用例,但是在您的情况下它可能很愚蠢(例如,即使主服务器关闭,您可能仍想收集数据)

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

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

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

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

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

于 2011-04-03T21:17:33.210 回答
3

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

虽然这种“拓扑”去中心化很方便,但分布式应用程序通常确实需要逻辑上特殊的节点。出于这个原因,riak_core 节点可以宣传它们正在提供特定的集群服务,例如,如您的用例所体现的,结果收集器节点。

另一个有趣的特性/架构结果是 riak_core 提供了一种机制来通过“gossip”协议维护集群成员可见的全局状态。

基本上,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/

于 2011-04-03T22:54:47.660 回答