我正在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 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
报告为正在运行的节点。
答案 0 :(得分:0)
根据我的经验,如果要连接到远程节点,则必须传递全名(--name
)而不是简称(--sname
)。
因此,在IP为192.168.1.10的节点A上,运行:
iex --name bob@192.168.1.10 --cookie secret
在IP为192.168.1.11的节点B上,运行:
iex --name alice@192.168.1.11 --cookie secret
然后在您的计算机上,使用ip 192.168.1.12,可以使用附加到这些远程Shell。首先,必须通过SSH隧道将其本地EPMD端口(4369)绑定到远程服务器的EPMD端口。
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
我做了一些进一步的实验,并成功连接了带有短名称的远程节点。
正如您已经提到的,您确实需要两个节点以相同的命名模式运行(即,两个都短,或者都完全合格)。
在节点A
上,使用ip 12.12.12.12
和FQDN a.example.com
,我生成了一个这样的shell:
iex --sname bob --cookie secret
在我的本地计算机L
上,使用ip 5.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
。