【发布时间】: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