Erlang - 节点不承认

时间:2016-03-03 03:54:58

标签: erlang distributed-computing

我试图在Erlang中使用分发编程。

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

我试图将相同的原子放在" Magical cookies"中,但它没有用。

我尝试使用命令net:ping(节点),但响应是pang(没有重新启动另一个节点),或者使用nodes(),看看我的第一个节点是否看到了第二个节点,但它没有&再次工作。

第一个和第二个节点是VMWare中的CentOS,使用网络适配器中的桥接连接。

我在VM之间在Erlang之外输入命令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>

谢谢!

2 个答案:

答案 0 :(得分:1)

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。

<强> EDIT2:

假设有主机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().返回的内容。

答案 1 :(得分:1)

您需要确保节点具有节点名称,否则它们无法连接。 E.g:

erl -sname somenode@node1

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

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

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

修改

看起来你的shell是自动选择&#34; localhost&#34;作为节点名称。您无法使用地址&#34; localhost&#34;将消息发送到另一台主机。在shell上指定名称时,请尝试使用@语法指定节点名称:

# On host 1:
erl -sname ping@host1

# On host 2
erl -sname pong@host2

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