如何连接在网络中不同主机上运行的两个Erlang节点?

时间:2018-04-14 03:21:33

标签: erlang ping erlang-shell

我有两台使用LAN电缆连接的Linux机器。每台机器都可以ping另一台机器。 机器A在其以太网eth0上具有IP:192.168.137.1。 机器B在其以太网eth0上具有IP:192.168.137.2。

在机器A的终端上:

ping 192.168.137.2

返回回复,B上的Wireshark能够捕获传入的ping。

在机器B的终端上:

ping 192.168.137.1

返回回复,A上的Wireshark能够捕获传入的ping。

因此,我们在A和B之间有完全连接。

现在,我怎么能有两个Erlang shell,一个在A上运行而另一个在B上运行,能够互相ping /通话?如果有人可以通过提供详细的步骤来帮助我实现这一点,那就太好了。我一直在搜索论坛和浏览文档,但到目前为止,我还没有工作。我能找到的所有工作都是在同一台主机上的两个节点之间进行通信。

3 个答案:

答案 0 :(得分:1)

正在运行的Erlang VM实例称为节点。如果启动Erlang shell,您将最终得到一个已禁用分发的节点。您可以通过调用title_txt <- "H:/Desktop/IST719/titles.txt" titlefile <- scan(title_txt, character(0), sep = "\n") head(titlefile) title.vec <- VectorSource(titlefile) title.corpus <- Corpus(title.vec) title.corpus title.corpus <- tm_map(title.corpus, content_transformer(tolower)) title.corpus <- tm_map(title.corpus, removePunctuation) title.corpus <- tm_map(title.corpus, removeNumbers) title.corpus <- tm_map(title.corpus, removeWords, stopwords("english")) tdm <- TermDocumentMatrix(title.corpus) tdm m <- as.matrix(tdm) 函数来检查这一点。

is_alive/0

所有节点都有一个名称 - 即使是那些没有启用分发的节点:

$ erl
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V9.3  (abort with ^G)
1> is_alive().
false

...并且由于分发已禁用,因此群集中没有节点(暂时):

2> node().
nonode@nohost

启用分发后,有几种通信方式:我们可以调用shell中的各种函数,让Erlang VM 在启动时自动处理它等。

3> nodes().
[]
4> q().
ok
  

注意: $ erl -sname earth Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:10] [hipe] [kernel-poll:false] Eshell V9.3 (abort with ^G) (earth@uplink)1> is_alive(). true (earth@uplink)2> node(). earth@uplink (earth@uplink)3> nodes(). [] 是我的计算机的名称。完整节点   名称始终为uplink。您还可以看到提示与第一次/示例时的提示略有不同。

......但是,没有人连接!在另一台计算机上启动另一个节点,并将其命名为name@host

pluto

您现在已启动并运行Erlang群集。还有其他一些方法可以做到这一点。我建议你阅读Learn You Some Erlang for Great Good! ...非常好的。

  

重要提示:如果您没有相同的&#34; Cookie&#34;在两台机器中,您可能会很难尝试通信节点。相反,您可以启动节点并同时设置cookie:$ erl -sname pluto Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:10] [hipe] [kernel-poll:false] Eshell V9.3 (abort with ^G) (pluto@uplink)1> is_alive(). true (pluto@uplink)2> node(). pluto@uplink (pluto@uplink)3> nodes(). [] (pluto@uplink)4> net_adm:ping(earth@uplink). pong (pluto@uplink)5> nodes(). [earth@uplink]

答案 1 :(得分:1)

我正面临着与您相同的情况,因为我需要在网络中的其他主机上部署Erlang,所以让我在这里分享我如何进行修复。

我有02个虚拟机:

  • 第一个虚拟机:

    ip:10.57.63.165

  • 第二个虚拟机:

    ip:10.57.63.163

正如您在下面看到的,他们可以彼此ping通:

enter image description here

我们已经知道,02 Erlang Node需要共享相同的Erlang Cookie。

对于此解决方案,我将跳过 .erlang.cookie 文件;我将为临时目的手动设置erlang cookie( -setcookie ):

enter image description here

如您所见:

我们碰到了庞。

  • client @ sgsn(10.57.63.165)试图连接到serveur @ ggsn(10.57.63.163)。

不允许连接,因为我弄错了我的erlang cookie(应该是相同的)。

让我们重试(具有 正确的cookie值 ):

enter image description here

万岁,我们得到了 Pong

02个Erlang群集已启动。

您会看到,当我运行nodes()时,它将在serveur @ ggsn节点上返回client @ sgsn,反之亦然。

诀窍是什么:

不幸的是,我们不能仅使用Erlang来做所有事情。

我需要 编辑/ etc / hosts 文件,如下所示:

(我假设如果我们在拓扑中使用DNS,则根本不需要编辑/ etc / hosts。)

enter image description here

希望有帮助。

答案 2 :(得分:0)

我认为Throw Away Account's comment令人耳目一新:这主要是一个网络问题,并且这个问题(在Stackoverflow和其他站点上)有很多重复之处,似乎证明了这一点(大多数情况下其中没有答案):

基于这些链接,似乎只有在网络设置微不足道时(机器位于同一子网中,并且它们运行相同的网络堆栈),事情才似乎开箱即用。否则,我会认为需要正确设置DNS,需要使用SSH隧道等,但不确定如何。


将其发布为社区Wiki,是因为(1)并不是真正的答案,并且(2)希望有更多知识的人会提供一些指导。 (或者提供一个独立的答案,随便什么。)