gpt4 book ai didi

erlang - 当内部和外部 IP 地址起作用时连接 Erlang 节点

转载 作者:行者123 更新时间:2023-12-02 07:24:32 28 4
gpt4 key购买 nike

我有两台虚拟机,它们使用内部 IP 地址相互通信,而外界只能通过外部 IP 地址了解这些虚拟机。

我有一个分布式缓存,它使用两个虚拟机 - 每个虚拟机都有一个必须与另一个虚拟机通信的 Erlang 节点。我在其他机器上也有 Erlang 缓存客户端,需要与虚拟机上的一个(或两个)Erlang 缓存节点进行通信。

因此,如果我有使用内部 IP 地址命名的缓存节点,那么它们可以相互通信,但没有其他 Erlang 节点可以与它们交互。但是,如果我使用虚拟机的外部 IP 地址命名缓存节点,那么外部 Erlang 节点可以与缓存节点通信,但缓存节点之间无法通信。

除了使用不依赖于将节点加入网格的 http 或基于套接字的接口(interface)之外,我还能做些什么吗?

最佳答案

您想要实现的目标绝对可行

预备知识

Erlang的分发地址分为两部分:节点名和主机名。它们由 @ 符号分隔。

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

当一个Erlang节点尝试连接到另一个Erlang节点时,它需要找到远程节点的IP地址。如果它与自身相同,它将简单地尝试在本地主机上进行连接。如果不同,它将尝试将此主机名解析为 IP 地址。

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

解决方案和示例

基于此机制,您可以使用短名称或长名称,但要利用解析机制。在 Unix 上最简单的方法是在每台机器上(尤其是在两个虚拟机上)配置不同的 IP,这样它们就可以通过其私有(private)地址相互连接,同时可以通过他们的公共(public)地址。

假设虚拟机 A (VM A) 具有私有(private) IP 地址 10.0.0.2 和公共(public) IP 地址 123.4.5.2,VM B 具有私有(private) IP 地址 10.0.0.3 和公共(public) 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

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

安全

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

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

SSL 分发的设置相当复杂,但是 well documented 。您的情况的主要缺点是所有连接都应通过 SSL 进行,包括专用网络上的两个虚拟机之间的连接,以及用于打开远程 shell 的本地连接。

关于erlang - 当内部和外部 IP 地址起作用时连接 Erlang 节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26474591/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com