【问题标题】:How to connect two Erlang nodes running on different host machines in the network?如何连接在网络中不同主机上运行的两个 Erlang 节点?
【发布时间】:2018-09-24 10:29:44
【问题描述】:

我有两台 Linux 机器使用 LAN 电缆连接。每台机器都可以 ping 另一台机器。 机器 A 在其以太网 eth0 上有 IP:192.168.137.1。 机器 B 在其以太网 eth0 上有 IP:192.168.137.2。

在机器 A 的终端上:

ping 192.168.137.2

返回回复,B 上的 Wireshark 能够捕获传入的 ping。

在机器 B 的终端上:

ping 192.168.137.1

返回回复,A 上的 Wireshark 能够捕获传入的 ping。

因此,我们在 A 和 B 之间建立了完全连接。

现在,我怎样才能让两个 Erlang shell,一个在 A 上运行,另一个在 B 上运行,能够相互 ping/通话?如果有人可以通过提供详细的步骤来帮助我实现这一目标,那就太好了。我一直在搜索论坛和浏览文档,但到目前为止,我还没有让它工作。我能找到的所有工作都是在同一主机上的两个节点之间进行通信。

【问题讨论】:

    标签: erlang ping erlang-shell


    【解决方案1】:

    一个正在运行的 Erlang VM 实例被称为一个节点。如果你启动一个 Erlang shell,你最终会得到一个禁用分发的节点。您可以通过调用is_alive/0 函数来检查这一点。

    $ erl
    Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:10] [hipe] [kernel-poll:false]
    
    Eshell V9.3  (abort with ^G)
    1> is_alive().
    false
    

    所有节点都有一个名称——即使是那些没有启用分发的节点:

    2> node().
    nonode@nohost
    

    ...由于分发被禁用,集群中没有节点(目前):

    3> nodes().
    []
    4> q().
    ok
    

    启用分发后,有两种通信方式:我们可以在 shell 中调用各种函数,让 Erlang VM 在启动时自动处理等等。

    $ erl -sname earth
    Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:10] [hipe] [kernel-poll:false]
    
    Eshell V9.3  (abort with ^G)
    (earth@uplink)1> is_alive().
    true
    (earth@uplink)2> node().
    earth@uplink
    (earth@uplink)3> nodes().
    []
    

    注意: uplink 是我机器的名称。全节点 名称始终为 name@host。您还可以看到提示与第一次/示例时的提示略有不同。

    ...但仍然没有人连接!在另一台机器上启动另一个节点,这次将其命名为 pluto

    $ erl -sname pluto
    Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:10] [hipe] [kernel-poll:false]
    
    Eshell V9.3  (abort with ^G)
    (pluto@uplink)1> is_alive().
    true
    (pluto@uplink)2> node().    
    pluto@uplink
    (pluto@uplink)3> nodes().
    []
    (pluto@uplink)4> net_adm:ping(earth@uplink).
    pong
    (pluto@uplink)5> nodes().
    [earth@uplink]
    

    你的 Erlang 集群现在已经启动并运行了。还有其他一些方法可以做到这一点。我建议你阅读Learn You Some Erlang for Great Good!...非常好的一本。

    重要提示:如果您在两台机器上没有相同的“cookie”,您可能很难尝试与节点通信。相反,您可以同时启动节点并设置 cookie:$ erl -sname your_node_name -setcookie 'acookietorulethemall'

    【讨论】:

    • 您好,感谢您的指导。但是这种方法适用于同一物理主机上的两个 Erlang VM 节点。如何让它在机器 A 上的 'earth@uplink' 和 'pluto@machineB' 之间进行通信?上行链路和机器 B 使用 LAN 电缆连接,并且能够从各自的系统终端相互 ping 通。
    • @aeon,你能告诉你这样做时遇到了什么错误吗?
    • Erlang 和@x80480 都假设了您的网络配置的某些事情,似乎没有意识到在大多数现代系统上这些假设并不成立。我所说的是在大多数系统上,UNIX 主机名和以任何方式解析为 IP 地址的名称之间缺乏对应关系。大多数人不运行自己的 DNS 服务器(除了 Systemd 提供的损坏的 DNS 服务器),使用 /etc/hosts 在没有名称服务器的情况下进行名称解析的艺术大多被遗忘了。更糟糕的是,你会从 Erlang 得到的唯一错误是 pang.
    • 即使使用相同的 cookie 也无法正常工作:** Connection attempt from disallowed node 'wsl@m004-temp-02' ** - 他们有连接并且被 ping 的节点发出此警告。
    【解决方案2】:

    我认为Throw Away Account's comment 一针见血:这主要是一个网络问题,并且这个问题有很多重复项(在 Stackoverflow 和其他网站上)似乎证明了这一点(因为他们中的大多数没有答案):

    根据这些链接,似乎只有在网络设置很简单(机器在同一个子网中,并且它们运行同一个网络堆栈)时,事情才可以开箱即用。否则我会假设需要正确设置 DNS,需要使用 SSH 隧道等,但还不确定如何设置。


    将此作为社区 wiki 发布,因为 (1) 这不是真正的答案,并且 (2) 希望有更多知识的人能提供一些指示。 (或者只是给出一个独立的答案,无论如何。)

    【讨论】:

      【解决方案3】:

      我遇到了和你一样的情况,因为我需要在网络中的不同主机上部署 Erlang,所以在这里分享一下我是如何着手修复它的。

      我有 02 台虚拟机:

      • 第一个虚拟机:

        ip:10.57.63.165

      • 第二个虚拟机:

        ip:10.57.63.163

      如下所示,它们可以相互 ping 通:

      我们已经知道,02 Erlang Node 需要共享同一个 Erlang Cookie。

      对于这个解决方案,我将跳过 .erlang.cookie 文件;我将手动设置 erlang cookie,只是出于临时目的(-setcookie):

      如你所见:

      我们有一个庞。

      • client@sgsn (10.57.63.165) 正在尝试连接到 serverur@ggsn (10.57.63.163)。

      连接不被允许,因为我弄错了我的erlang cookie(应该是一样的)。

      让我们再试一次(使用正确的 cookie 值):

      万岁,我们有一个乒乓球

      02 Erlang 集群上线了。

      您可以看到,当我运行nodes() 时,它在server@ggsn 节点上返回client@sgsn,反之亦然。

      诀窍是什么:

      不幸的是,我们不能只用 Erlang 做所有事情。

      我需要编辑 /etc/hosts 文件如下:

      (我假设如果我们在拓扑中使用 DNS,则根本不需要编辑 /etc/hosts)。

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-18
        • 1970-01-01
        • 1970-01-01
        • 2018-09-25
        • 1970-01-01
        相关资源
        最近更新 更多