erlang distributed-computing

Erlang-Los nodos no reconocen



distributed-computing (2)

Estoy tratando de usar la distribución de programación en Erlang.

Pero tuve un problema, no puedo comunicar dos nodos de Erlang para comunicarme.

Traté de poner el mismo átomo en las "cookies mágicas", pero no funcionó.

Traté de usar el comando net: ping (nodo), pero la respuesta fue punk (no recondigó a otro nodo), o nodos usados ​​(), para ver si mi primer nodo veía el segundo nodo, pero no funcionó nuevamente.

El primer y segundo nodo es CentOS en VMWare, utilizando la conexión de puente en el adaptador de red.

Ingresé ping de comando fuera de Erlang entre máquinas virtuales y reconigieron cada una.

Comienzo el primer nodo, pero el segundo nodo abre el proceso, pero no puedo encontrar el nodo 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>

¡Gracias!


Debe asegurarse de tener un nombre de nodo para sus nodos, o no estarán disponibles para conectarse. P.ej:

erl -sname somenode@node1

Si está utilizando hosts separados, entonces necesita asegurarse de que los nombres de los nodos se puedan resolver de alguna manera con las direcciones IP. Una forma fácil de hacer esto es usar / etc / hosts.

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

Para obtener más respuestas útiles, debe publicar lo que ve en su terminal cuando intente esto.

EDITAR

Parece que su shell está seleccionando automáticamente "localhost" como nombre de nodo. No puede enviar mensajes a otro host con la dirección "localhost". Al especificar el nombre en el shell, intente utilizar la sintaxis @ para especificar también el nombre del nodo:

# On host 1: erl -sname ping@host1 # On host 2 erl -sname pong@host2

Luego edite el archivo de host para que host1 y host2 se resuelvan a la IP correcta.


Una pregunta similar aquí .

La distribución es proporcionada por un daemon llamado Erlang Port Mapper Daemon . De forma predeterminada, escucha en el puerto 4369, por lo que debe asegurarse de que ese puerto se abra entre los nodos. Además, cada máquina virtual de Erlang iniciada abre un puerto adicional para comunicarse con otras máquinas virtuales. Puedes ver esos puertos con epmd -names :

g@someserv1:~ % epmd -names epmd: up and running on port 4369 with data: name hbd at port 22200

Puede verificar si el puerto se abre haciendo telnet , por ejemplo:

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

Puede cambiar el puerto al puerto que desea verificar, por ejemplo, 4369, y también la IP a la IP deseada. Hacer ping no es suficiente porque usa su propio protocolo ICMP, que es diferente de TCP utilizado por la distribución de Erlang para comunicarse, por ejemplo, se puede permitir ICMP pero TCP puede estar bloqueado.

Editar:

Siga esta guía distribuida de Erlang para iniciar una máquina virtual de Erlang en modo distribuido. Luego puede usar net_adm:ping/1 para conectarse desde otro nodo, por ejemplo:

([email protected])17> net_adm:ping(''[email protected]''). pong

Solo entonces epmd -names mostrará la máquina virtual de Erlang iniciada en la lista.

Edit2:

Supongamos que hay tres hosts, A y B. Cada uno ejecuta una máquina virtual de Erlang. epmd -names ejecutados en cada host muestra, por ejemplo:

Anfitrión A:

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

Anfitrión B:

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

Debes poder hacer:

En el host A:

telnet HostB 4369 telent HostB 22300

En el host B:

telnet HostA 4369 telnet HostA 22200

donde HostA y HostB son las direcciones IP de dichos hosts (.eg HostA es IP del Host A, HostB es IP del Host B).

Si el telnet funciona correctamente, entonces debería poder hacer net_adm:ping/1 de un host a otro, por ejemplo, en el Host A, haría ping al nombre del Host B. El nombre es lo que el node(). comando node(). devoluciones.