我有一个 riak 集群,它在分散的多个虚拟机上运行。我现在正在尝试使用 docker,并希望将运行在 docker 容器中的节点添加到集群中。
在这种情况下,我该如何配置网络组件?我的容器可以看到非容器实例并可以加入集群,但非容器化实例无法与容器化实例发起通信。
假设我有两个运行 riak 的虚拟机,IP 地址分别为 192.168.1.1 和 .2。我的 docker 主机的 IP 地址为 192.168.1.3。三个 riak 容器的 IP 地址分别为 172.17.0.1、.2 和 .3。我将每个容器实例都加入到集群中。
在任何节点上运行riak-admin member-status
都会显示如下内容:
状态环待定节点 ------------------------------------------ 有效 0.0% 32.8%'[电子邮件保护]‘ 有效 0.0% 0.0%'[电子邮件保护]‘ 有效 0.0% 0.0%'[电子邮件保护]‘ 有效 50.0% 32.8% '[电子邮件保护]‘ 有效 50.0% 32.8% '[电子邮件保护]‘
由于虚拟机无法与容器发起通信,因此集群无法自行平衡。
我知道如何在我的容器中公开端口并在docker主机上发布这些端口,但我不确定如何使用docker主机的IP地址和发布的端口将容器化的riak节点加入集群...
答案1
多数据中心复制用于在集群之间复制数据,它可能不会帮助您设置集群。
关键可能是打开所有需要的端口,其中包括:
tcp/4369 (epmd)
tcp/8098 (riak http)
tcp/8087 (riak protocol buffers)
tcp/8099 (riak handoff)
tcp/x (riak disterl)
默认情况下,disterl 端口是从操作系统临时端口范围中选择的,但您可以使用erlang.distribution.port_range.minimum
和erlang.distribution.port_range.maximum
设置来限制它。
客户端需要端口 8098 和 8087 才能访问容器中的 Riak 实例。
端口 4369 用于 EPMD,它是端口映射器,允许其他节点找到 Riak 节点的 disterl 端口。
Riak 实例需要端口 8099 来接收来自其他节点的切换。
disterl 端口是节点之间的主要通信通道。
为了使集群正常运行,需要公开 4369、8099 和 disterl 端口,仅当客户端请求直接到达容器中的实例时才需要另外两个端口。