【问题标题】:Auto connect to erlang cluster自动连接到 erlang 集群
【发布时间】:2019-04-07 21:43:04
【问题描述】:

我有一个需要以分布式方式运行的 erlang 应用程序。

现在要形成一个集群,erlang 节点需要共享相同的 cookie 值,并且可以采用以下任一方法进行连接 -

net_adm:ping/1

net_kernel:connect_node/1

但是这样做我需要维护节点列表并以自定义方式处理故障转移。即使在故障转移的情况下,如何知道要连接到哪个节点,因为在此之前起始节点列表可能已经更改。

那么任何人都可以建议如何以最小的努力形成一个 erlang 集群,并且未来的节点可以自动加入集群而无需提供实际的 nodeList。

【问题讨论】:

    标签: erlang cluster-computing distributed


    【解决方案1】:

    对此没有多少 100% 万无一失的解决方案。我们中的许多人时不时地实施了我们自己的解决方案。我一生中至少这样做了 3 次。

    其中 2 个,我使用了一个外部数据库(Redis 一次,MySQL 一次)在其中注册和取消注册当前活动节点。

    另一个机会,我使用了net_adm:world().erlang.hosts。看看the docs

    我还知道一些项目致力于推广此类工具:我认为 Erlang Solutions 正在使用其中一个,我不确定是 LASP 还是 Partisan 或 Chris Meiklejohn 的其他工具。你应该检查一下。

    【讨论】:

    • 感谢您的回答。正如您在自定义解决方案中提到的,您在 Redis/Mysql 中维护了节点列表并注册/注销活节点。成功注册后,您是否使用 net_kernel:connect_node/1/net_adm:ping/1 连接当前节点,每个节点遍历所有已注册的活动节点或采取任何不同的方法。您是否也对取消注册进行了清理?您是否使用 net_kernel:monitor_nodes/1 来捕获节点状态更改。实际上,在退订时,我需要更新 Mnesia 表。
    • 注册成功后,我只在一个节点上使用了net_adm:ping……这就是连接所有节点所需的全部内容。
    • 没有清除注销,但是...所有节点都使用net_kernel:monitor_nodes(true, [nodedown_reason]) 来检测其他节点何时断开连接,以便可以将它们从数据库中的节点列表中删除。
    • 谢谢。明白了,您说在注销时您只是从列表中删除了该节点,但在注销时,订阅了 et_kernel:monitor_nodes(true, [nodedown_reason]) 的所有节点都会收到该事件,并将尝试从 nodeList 中删除该节点。那么你是如何同步的呢?另外,您能否告诉我您是如何确保高可用性并处理集群的故障转移的。因为如果任何节点出现故障,我将需要弥补并加入集群。
    • 是的,所有节点都收到消息,并且都尝试将其从表中删除。一个成功了,其他的只是发出一些无用的删除。没什么大不了的。
    猜你喜欢
    • 1970-01-01
    • 2012-10-24
    • 2021-11-23
    • 2016-07-09
    • 1970-01-01
    • 2015-03-05
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多