2016-03-03 2 views
0

Я пытаюсь использовать распространение программирования в Erlang.Erlang - Узлы не распознают

Но у меня была проблема, я не могу связаться с двумя узлами Erlang для связи.

Я попытался поместить тот же атом в «Волшебные куки», но это не сработало.

Я попытался использовать команду net: ping (node), но ответ был pang (не переустанавливал другой узел) или использовал узлы(), чтобы увидеть, увидит ли мой первый узел второй узел, t снова работать.

Первый и второй узлы CentOS в VMWare, используя мостовое соединение в сетевом адаптере.

Я ввел команду ping за пределами Erlang между VM, и они переустанавливают каждый.

Я запускаю первый узел, но процесс открытия второго узла, но не может найти узел понга.

([email protected])8> tut17:start_pong(). 
true 


([email protected])5> c(tut17). 
{ok,tut17} 
([email protected])6> tut17:start_ping([email protected]). 
<0.55.0> 

Спасибо!

+1

Вам понадобится предоставить некоторый код и контекст для того, что вы сделали, чтобы получить некоторую помощь. – Suever

+0

Вы проверили конфигурацию брандмауэра и маршрутизатор, если таковые имеются? – Pascal

+0

можете ли вы отправить 'epdm -names' с обоих узлов? – Amiramix

ответ

1

A similar question here.

Распространение предоставляется демоном под названием Erlang Port Mapper Daemon. По умолчанию он прослушивает порт 4369, поэтому вам нужно убедиться, что этот порт открыт между узлами. Кроме того, каждый запуск Erlang VM открывает дополнительный порт для связи с другими виртуальными машинами. Вы можете увидеть эти порты с 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, который отличается тем, что TCP, используемый дистрибутивом Erlang для связи, например. ICMP может быть разрешен, но TCP может быть заблокирован.

Edit:

Пожалуйста, следуйте этому руководству Distributed Erlang начать Erlang VM в распределенном режиме. Затем вы можете использовать net_adm:ping/1 подключиться к нему с другого узла, например .:

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

Только тогда epmd -names покажет начатое Erlang VM в списке.

Edit2:

Предположим, что есть Тхо хозяева, А и В. Каждый из них выполняет один 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 

, где и Хост HostB являются IP-адреса этих хостов (.e.g Хоста является IP-хоста из A, HostB является IP-хоста из B).

Если telnet работает правильно, вы должны иметь возможность делать net_adm:ping/1 от одного узла к другому, например. на Host A вы будете пинговать имя хоста B. Имя - это то, что возвращает команда node()..

+0

Я отредактировал ответ, чтобы добавить информацию о том, как правильно запустить узел VM. 'epmd -names' не отображает виртуальную машину, если она не знает об этом, например.VM запускается и может быть подключена. Пожалуйста, ознакомьтесь с руководством, чтобы узнать, как работает дистрибуция, вкратце, Erlang VM пытается связаться с «epmd», чтобы зарегистрироваться в нем и открыть другие узлы. Затем он создает новый порт для каждой виртуальной машины, с которым он мог бы успешно подключиться через 'epmd'. – Amiramix

+0

Да, я следовал этому руководству раньше, но это не сработало. '[erlang @ localhost ~] $ epmd -names epmd: работает и работает на порту 4369 с данными:' У меня есть только один порт 4369. Я установил свой файл cookie на тот же атом, но мои узлы не соединяются. –

+0

У вас не может быть более одного порта 4369. 'epmd' работает на 4369, и каждая вновь запущенная VM будет иметь свой собственный порт. Как вы запустили свою виртуальную машину и параметры, которые вы использовали при запуске своей виртуальной машины? Что вы получаете, когда выполняете 'node().' В оболочке Erlang? – Amiramix

1

Вам необходимо убедиться, что у вас есть имя узла для ваших узлов, или они не будут доступны для подключения. Например .:

erl -sname [email protected] 

Если вы используете отдельные хосты, то вам необходимо убедиться, что имена узлов разрешимы в IP-адреса как-то. Простым способом сделать это является использование/etc/hosts.

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

Для получения более полезных ответов вы должны опубликовать то, что видите на своем терминале при попытке этого.


EDIT

Похоже, ваша оболочка автоматически выбирать "локальный" в качестве имени узла. Вы не можете отправлять сообщения на другой хост с адресом «localhost». При указании имени на раковине, попробуйте использовать @ синтаксис, чтобы указать имя узла, а также:

# On host 1: 
erl -sname [email protected] 

# On host 2 
erl -sname [email protected] 

Затем отредактируйте файл хоста, так host1 и host2 рассосется к правому IP.

+0

Я отредактировал мой вопрос, что я пытаюсь использовать ping pong tutorial от Erstang quickstart. Узел понга запускается успешно, но узел ping не может связываться с узлом Pong. –

Смежные вопросы