运行 一个带有 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   ││ │─┘
 │└─────────────────┘│       │└─────────────────┘│─┘
 └───────────────────┘       └───────────────────┘

MasterActorWorkerActor 分别在 sbt-modules 中实现,并从使用 scalatra-servlets 开始。因此,当部署特定的 sbt 模块时,在 ServletContextListener 中创建了一个 actor 系统。

MasterActorWorkerActor订阅了集群事件(如MemberJoin/Up/etc)。 WorkerActor 可以在不同的节点上缩放。并且使用以下端口限制:

我只需要关注集群事件。因为本题省略了以下细节:

这在我的本地机器上成功运行(并且在 VirtualBox 下使用虚拟机)。但是我在 EC2/docker 上部署时遇到了问题。 例如,我使用具有以下 IP 的两台 EC2 主机:10.x.x.A10.x.x.B。我的项目可以通过以下方式部署到EC2中:

  1. MasterActor 模块位于 10.x.x.AWorkerActor 模块位于 10.x.x.B
  2. 反之亦然
  3. 模块部署在同一台主机上。

当模块部署在不同主机时,我考虑方式#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 集群中注册。

主要问题:我的集群系统的配置是否正确?有没有错误?

我还发现了一些与主要问题相关的问题:

  1. 无法从 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

现在集群运行成功。