如何用BRIDGEnetworking在Marathon中设置Cassandra Docker集群?

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

第一种情况:使用HOST模式networking部署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-dnslogging,我可以看到为这个服务parsing的IP是10.32.0.6。 该节点function齐全,我设法创build一个testing数据库。

{ "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(与之前的模式相同),并pipe理与种子节点闲谈。 因此,我们有一个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模式networking部署Cassandra – 休斯敦我们遇到了一个问题

在这种情况下,我还部署了第一个cassandra-seed节点,并将其附加到IP为10.32.0.6的物理主机。 但是,现在在马拉松的服务的标准输出日志中,我可以看到“Node /172.17.0.2状态跳转到正常”,并且listen_address和broadcast_address被设置为172.17.0.2。 172.17.0.2是Docker容器的IP(使用docker检查发现)。 但是,如果我在主节点中使用“_cassandra-seed._tcp.marathon.mesos SRV”检查mesos-dnslogging,则可以看到为该服务parsing的IP是10.32.0.6。 该节点function齐全,我设法创build一个testing数据库。

 { "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(Node /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" } } 

问题是我怎么能在第二种情况下使两个节点八卦? 为了find第一个节点,我应该把哪个IP作为种子提供给第二个节点? docker容器IP为172.17.0.2,不能被第二个节点访问。 例如,种子节点中的cassandra实例是否可以像在主机networking模式下一样获取物理主机的IP?

先谢谢你!

在桥梁networking模式下形成cassandra集群时,应小心谨慎。 1.将以下值设置为主机IP(不是容器IP)

种子:public_ip Broadcast_address:public_ip Broadcast_rpc_address:public_ip

  1. 将listen_address设置为容器Ip

Listen_address:172.17.xx

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

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

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