Erlang - 节点无法识别

Erlang - Nodes don't recognize

我正在尝试在 Erlang 中使用分布式编程。

但是我遇到了一个问题,我无法让两个Erlang的节点进行通信。

我试图将相同的原子放入 "Magical cookies",但没有成功。

我尝试使用命令 net:ping(node),但响应是 pang(没有重新识别另一个节点),或者使用 nodes() 来查看我的第一个节点是否看到第二个节点,但是又没用了。

第一和第二个节点是VMWare中的CentOS,在网卡中使用网桥连接。

我在 Erlang 外部的 VM 之间输入了命令 ping,他们重新识别了每一个。

我启动了第一个节点,但是第二个节点打开进程,却找不到节点pong。

(pong@localhost)8> tut17:start_pong().
true


(ping@localhost)5> c(tut17).
{ok,tut17}
(ping@localhost)6> tut17:start_ping(pong@localhost).
<0.55.0>

谢谢!

A similar question here.

分发由名为 Erlang Port Mapper Daemon 的守护程序提供。默认情况下,它侦听端口 4369,因此您需要确保该端口在节点之间打开。此外,每个启动的 Erlang VM 都会打开一个额外的端口来与其他 VM 进行通信。您可以使用 epmd -names:

查看这些端口
g@someserv1:~ % epmd -names
epmd: up and running on port 4369 with data:
name hbd at port 22200

您可以通过telnet检查端口是否打开,例如:

g@someserv1:~ % telnet 127.0.0.1 22200
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
^]
Connection closed by foreign host.

您可以将端口更改为您要检查的端口,例如4369,以及所需 IP 的 IP。做 ping 是不够的,因为它使用自己的 ICMP protocol,这与 Erlang 发行版用于通信的 TCP 不同,例如ICMP 可能被允许,但 TCP 可能被阻止。

编辑:

请按照本指南 Distributed Erlang 以分布式模式启动 Erlang VM。然后你可以使用 net_adm:ping/1 从另一个节点连接到它,例如:

(hbd@someserv1.somehost.com)17> net_adm:ping('hbd@someserv2.somehost.com').
pong

只有这样 epmd -names 才会在列表中显示已启动的 Erlang VM。

编辑2:

假设有主机 A 和 B。每个主机 运行 一个 Erlang VM。 epmd -names 运行 在每个主机上显示例如:

主持人A:

epmd: up and running on port 4369 with data:
name servA at port 22200

主持人B:

epmd: up and running on port 4369 with data:
name servB at port 22300

您需要能够做到:

在主机 A 上:

telnet HostB 4369
telent HostB 22300

在主机 B 上:

telnet HostA 4369
telnet HostA 22200

其中 HostA 和 HostB 是那些主机的 IP 地址(例如,HostA 是主机 A 的 IP,HostB 是主机 B 的 IP)。

如果 telnet 工作正常,那么您应该可以 net_adm:ping/1 从一台主机到另一台主机,例如在主机 A 上,您将 ping 主机 B 的名称。名称是命令 node(). returns.

您需要确保您的节点有一个节点名称,否则它们将无法连接。例如:

erl -sname somenode@node1

如果您使用单独的主机,那么您需要确保节点名称可以以某种方式解析为 IP 地址。一个简单的方法是使用 /etc/hosts.

# Append a similar line to the /etc/hosts file
10.10.10.10 node1

要获得更多有用的答案,您应该 post 尝试此操作时在终端中看到的内容。


编辑

看起来您的 shell 正在自动选择 "localhost" 作为节点名称。您不能将消息发送到地址为 "localhost" 的另一台主机。在 shell 上指定名称时,也尝试使用 @ 语法来指定节点名称:

# On host 1:
erl -sname ping@host1

# On host 2
erl -sname pong@host2

然后编辑主机文件,使 host1 和 host2 解析为正确的 IP。