docker - docker 中的 akka 节点显式解除关联

标签 docker akka akka-cluster

我在我的项目中使用 akka 2.4-M2。我想用 docker 部署我的项目。但是,当我使用 boot2docker 测试两个节点时,出现了问题。我的节点无法连接到种子节点。

build.sbt中的配置如下:

lazy val `topGatewayFrontend` = (project in file("topGatewayFrontend"))
  .enablePlugins(PlayScala)
  .enablePlugins(DockerPlugin)
  .settings(
    name := "topGatewayFrontend",
    libraryDependencies ++= (Dependencies.topGatewayFrontend ++ Seq(cache,     ws)),
    dockerExposedPorts := Seq(9000)
  )

lazy val `topGatewayBackend` = (project in file("topGatewayBackend"))
  .enablePlugins(JavaAppPackaging)
  .enablePlugins(DockerPlugin)
  .enablePlugins(UniversalPlugin)
  .settings(
    name := "topGatewayBackend",
    javaOptions in run ++= Seq(
      "-Djava.library.path=./sigar",
      "-Xms128m", "-Xmx512m"),
    // this enables custom javaOptions
    fork in run := true,
    libraryDependencies ++= Dependencies.topGatewayBackend ++ Seq(ws),
    dockerExposedPorts := Seq(9527)
  ).dependsOn(auditApi).aggregate(auditApi)

topGatewayFrontend中的远程配置是:

akka{
  remote {
    log-sent-messages = on
    log-received-messages = on
    netty.tcp {
      hostname = ${?HOSTNAME}
      port = 9527                   # external (logical) port
      bind-hostname = 0.0.0.0
      bind-port = 0
    }
  }
  cluster {
    seed-nodes = ["akka.tcp://application@"${?HOSTNAME}":9527"]
    roles = [topGatewayBackend]
  }
}

在topGatewayBackend中是:

akka{
  remote {
    log-sent-messages = on
    log-received-messages = on
    netty.tcp {
      hostname = ${?HOSTNAME}
      port = 0              # external (logical) port
      bind-hostname = 0.0.0.0
      bind-port = 0
    }
  }
  cluster {
    seed-nodes = ["akka.tcp://application@"${?HOSTNAME}":9527"]
    roles = [topGatewayFrontend]
  }
}

我得到的日志如下:

在后端:

[INFO] [07/12/2015 03:13:37.568] [application-akka.actor.default-dispatcher-16] [akka.cluster.Cluster(akka://application)] Cluster Node [akka.tcp://application@192.168.59.103:9527] - Metrics collection has started successfully
[INFO] [07/12/2015 03:13:38.107] [application-akka.actor.default-dispatcher-16] [akka.cluster.Cluster(akka://application)] Cluster Node [akka.tcp://application@192.168.59.103:9527] - Leader is moving node [akka.tcp://application@192.168.59.103:9527] to [Up]
[INFO] [07/12/2015 03:13:38.112] [application-akka.actor.default-dispatcher-4] [akka.tcp://application@192.168.59.103:9527/user/cluster-monitor] Member up akka.tcp://application@192.168.59.103:9527 with roles Set(topGatewayBackend)

在前端:

[INFO] [07/12/2015 03:13:47.558] [main] [akka.remote.Remoting] Starting remoting
[INFO] [07/12/2015 03:13:47.842] [main] [akka.remote.Remoting] Remoting started; listening on addresses :[akka.tcp://application@192.168.59.103:34354]
[INFO] [07/12/2015 03:13:47.883] [main] [akka.cluster.Cluster(akka://application)] Cluster Node [akka.tcp://application@192.168.59.103:34354] - Starting up...
[INFO] [07/12/2015 03:13:48.057] [main] [akka.cluster.Cluster(akka://application)] Cluster Node [akka.tcp://application@192.168.59.103:34354] - Registered cluster JMX MBean [akka:type=Cluster]
[INFO] [07/12/2015 03:13:48.058] [main] [akka.cluster.Cluster(akka://application)] Cluster Node [akka.tcp://application@192.168.59.103:34354] - Started up successfully
[INFO] [07/12/2015 03:13:48.251] [application-akka.actor.default-dispatcher-17] [akka.cluster.Cluster(akka://application)] Cluster Node [akka.tcp://application@192.168.59.103:34354] - Metrics collection has started successfully
[WARN] [07/12/2015 03:13:48.509] [application-akka.remote.default-remote-dispatcher-5] [akka.tcp://application@192.168.59.103:34354/system/endpointManager/reliableEndpointWriter-akka.tcp%3A%2F%2Fapplication%40192.168.59.103%3A9527-0] Association with remote system [akka.tcp://application@192.168.59.103:9527] has failed, address is now gated for [5000] ms. Reason: [Association failed with [akka.tcp://application@192.168.59.103:9527]] Caused by: [The remote system explicitly disassociated (reason unknown).]

问题是[关联失败 [akka.tcp://application@192.168.59.103:9527]] 原因是:[远程系统明确解除关联(原因未知)。]

docker运行命令是: docker run -e HOSTNAME=192.168.59.103 -p 9527:9527 docker.fenxibao.com/topgatewaybackend:1.0-SNAPSHOTdocker run -p 9000:9000 -e HOSTNAME=192.168.59.103 docker.fenxibao.com/topgatewayfrontend:1.0-SNAPSHOT

我想知道如何才能使前端与后端成功关联。

先感谢您的耐心解答。

最佳答案

检查如何在 docker 中运行 akka 集群:http://blog.michaelhamrah.com/2014/06/akka-clustering-with-sbt-docker-and-sbt-native-packager/

简单的回答是akka集群要求内部和外部的地址保持一致。因此,当您在 docker 中启动 akka 应用程序时,您需要使用为容器动态创建的内部 IP 地址。

您需要有一个像这样的启动脚本:

#!/bin/bash

CLUSTER_IP=`/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1 }'` $@     

将其放入您的 docker 容器中,并在 akka 配置中使用 CLUSTER_IP 环境变量作为其集群主机地址。

更新: 在docker 1.10+版本中,由于添加了新的网络功能,因此不需要启动脚本。您可以只使用容器的名称作为引用,docker 会为您修复地址。

关于docker - docker 中的 akka 节点显式解除关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31360991/

相关文章:

具有远程节点 : Disassociated exception 的 Akka (.net) 集群

docker - docker 客户端必须运行提升才能连接

docker - 可以从不是容器的Docker镜像检索文件吗?

docker - 更新 Strapi Docker package.json

akka - 在 Akka 集群中发送大消息(> 200MB)

kubernetes - 如何确定akka集群是否在kubernetes上运行?

docker - 一个小的 Docker 镜像在运行时有多重要?

java - Akka 持久性 - 当收到消息传递确认时,从日志中删除消息(或标记为已确认)

scala - Akka 流卡夫卡: No configuration setting found for key 'kafka-clients'

simulation - 用于模拟的 Akka