【问题标题】:How to get two actor system running in docker to form a cluster如何让两个actor系统在docker中运行以形成一个集群
【发布时间】:2019-11-24 10:04:31
【问题描述】:

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

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

配置如下:

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 容器中运行它们中的每一个,并让它们仍然形成一个集群。他们的演员系统运行,但非种子似乎无法加入种子节点

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

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://ExperimentCluster@127.0.0.1:2553] - Couldn't join seed nodes after [22] attempts, will try again. seed-nodes=[akka.tcp://ExperimentCluster@127.0.0.1:2551]

当我在单独的 JVM 上运行节点时,情况并非如此,这表明这与 docker 和网络有关。我认为传递-p 标志并公开端口会起作用,但显然还有更多关于我还不了解的网络方面。

我还没有使用 docker-composedocker swarm。我最终将使用其中的一个,但由于这是一个学习练习,我希望在升级工具时正确掌握各个部分和基础知识。

那么有谁知道如何让它工作?基本上在 docker 容器中手动启动两个 Akka 节点,让它们能够相互通信并形成集群。

【问题讨论】:

    标签: docker akka docker-networking akka-cluster


    【解决方案1】:

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

    您可以按照https://docs.docker.com/engine/reference/commandline/network_connect/ 手动创建网络并向其中添加容器来手动执行此操作 但除了简单地进行基本的compose 实验之外,我不确定这是否有很多学习实用性。

    如果你不想这样做,当然可以使用--net=host 将容器暴露给宿主网络,让它们直接通信——然而,这否定了容器的很多好处首先是网络 - 保持网络隔离的能力,并且只桥接/公开您真正需要外部访问的端口入口点。

    另一种选择是在某个时间点为您希望插入网络的每个容器使用多个撰写文件,然后按照https://docs.docker.com/compose/networking/#use-a-pre-existing-network 将这些文件加入现有的命名网络。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-17
      • 2018-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多