Назад | Перейти на главную страницу

Загрузка трехузлового кластера Elastic Search с использованием контейнеров Docker

Я пытаюсь настроить тестовый кластер Elastic Search на 3 отдельных хостах, используя официальный 7.2.0 образ докера

Каждый контейнер настроен с помощью elasticsearch.yml, который выглядит следующим образом

cluster.name: mytest
network.host: "0.0.0.0"
node.name: mytest-10.131.105.90
discovery.seed_hosts:
  - "10.131.128.252:9300"
  - "10.131.129.28:9300"
  - "10.131.105.90:9300"
cluster.initial_master_nodes:
  - mytest-10.131.128.252
  - mytest-10.131.129.28
  - mytest-10.131.105.90

После запуска каждого узла он не может обнаружить другие узлы, сообщая об этом.

{
  "type": "server",
  "timestamp": "2019-07-04T18:42:18,751+0000",
  "level": "WARN",
  "component": "o.e.c.c.ClusterFormationFailureHelper",
  "cluster.name": "mytest",
  "node.name": "mytest-10.131.105.90",
  "message": "master not discovered yet, this node has not previously joined a bootstrapped (v7+) cluster, and this node must discover master-eligible nodes [mytest-10.131.128.252, mytest-10.131.129.28, mytest-10.131.105.90] to bootstrap a cluster: have discovered []; discovery will continue using [10.131.128.252:9300, 10.131.129.28:9300, 10.131.105.90:9300] from hosts providers and [{mytest-10.131.105.90}{qZqV5-4RSduwKNYIOWVB9A}{_nCNwrToRoeNAiWBO1DbGg}{134.209.178.145}{134.209.178.145:9300}{ml.machine_memory=2090500096, xpack.installed=true, ml.max_open_jobs=20}] from last-known cluster state; node term 0, last-accepted version 0 in term 0"
}

Просто чтобы повторить ту длинную ошибку с переносом слов ...

master еще не обнаружен, этот узел ранее не присоединялся к кластеру с начальной загрузкой (v7 +), и этот узел должен обнаружить узлы, соответствующие требованиям мастера [mytest-10.131.128.252, mytest-10.131.129.28, mytest-10.131.105.90] для начальной загрузки кластера : открыли []; обнаружение продолжится с использованием [10.131.128.252:9300, 10.131.129.28:9300, 10.131.105.90:9300] от провайдеров хостов и [{mytest-10.131.105.90} {qZqV5-4RSduwKNYIOWVB9A} {_ nCNwrToRoeNAiWBO1 134DbG.145} { .178.145: 9300} {ml.machine_memory = 2090500096, xpack.installed = true, ml.max_open_jobs = 20}] из последнего известного состояния кластера; термин узла 0, последняя принятая версия 0 в термине 0

Похоже, это не проблема с сетью. Изнутри контейнера я могу использовать curl для проверки доступа к портам 9200 и 9300 на других узлах.

Подозреваю, что в именах узлов есть что-то неуловимое, и я надеялся, что, написав этот вопрос, я найду ответ. Увы, нет.

добавление - запуск докера

Мой docker run выглядит так, немного упрощенно (${IP} - IP-адрес хост-машины).

docker run --rm --name elasticsearch \
  -p ${IP}:9200:9200 -p ${IP}:9300:9300 \
  --network host \
  my-elasticsearch:7.2.0 \
  /usr/local/bin/start-clustered-es.sh 

Каждый контейнер работает на отдельной машине. start-clustered-es.sh просто пишет elasticsearch.yml файл, как описано выше, поэтому каждый узел запускается с одинаковой конфигурацией. После записи файла он вызывает сценарий запуска базового контейнера с exec /usr/local/bin/docker-entrypoint.sh eswrapper

Я попытался --network host в качестве конфигурации используется IP-адрес хост-машины. Изнутри контейнеров я могу добраться до порта 9200/9300 других машин, поэтому он не кажется это проблема сети.

Любые указатели приветствуются ...

Одна идея - ограничить transport.profiles.default.port он же transport.port или установить -p на докере запустить полный диапазон по умолчанию 9300-9400.

Согласно документации на https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-transport.html transport.profiles.default.port по умолчанию 9300-9400.

Дальше discovery.seed_hosts перечисляет, что порт относится к transport.profiles.default.port. https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-discovery-settings.html

Надеюсь, это сообщение поможет, поскольку это уже было некоторое время назад, когда я сформировал последний кластер с использованием версии 6.x, и мне потребовались некоторые discovery.zen значения с помощью docker.