你想要实现的是绝对可行.
预赛
Erlang的分发地址分为两部分:节点名和主机名。它们由@
sign.
主机名可以是数字 IPv4 地址。它们也可以是域名。有两种不同的模式,其中主机名很短(单个单词,例如vm1
)以及它们的长度(几个单词,例如vm1.domain.com
)。 IP 地址是长名称。以一种模式(短或长)启动的节点只能与以相同模式启动的节点通信。节点也受到 cookie 的保护:节点仅接受具有匹配 cookie 的传入连接。最简单的方法是使用相同的 cookie 启动给定集群的所有节点。
当一个 Erlang 节点尝试连接到另一个 Erlang 节点时,它需要找到远程节点的 IP 地址。如果它与自身相同,它将简单地尝试在本地主机上进行连接。如果不同,它将尝试将此主机名解析为 IP 地址。
然后它将连接到epmd
该主机上的守护进程被告知 Erlang 正在运行哪个端口。epmd
以及 Erlang 节点监听所有接口(默认情况下)。
解决方案及示例
基于此机制,您可以使用短名称或长名称,但要利用解析机制。在 Unix 上最简单的方法是在每个设备上配置不同的 IP/etc/hosts
您的计算机(特别是在两个虚拟机上),因此它们将通过其私有地址相互连接,同时通过其公共地址进行访问。
假设虚拟机 A (VM A) 具有私有 IP 地址 10.0.0.2 和公共 IP 地址 123.4.5.2,VM B 具有私有 IP 地址 10.0.0.3 和公共 IP 地址 123.4.5.3。假设您决定使用简称。
您可以将此条目放在 VM A 中/etc/hosts
:
10.0.0.3 vmb
您可以将匹配的条目放在 VM B 上/etc/hosts
:
10.0.0.2 vma
在所有外部客户端上,您可以放置:
123.4.5.2 vma
123.4.5.3 vmb
您将按如下方式启动节点:
# Node foo on VM A:
erl -sname foo@vma -cookie RANDOMCOOKIE
# Node foo on VM B:
erl -sname foo@vmb -cookie RANDOMCOOKIE
# Client nodes:
erl -sname client -cookie RANDOMCOOKIE
您可以避免/etc/hosts
如果您有域名(例如yourdomain.com
)你可以得到vma.yourdomain.com
解析为 123.4.5.2。您还可以使用特定的Erlang Inet 配置文件.
Security
Erlang 分发机制并不意味着面向公众。此外,所有通信都将不加密。我强烈建议配置防火墙在每个主机上只允许来自其他集群服务器的连接使用 SSL 分发.
对于防火墙:Erlang 发行版使用端口 4369epmd
以及每个节点的随机端口。您可以使用 Erlang 内核应用程序环境设置来限制这些随机端口的范围inet_dist_listen_min
and inet_dist_listen_max
。您将需要允许这些端口上的传入 TCP 连接,但仅限于来自集群的其他主机。
SSL 分发的设置相当复杂,但是有据可查。您的情况的主要缺点是所有连接都应该通过 SSL 进行,包括其专用网络上的两个虚拟机之间的连接,以及用于打开远程 shell 的本地连接。