У меня есть производственный кластер DC/OS (v1.8.4), и я пытаюсь настроить внутри него кластер Cassandra. Я использую Marathon (v1.3.0) для развертывания узлов Cassandra. Я использую официальный Docker-образ Cassandra, а точнее версию 2.2.3.
Первый случай: развертывание Cassandra с использованием сети в режиме HOST — все в порядке
В этом случае я сначала развертываю узел, который я называю cassasndra-seed, и он подключается к физическому хосту с IP-адресом 10.32.0.6. Из журнала stdout Marathon для этой службы я вижу, что «состояние узла /10.32.0.6 переходит в нормальное состояние» и что listen_address и Broad_address установлены на 10.32.0.6. Если я проверю записи mesos-dns, используя «_cassandra-seed._tcp.marathon.mesos SRV» на главном узле, я увижу, что 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 в качестве семени (установите «CASSANDRA_SEEDS»: «10.32.0.6» в разделе env JSON развертывания). Новый узел получает 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"
}
}
Второй случай: разверните Cassandra с использованием сети в режиме BRIDGE — Хьюстон, у нас проблема
В этом случае я также развертываю первый узел cassandra-seed, и он подключается к физическому хосту с IP-адресом 10.32.0.6. Однако теперь в журнале stdout службы в Marathon я вижу, что «состояние узла /172.17.0.2 переходит в нормальное состояние» и что listen_address и Broad_address установлены на 172.17.0.2. 172.17.0.2 — это IP-адрес контейнера докеров (найден с помощью проверки докеров). Однако, если я проверю записи mesos-dns, используя «_cassandra-seed._tcp.marathon.mesos SRV» на главном узле, я увижу, что 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 — это IP-адрес контейнера докеров, и второй узел недоступен. Например, может ли экземпляр cassandra в начальном узле получить IP-адрес физического хоста, как в режиме хост-сети?
Заранее спасибо!