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。
我正在尝试在 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。