2

我在我的 3 台服务器上运行 Elixir 应用程序。我最近需要连接节点,以便我可以在它们之间同步一些东西,为此我为每个节点设置了短名称。

我正在使用 Edeliver/Distillery 生成发布和部署。我复制var/vm.args到每个节点上的发布目录并更改-name blah@ip-sname name@nodename. 节点可以毫无问题地看到并相互连接。

在为每个节点命名之前,当我需要调试我的应用程序时,我使用 ssh 远程连接到我的节点。我使用了这种方法:

  • ssh node -L 4369:127.0.0.1:4369
  • 在我的本地机器上运行epmd -names以找出我的应用程序的端口
  • 杀死最后一个 ssh 并运行ssh node -L 4369:127.0.0.1:4369 -L port:127.0.0.1:port以访问我机器上正在运行的节点
  • iex --hidden --erl '-name debug -setcookie cookie_like_server'在我的机器上运行
  • 现在我可以访问远程节点,例如我可以observer用来查看我的远程节点

现在同样的程序行不通了。

首先,我看到一个错误,说使用短名称和长名称的节点显然无法相互连接。

我将iex命令更改iex --hidden --erl '-sname debug -setcookie cookie_like_server'为使用短名称。当我尝试连接到远程节点时,这种方式连接超时observer

我真的不明白这个问题。难道我做错了什么?这里有另一种访问使用短名称的正在运行的节点的方法吗?

顺便说一句,我使用 ssh 来加密我的流量。请告诉我是否有使我的连接不加密的解决方案,尽管我可能不会使用它,或者以某种方式通过 ssh 将其隧道化。

更新

我尝试了@christophe-de-troyer 建议的方法。TLDR,没有用。

vahid@arch-adtube ~/ % iex --sname debug --cookie 'cookie' --remsh backend-platform@prod-1
Erlang/OTP 20 [erts-9.0.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]

Could not contact remote node backend-platform@prod-1, reason: :nodedown. Aborting...

ssh prod-1 -L 4369:127.0.0.1:4369正在运行,并正确epmd -names报告backend-platform为正在运行的节点。

4

1 回答 1

1

根据我的经验,如果要连接到远程节点,则必须传递全名 ( --name) 而不是短名称 ( --sname)。

所以在节点 A 上,使用 ip 192.168.1.10,你运行:

iex --name bob@192.168.1.10 --cookie secret

在节点 B 上,使用 ip 192.168.1.11,运行:

iex --name alice@192.168.1.11 --cookie secret

然后在您的计算机上,使用 ip 192.168.1.12,您可以使用附加到这些远程 shell。首先,您必须确保本地 EPMD 端口 (4369) 绑定到远程服务器的 EPMD 端口,方法是通过 SSH 建立隧道。

ssh a -L 4369:127.0.0.1:4369

然后,您可以使用远程 shell 连接到这些节点:

iex --name carol@192.168.1.12 --cookie secret --remsh alice@192.168.1.11

我在我的机器上做了一些实验,我发现它只适用于 IP 地址。如果远程计算机上的名称未使用其 IP 地址或域名进行限定,则我的计算机在 运行machine.example.com,主机名无法连接。machine我必须将其与连接客户端上的 DNS 名称或 IP 地址相匹配。

Erlang 的邮件列表上有一些关于此的有趣流量[1]。

[1] http://erlang.org/pipermail/erlang-questions/2006-December/024270.html

编辑

我做了一些进一步的实验,并成功地用短名称连接到远程节点。

正如您已经提到的,您确实需要两个节点以相同的命名模式运行(即,都是短的,或者都是完全限定的)。

在 nodeA上,使用 ip12.12.12.12和 FQDN a.example.com,我生成了一个 shell,如下所示:

iex --sname bob --cookie secret

在我的本地机器上L,使用 ip5.5.5.5和 FQDN l.notanexample.com,我生成了一个这样的 shell:

ssh a -L 4369:127.0.0.1:4369

iex --sname alice --cookie secret --remsh bob@a

这个工作的原因是因为在我的本地机器上,在/etc/hosts文件中,我没有将主机名(短主机名)绑定到远程 IP 的行。

所以在/etc/hosts我的本地机器上,我现在有以下行:

12.12.12.12 a.

于 2018-08-10T12:13:32.400 回答