Как настроить кластер Cassandra Docker в Marathon с сетью BRIDGE?

У меня есть производственный кластер 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-адрес физического хоста, как в режиме хост-сети?

Заранее спасибо!


person Manolis    schedule 11.01.2017    source источник
comment
Почему вы не используете пакет DC/OS Universe для Cassandra? Я думаю, это сильно облегчило бы задачу...   -  person Tobi    schedule 11.01.2017


Ответы (1)


При формировании кластера cassandra в режиме мостовой сети следует соблюдать следующие настройки. 1. Установите приведенные ниже значения для IP-адреса хоста (не IP-адреса контейнера).

Семена: public_ip Broadcast_address: public_ip Broadcast_rpc_address: public_ip

  1. Установите listen_address для IP-адреса контейнера

Listen_address : 172.17.x.x

3 . Установите для rpc_address значение 0.0.0.0 (не используйте localhost)

Таким образом, мы можем сформировать кластер Cassandra, используя мостовую сеть.

Попробуйте. Убедитесь, что необходимые порты доступны из внешнего мира.

person sandeep    schedule 16.06.2017