我有一个生产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?
提前谢谢!
答案 0 :(得分:0)
当在桥接网络模式下形成一个cassandra集群时,应该注意settinhs。 1.将以下值设置为托管Ip(不是容器ip)
种子:public_ip Broadcast_address:public_ip Broadcast_rpc_address:public_ip
Listen_address:172.17.x.x
3。将rpc_address设置为0.0.0.0(不要使用localhost)
这样我们就可以使用桥接网络形成一个Cassandra集群。
试一试。确保所有端口都可以从外部访问。