如何使两个actor系统在docker中运行以形成集群

问题描述 投票:0回答:1

我正在努力了解Akka和Akka群集。

到目前为止,当我在两个不同的控制台中分别启动每个actor系统时(即在各自的jvm中运行每个actor),我已经能够创建两个actor系统并将它们形成一个集群。

配置看起来像这样:

akka {
  actor {
    provider = cluster
    deployment {
      /workRouter {
        router = round-robin-group
        routees.paths = ["/user/worker"]
        cluster {
          enabled = on
          allow-local-routees = on
         }
      }
    }
  }
  remote {
    netty.tcp {
      hostname = ${clustering.host-ip} // this is over riden in the non-seed cluster
      port = ${clustering.host-port}
    }
  }
  cluster {
    seed-nodes = [
     "akka.tcp://"${clustering.name}"@"${clustering.router-seed-ip}":"${clustering.router-seed-port}
   ]
  }
}

# variables
clustering {

  host-ip = "127.0.0.1"
  host-ip = ${?HOST_IP}

  host-port = 2551
  host-port = ${?HOST_PORT}

  router-seed-ip = "127.0.0.1"
  router-seed-ip = ${?ROUTER_CLUSTER_SEED_IP}

  router-seed-port = 2551
  router-seed-port = ${?ROUTER_CLUSTER_SEED_PORT}

  name = "ExperimentCluster"

}

基本上,种子节点在127.0.0.1:2551上运行,非种子节点在127.0.0.1:2553上运行

接下来,我想在docker容器中运行它们中的每一个,并使它们仍然组成集群。他们的actor系统正在运行,但非种子似乎无法加入种子节点

这是我启动种子节点的方式:

docker run -p=2551:2551 --rm seedroute:0.1.0-SNAPSHOT

这就是我启动非种子节点的方式:

docker run -p=2551:2551 --rm workerroute:0.1.0-SNAPSHOT

但是在非种子节点的日志中,我看到以下内容:

[WARN] [11/24/2019 09:48:54.993] [ExperimentCluster-akka.actor.default-dispatcher-4] [akka.cluster.Cluster(akka://ExperimentCluster)] Cluster Node [akka.tcp://[email protected]:2553] - Couldn't join seed nodes after [22] attempts, will try again. seed-nodes=[akka.tcp://[email protected]:2551]

当我在单独的JVM上运行节点时,情况并非如此,这表明事实与docker和网络有关。我以为可以通过-p标志并公开端口,但是显然我还不了解有关网络方面的更多信息。

我还没有使用docker-composedocker swarm。我将最终使用其中之一,但是由于这是一次学习练习,因此我想在逐步使用这些工具时弄清楚各个部分和基本原理。

所以有人知道如何使它正常工作吗?基本上是在docker容器中手动启动两个Akka节点,并使它们能够相互通信并形成集群。

docker akka docker-networking akka-cluster
1个回答
0
投票

您所描述的正是您使用Docker Compose的原因-因此每个容器都可以部署到网络中,使它们能够相互通信。

如果您不想这样做,当然可以使用--net=host将容器暴露给主机网络,并让它们直接直接通信-但是,这抵消了容器联网的许多好处首先,保持网络隔离并仅桥接/暴露端口入口点的能力实际上是您需要外部可访问的。

另一种选择是,对于希望插入到网络中的每个容器,使用多个撰写文件,然后根据https://docs.docker.com/compose/networking/#use-a-pre-existing-network将这些文件加入现有的命名网络中。

© www.soinside.com 2019 - 2024. All rights reserved.