如何连接运行在网络中不同主机上的两个 Erlang 节点?

aeo*_*eon 5 erlang ping erlang-shell

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

在机器 A 的终端上:

ping 192.168.137.2
Run Code Online (Sandbox Code Playgroud)

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

在机器 B 的终端上:

ping 192.168.137.1
Run Code Online (Sandbox Code Playgroud)

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

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

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

x80*_*486 5

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

\n\n
$ erl\nErlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:10] [hipe] [kernel-poll:false]\n\nEshell V9.3  (abort with ^G)\n1> is_alive().\nfalse\n
Run Code Online (Sandbox Code Playgroud)\n\n

所有节点都有一个名称 \xe2\x80\x93,即使那些没有启用分发的节点也是如此:

\n\n
2> node().\nnonode@nohost\n
Run Code Online (Sandbox Code Playgroud)\n\n

...并且由于禁用了分发,因此集群中没有节点(目前):

\n\n
3> nodes().\n[]\n4> q().\nok\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
$ erl -sname earth\nErlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:10] [hipe] [kernel-poll:false]\n\nEshell V9.3  (abort with ^G)\n(earth@uplink)1> is_alive().\ntrue\n(earth@uplink)2> node().\nearth@uplink\n(earth@uplink)3> nodes().\n[]\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

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

\n
\n\n

...但是仍然没有人连接!在另一台机器上启动另一个节点并命名它pluto。

\n\n
$ erl -sname pluto\nErlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:10] [hipe] [kernel-poll:false]\n\nEshell V9.3  (abort with ^G)\n(pluto@uplink)1> is_alive().\ntrue\n(pluto@uplink)2> node().    \npluto@uplink\n(pluto@uplink)3> nodes().\n[]\n(pluto@uplink)4> net_adm:ping(earth@uplink).\npong\n(pluto@uplink)5> nodes().\n[earth@uplink]\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
\n

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

\n
\n