运行 一个带有 EC2 和 Docker 的 Akka 集群。节点未在 akka-cluster 中注册
Running an Akka Cluster with EC2 and Docker. Nodes aren't registered in akka-cluster
我实现了下面的akka-cluster系统示例,请看下图:
┌────host_D:3000────┐
┌───────▶│ .... │
│ ┌────host_C:3000────┐ │
┌────host_A:2551────┐ │ ┌───▶│ │ │
│ │──┘ │ ┌────host_B:3000────┐ │ │
│┌─────────────────┐│────┘ │┌─────────────────┐│ │ │
││ MasterActor ││──────▶││ WorkerActor ││ │─┘
│└─────────────────┘│ │└─────────────────┘│─┘
└───────────────────┘ └───────────────────┘
MasterActor
和 WorkerActor
分别在 sbt-modules
中实现,并从使用 scalatra-servlets 开始。因此,当部署特定的 sbt 模块时,在 ServletContextListener
中创建了一个 actor 系统。
MasterActor
和WorkerActor
订阅了集群事件(如MemberJoin/Up/etc)。 WorkerActor
可以在不同的节点上缩放。并且使用以下端口限制:
2551
- 对于MasterActor的集群节点
3000
- 对于WorkerActor的集群节点
我只需要关注集群事件。因为本题省略了以下细节:
- 检测种子节点(由EC2 client计算)
- 从 MasterActor 向 worker 发送消息(它们由一些负载均衡器发送)。
这在我的本地机器上成功运行(并且在 VirtualBox 下使用虚拟机)。但是我在 EC2/docker 上部署时遇到了问题。
例如,我使用具有以下 IP 的两台 EC2 主机:10.x.x.A
和 10.x.x.B
。我的项目可以通过以下方式部署到EC2中:
MasterActor
模块位于 10.x.x.A
和 WorkerActor
模块位于 10.x.x.B
- 反之亦然
- 模块部署在同一台主机上。
当模块部署在不同主机时,我考虑方式#1。由于我不知道 MasterActor
将使用哪个 IP,因此我为每个节点保留了一个种子节点。根据以上端口限制。请参阅下图,其中说明了我的基础架构和 akka 集群配置。
┌──[ec2@10.x.x.A]─────────────────────────────────────────────┐
│ │
│ > ifconfig │
│ eth0 10.x.x.A │
│ docker0 172.17.0.1 │
│ │
│ │
│ ┌─────[docker:172.17.x.d1]──────────────────────────────┐ │
│ │ > ifconfig ┌─────────────────┐ │ │
│ │ eth0 172.17.x.d1 │ MasterActor │ │ │
│ │ └─────────────────┘ │ │
│ │ ClusterSystem { │ │
│ │ akka.remote.netty.tcp.hostname = "10.x.x.A" │ │
│ │ akka.remote.netty.tcp.port = "2551" │ │
│ │ akka.cluster.roles = ["master"] │ │
│ │ akka.remote.netty.tcp.bind-hostname = "172.17.x.d1" │ │
│ │ akka.remote.netty.tcp.bind-port = "2552" │ │
│ │ akka.cluster.seed-nodes = [ │ │
│ │ "akka.tcp://ClusterSystem@10.x.x.A:2551", │ │
│ │ "akka.tcp://ClusterSystem@10.x.x.A:3000", │ │
│ │ "akka.tcp://ClusterSystem@10.x.x.B:2551", │ │
│ │ "akka.tcp://ClusterSystem@10.x.x.B:3000" ] │ │
│ │ } │ │
│ │ │ │
│ └───────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
┌──[ec2@10.x.x.B]─────────────────────────────────────────────┐
│ │
│ > ifconfig │
│ eth0 10.x.x.B │
│ docker0 172.17.0.1 │
│ │
│ │
│ ┌─────[docker:172.17.x.d2]──────────────────────────────┐ │
│ │ > ifconfig ┌─────────────────┐ │ │
│ │ eth0 172.17.x.d2 │ WorkerActor │ │ │
│ │ └─────────────────┘ │ │
│ │ ClusterSystem { │ │
│ │ akka.remote.netty.tcp.hostname = "10.x.x.B" │ │
│ │ akka.remote.netty.tcp.port = "3000" │ │
│ │ akka.cluster.roles = ["worker"] │ │
│ │ akka.remote.netty.tcp.bind-hostname = "172.17.x.d2" │ │
│ │ akka.remote.netty.tcp.bind-port = "2552" │ │
│ │ akka.cluster.seed-nodes = [ │ │
│ │ "akka.tcp://ClusterSystem@10.x.x.A:2551", │ │
│ │ "akka.tcp://ClusterSystem@10.x.x.A:3000", │ │
│ │ "akka.tcp://ClusterSystem@10.x.x.B:2551", │ │
│ │ "akka.tcp://ClusterSystem@10.x.x.B:3000" ] │ │
│ │ } │ │
│ │ │ │
│ └───────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
在每个 EC2 实例中,我说明了 ifconfig
命令的结果。每个 docker 都有相同的说明。
对于 akka-cluster 配置,我使用了这个 manual:
主要问题:MasterActor
节点已启动并在 akka 集群中成功注册。但是 WorkerActor
已启动但未在 akka 集群中注册。
主要问题:我的集群系统的配置是否正确?有没有错误?
我还发现了一些与主要问题相关的问题:
- 无法从
10.x.x.A
ping 到 10.x.x.B
,反之亦然
问题与主机和端口可用性有关:
Can't ping from 10.x.x.A to 10.x.x.B and vice versa
现在集群运行成功。
我实现了下面的akka-cluster系统示例,请看下图:
┌────host_D:3000────┐
┌───────▶│ .... │
│ ┌────host_C:3000────┐ │
┌────host_A:2551────┐ │ ┌───▶│ │ │
│ │──┘ │ ┌────host_B:3000────┐ │ │
│┌─────────────────┐│────┘ │┌─────────────────┐│ │ │
││ MasterActor ││──────▶││ WorkerActor ││ │─┘
│└─────────────────┘│ │└─────────────────┘│─┘
└───────────────────┘ └───────────────────┘
MasterActor
和 WorkerActor
分别在 sbt-modules
中实现,并从使用 scalatra-servlets 开始。因此,当部署特定的 sbt 模块时,在 ServletContextListener
中创建了一个 actor 系统。
MasterActor
和WorkerActor
订阅了集群事件(如MemberJoin/Up/etc)。 WorkerActor
可以在不同的节点上缩放。并且使用以下端口限制:
2551
- 对于MasterActor的集群节点3000
- 对于WorkerActor的集群节点
我只需要关注集群事件。因为本题省略了以下细节:
- 检测种子节点(由EC2 client计算)
- 从 MasterActor 向 worker 发送消息(它们由一些负载均衡器发送)。
这在我的本地机器上成功运行(并且在 VirtualBox 下使用虚拟机)。但是我在 EC2/docker 上部署时遇到了问题。
例如,我使用具有以下 IP 的两台 EC2 主机:10.x.x.A
和 10.x.x.B
。我的项目可以通过以下方式部署到EC2中:
MasterActor
模块位于10.x.x.A
和WorkerActor
模块位于10.x.x.B
- 反之亦然
- 模块部署在同一台主机上。
当模块部署在不同主机时,我考虑方式#1。由于我不知道 MasterActor
将使用哪个 IP,因此我为每个节点保留了一个种子节点。根据以上端口限制。请参阅下图,其中说明了我的基础架构和 akka 集群配置。
┌──[ec2@10.x.x.A]─────────────────────────────────────────────┐
│ │
│ > ifconfig │
│ eth0 10.x.x.A │
│ docker0 172.17.0.1 │
│ │
│ │
│ ┌─────[docker:172.17.x.d1]──────────────────────────────┐ │
│ │ > ifconfig ┌─────────────────┐ │ │
│ │ eth0 172.17.x.d1 │ MasterActor │ │ │
│ │ └─────────────────┘ │ │
│ │ ClusterSystem { │ │
│ │ akka.remote.netty.tcp.hostname = "10.x.x.A" │ │
│ │ akka.remote.netty.tcp.port = "2551" │ │
│ │ akka.cluster.roles = ["master"] │ │
│ │ akka.remote.netty.tcp.bind-hostname = "172.17.x.d1" │ │
│ │ akka.remote.netty.tcp.bind-port = "2552" │ │
│ │ akka.cluster.seed-nodes = [ │ │
│ │ "akka.tcp://ClusterSystem@10.x.x.A:2551", │ │
│ │ "akka.tcp://ClusterSystem@10.x.x.A:3000", │ │
│ │ "akka.tcp://ClusterSystem@10.x.x.B:2551", │ │
│ │ "akka.tcp://ClusterSystem@10.x.x.B:3000" ] │ │
│ │ } │ │
│ │ │ │
│ └───────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
┌──[ec2@10.x.x.B]─────────────────────────────────────────────┐
│ │
│ > ifconfig │
│ eth0 10.x.x.B │
│ docker0 172.17.0.1 │
│ │
│ │
│ ┌─────[docker:172.17.x.d2]──────────────────────────────┐ │
│ │ > ifconfig ┌─────────────────┐ │ │
│ │ eth0 172.17.x.d2 │ WorkerActor │ │ │
│ │ └─────────────────┘ │ │
│ │ ClusterSystem { │ │
│ │ akka.remote.netty.tcp.hostname = "10.x.x.B" │ │
│ │ akka.remote.netty.tcp.port = "3000" │ │
│ │ akka.cluster.roles = ["worker"] │ │
│ │ akka.remote.netty.tcp.bind-hostname = "172.17.x.d2" │ │
│ │ akka.remote.netty.tcp.bind-port = "2552" │ │
│ │ akka.cluster.seed-nodes = [ │ │
│ │ "akka.tcp://ClusterSystem@10.x.x.A:2551", │ │
│ │ "akka.tcp://ClusterSystem@10.x.x.A:3000", │ │
│ │ "akka.tcp://ClusterSystem@10.x.x.B:2551", │ │
│ │ "akka.tcp://ClusterSystem@10.x.x.B:3000" ] │ │
│ │ } │ │
│ │ │ │
│ └───────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
在每个 EC2 实例中,我说明了 ifconfig
命令的结果。每个 docker 都有相同的说明。
对于 akka-cluster 配置,我使用了这个 manual:
主要问题:MasterActor
节点已启动并在 akka 集群中成功注册。但是 WorkerActor
已启动但未在 akka 集群中注册。
主要问题:我的集群系统的配置是否正确?有没有错误?
我还发现了一些与主要问题相关的问题:
- 无法从
10.x.x.A
ping 到10.x.x.B
,反之亦然
问题与主机和端口可用性有关:
Can't ping from 10.x.x.A to 10.x.x.B and vice versa
现在集群运行成功。