A similar question here。
的分布是由一种叫做Erlang Port Mapper Daemon守护程序提供。默认情况下,它侦听端口4369,因此您需要确保该端口在节点之间打开。另外,每个启动的Erlang虚拟机都会打开一个额外的端口与其他虚拟机进行通信。你可以看到这些端口与epmd -names
:
[email protected]:~ % epmd -names
epmd: up and running on port 4369 with data:
name hbd at port 22200
您可以检查该端口是否被做telnet
它打开,如:
[email protected]:~ % 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
从另一个节点连接到它,例如:
([email protected])17> net_adm:ping('[email protected]').
pong
只有这样epmd -names
会显示启动二郎VM名单上。
EDIT2:
假设有寿主机A和B每一个运行一个虚拟机二郎。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地址(主机A .e.g是主机A的IP,主机B是主机B的IP)。
如果telnet工作正常,那么你应该可以从一台主机到另一台主机执行net_adm:ping/1
,例如,在主机A上,您可以ping主机B的名称。名称是命令node().
返回的内容。
你将需要提供一些代码和上下文来帮助你做些什么。 – Suever
你检查过防火墙配置和路由器吗? – Pascal
你可以从两个节点发布'epdm -names'吗? – Amiramix