如何使用BRIDGE网络在Marathon中设置Cassandra Docker集群?

时间:2017-01-11 09:24:49

标签: docker cassandra mesos marathon dcos

我有一个生产DC / OS(v1.8.4)群集,我正在尝试在其中设置一个Cassandra群集。我使用Marathon(v1.3.0)来部署Cassandra节点。我使用Cassandra的官方Docker镜像,更具体地说是2.2.3版本。

第一种情况:使用HOST模式网络部署Cassandra - 一切正常

在这种情况下,我首先部署一个我称之为cassasndra-seed的节点,它连接到IP 10.32.0.6的物理主机。从Marathon的stdout日志中我可以看到“Node /10.32.0.6状态跳转到正常”,listen_address和broadcast_address设置为10.32.0.6。如果我在主节点中使用“_cassandra-seed._tcp.marathon.mesos SRV”检查mesos-dns记录,我可以看到解析此服务的IP是10.32.0.6。该节点功能齐全,我设法创建一个测试数据库。

{
  "id": "/cassandra-seed",
  "cpus": 1.5,
  "mem": 8192,
  "disk": 0,
  "instances": 1,
  "container": {
    "type": "DOCKER",
    "docker": {
      "image": "cassandra:2.2.3",
      "network": "HOST",
      "ports": [7199,7000,7001,9160,9042],
      "requirePorts": true,
      "privileged": true
    }
  },
  "constraints": [ ["hostname","UNIQUE"] ],
  "env": { "CASSANDRA_CLUSTER_NAME": "democluster" }
}

现在我使用单独的部署添加一个cassandra节点,并提供10.32.0.6作为种子(在部署JSON的env部分中设置“CASSANDRA_SEEDS”:“10.32.0.6”)。新节点获取另一个物理主机的IP(与之前相同的模式)并设法与种子节点闲聊。因此,我们有一个功能正常的Cassandra集群。

{
  "id": "/cassandra",
  "cpus": 1.5,
  "mem": 8192,
  "disk": 0,
  "instances": 1,
  "container": {
    "type": "DOCKER",
    "docker": {
      "image": "cassandra:2.2.3",
      "network": "HOST",
      "ports": [7199,7000,7001,9160,9042],
      "requirePorts": true,
      "privileged": true
    }
  },
  "constraints": [ ["hostname","UNIQUE"] ],
  "env": { 
    "CASSANDRA_CLUSTER_NAME": "democluster",
    "CASSANDRA_SEEDS": "10.32.0.6" 
  }
}

第二种情况:使用BRIDGE模式网络部署Cassandra - 休斯顿我们遇到了问题

在这种情况下,我还部署了第一个cassandra-seed节点,并将其连接到IP 10.32.0.6的物理主机。但是,现在在Marathon服务的stdout日志中,我可以看到“Node /172.17.0.2状态跳转到正常”,listen_address和broadcast_address设置为172.17.0.2。 172.17.0.2是docker容器的IP(使用docker inspect找到)。但是,如果我在主节点中使用“_cassandra-seed._tcp.marathon.mesos SRV”检查mesos-dns记录,我可以看到解析此服务的IP是10.32.0.6。该节点功能齐全,我设法创建一个测试数据库。

{
  "id": "/cassandra-seed",
  "cpus": 1.5,
  "mem": 8192,
  "disk": 0,
  "instances": 1,
  "container": {
    "type": "DOCKER",
      "docker": {
      "image": "cassandra:2.2.3",
      "network": "BRIDGE",
      "portMappings": [
        {"containerPort": 7000, "hostPort": 7000, "servicePort": 0 },
        {"containerPort": 7001, "hostPort": 7001, "servicePort": 0 },
        {"containerPort": 7199, "hostPort": 7199, "servicePort": 0 },
        {"containerPort": 9042, "hostPort": 9042, "servicePort": 0 },
        {"containerPort": 9160, "hostPort": 9160, "servicePort": 0 },
      ],
      "privileged": true,
    }
  },
  "constraints": [ [ "hostname", "UNIQUE" ] ],
  "env": {"CASSANDRA_CLUSTER_NAME": "democluster"}
}

现在我使用单独的部署添加一个cassandra节点,并提供10.32.0.6作为种子。新节点附加到另一个主机并获取其容器的IP(节点/172.17.0.2状态跳转到正常)。结果是新节点无法与种子闲聊。

{
  "id": "/cassandra",
  "cpus": 1.5,
  "mem": 8192,
  "disk": 0,
  "instances": 1,
  "container": {
    "type": "DOCKER",
      "docker": {
      "image": "cassandra:2.2.3",
      "network": "BRIDGE",
      "portMappings": [
        {"containerPort": 7000, "hostPort": 7000, "servicePort": 0 },
        {"containerPort": 7001, "hostPort": 7001, "servicePort": 0 },
        {"containerPort": 7199, "hostPort": 7199, "servicePort": 0 },
        {"containerPort": 9042, "hostPort": 9042, "servicePort": 0 },
        {"containerPort": 9160, "hostPort": 9160, "servicePort": 0 },
      ],
      "privileged": true,
    }
  },
  "constraints": [ [ "hostname", "UNIQUE" ] ],
  "env": { 
    "CASSANDRA_CLUSTER_NAME": "democluster",
    "CASSANDRA_SEEDS": "10.32.0.6" 
  }
}

问题是如何在第二种情况下让两个节点闲聊?为了找到第一个节点,我应该将IP作为种子提供给第二个节点? 172.17.0.2是docker容器IP,第二个节点无法访问。例如,种子节点中的cassandra实例是否可以像主机网络模式一样获取物理主机的IP?

提前谢谢!

1 个答案:

答案 0 :(得分:0)

当在桥接网络模式下形成一个cassandra集群时,应该注意settinhs。 1.将以下值设置为托管Ip(不是容器ip)

种子:public_ip Broadcast_address:public_ip Broadcast_rpc_address:public_ip

  1. 将listen_address设置为容器Ip
  2. Listen_address:172.17.x.x

    3。将rpc_address设置为0.0.0.0(不要使用localhost)

    这样我们就可以使用桥接网络形成一个Cassandra集群。

    试一试。确保所有端口都可以从外部访问。