在内部和外部IP地址正在运行时连接Erlang节点

Jr0*_*Jr0 6 erlang

我有两台使用内部IP地址的虚拟机互相通话,而外界只通过外部IP地址了解这些虚拟机.

我有一个使用两个VM的分布式缓存 - 每个都有一个必须与另一个进行通信的Erlang节点.我还有其他机器上的现金的Erlang客户端需要与VM上的一个(或两个)Erlang缓存节点进行通信.

因此,如果我使用内部IP地址命名的缓存节点,那么它们可以相互通信,但没有其他Erlang节点可以与它们交互.但是,如果我使用VM的外部IP地址命名缓存节点,那么外部Erlang节点可以与缓存节点通信,但缓存节点不能彼此通信.

除了使用不依赖于将节点连接到网格中的基于http或套接字的接口之外,我能做些什么吗?

Pau*_*yot 10

你想要实现的目标绝对可行.

预赛

Erlang的分发地址分为两部分:节点名称和主机名.他们被@标志分开.

主机名可以是数字IPv4地址.它们也可以是域名.有两种不同的模式,其中主机名是短的(单个字,例如vm1),它们是长的(例如,几个单词vm1.domain.com).IP地址是长名称.以一种模式(短或长)启动的节点只能与以相同模式启动的节点通信.节点也受cookie保护:节点只接受带有匹配cookie的传入连接.最简单的方法是使用相同的cookie启动给定集群的所有节点.

当Erlang节点尝试连接到另一个Erlang节点时,它需要找到远程节点的IP地址.如果它与它自己相同,它将只是尝试连接本地主机.如果不同,它将尝试将此主机名解析为IP地址.

然后它将连接到epmd该主机上的守护进程,以告知Erlang正在运行哪个端口.epmd以及Erlang节点监听所有接口(默认情况下).

解决方案和例子

基于此机制,您可以使用短名称或长名称,但可以利用解析机制.Unix上最简单的方法/etc/hosts是在你的每台机器上配置不同的IP (特别是在两台虚拟机上),这样它们就可以通过私有地址相互连接,同时通过公共地址访问.

假设虚拟机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
Run Code Online (Sandbox Code Playgroud)

您可以将匹配条目放在VM B上/etc/hosts:

10.0.0.2 vma
Run Code Online (Sandbox Code Playgroud)

在所有外部客户端上,您可以:

123.4.5.2 vma
123.4.5.3 vmb
Run Code Online (Sandbox Code Playgroud)

您可以按如下方式启动节点:

# 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
Run Code Online (Sandbox Code Playgroud)

/etc/hosts如果您有域名(例如yourdomain.com),则可以避免在客户端节点上进行编辑,并且可以vma.yourdomain.com解析为123.4.5.2.您还可以使用特定的Erlang Inet配置文件.

安全

Erlang分发机制并不意味着面向公众.此外,所有通信都是未加密的.我强烈建议在每台主机上配置防火墙,只允许来自其他群集服务器的连接并使用SSL分发.

对于防火墙:Erlang发行版使用端口4369 epmd以及每个节点的随机端口.您可以通过使用Erlang的核心应用环境设置限制这些随机端口的范围inet_dist_listen_mininet_dist_listen_max.您将需要允许这些端口上的传入TCP连接,但仅允许来自群集的其他主机.

SSL分发设置非常复杂,但有详细记录.您的主要缺点是所有连接都应该通过SSL,包括其专用网络上的两个虚拟机之间的连接,以及打开远程shell的本地连接.