【问题标题】:How to set up Cassandra Docker cluster in Marathon with BRIDGE network?如何使用 BRIDGE 网络在 Marathon 中设置 Cassandra Docker 集群?
【发布时间】:2017-05-26 00:18:24
【问题描述】:

我有一个生产 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 的标准输出日志中,我可以看到“节点 /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 服务的标准输出日志中,我可以看到“节点 /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?

提前谢谢你!

【问题讨论】:

  • 您为什么不使用适用于 Cassandra 的 DC/OS Universe 包?我想这会让事情变得更容易......

标签: docker cassandra mesos marathon dcos


【解决方案1】:

在桥接网络模式下形成 cassandra 集群时,应注意以下设置。 1.将以下值设置为主机IP(不是容器IP)

种子:public_ip 广播地址:public_ip Broadcast_rpc_address : public_ip

  1. 将listen_address设置为容器Ip

监听地址:172.17.x.x

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

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

试一试。确保可以从外部访问所需的端口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-23
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    相关资源
    最近更新 更多