设置短名称时连接到生产节点

Posted

技术标签:

【中文标题】设置短名称时连接到生产节点【英文标题】:Connecting to production node when short name is set 【发布时间】:2019-01-15 08:39:35 【问题描述】:

我正在我的 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 -namesbackend-platform 正确报告为正在运行的节点。

【问题讨论】:

我认为peerage 会帮助你。 peerage 有什么可以帮助我的吗?它说它用于连接集群上的节点。我已经有了。我想将系统中的 shell 连接到生产节点,以便有时对其进行调试和监控。 @JiangYD 您能否为您尝试连接的两台机器提供 /etc/hosts 文件? 【参考方案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

编辑

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

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

在节点 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.

【讨论】:

您在 EDIT 中没有使用短名称,您的意思是 --sname 啊,是的,确实是一个错字。

以上是关于设置短名称时连接到生产节点的主要内容,如果未能解决你的问题,请参考以下文章

android:无法在 targetSdkVersion 更改时连接到相机服务

第一次使用 `homestead ssh` 时连接到 vagrant 是不是有默认密码?

mac上怎么连接到socket

使用 Fabric 时连接到 ~/.ssh/config 中列出的主机

在主机未连接到网络时连接到 vmware 播放器中的服务器

异常:503 将数据推送到 Google Pub/Sub 时连接到所有地址失败