Контейнер ES Docker не присоединяется к другому контейнеру docker с тем же именем кластера

#docker #elasticsearch #docker-compose #discovery

#docker #elasticsearch #docker-compose #обнаружение

Вопрос:

Я столкнулся со странной проблемой из-за контейнеров docker ES, ранее я запускал автономный ES 7.10 в контейнере docker на хост-порту 9200 (внутренние порты docker такие же, как стандартные порты 9200 и 9300 ES), и в то же время я запустил три контейнера docker ES (с другой младшей версиейиз 7) (они должны были сформировать кластер, назовем его docker-es-cluster).

Эти три контейнера ES docker использовали порт хоста 9200, 9201,9202, поэтому контейнер ES из кластера, который использовал 9200, не мог запуститься из-за конфликта портов (ES 7.10) Контейнер ES.

Итак, я остановил автономный контейнер 7.10 docker и снова перезапустил контейнер 3 cluster ES, но теперь мои другие 2 сервера ES, которые прослушивали 9201, 9202, не запускаются, и их журналы содержат следующие ПРЕДУПРЕЖДЕНИЯ:

{«type»: «server», «timestamp»: «2020-12-14T15:56:57,651 0000», «level»: «WARN», «component»: «o.e.c.c.ClusterFormationFailureHelper», «cluster.name «: «докер-кластер», «node.name «: «es2», «сообщение»: «мастер еще не обнаружен, этот узел ранее не присоединялся к кластеру с начальной загрузкой (версия 7 ), и этот узел должен обнаружить узлы, отвечающие требованиям master [] для начальной загрузки кластера: hfrom от поставщиков хостов и [{es2}{eBtsR2XgRVWqPdUAP_n_Ew}{tZ9FRAbPTAmZZle_5MaVoA}{172.18.0.3}{172.18.0.3:9300}{dim}{ml.machine_memory=2084032512 , xpack.installed=true, ml.max_open_jobs=20}] из последнего известного состояния кластера; термин узла 0, последняя принятая версия 0 в термине 0» }

После этого я остановил весь контейнер docker, удалил все изображения docker, выполнил обрезку docker, перезапустил систему, но проблема не устраняется, даже когда я начинаю с чистого состояния, кажется, что состояние кластера испорчено для 2 контейнеров ES, и оно не исправляется даже после перезапуска контейнеров docker.

Мой docker-compose для контейнеров ES выглядит следующим образом, и я не использую привязку тома

  es2:
    image: "docker.elastic.co/elasticsearch/elasticsearch:<es-version>"
    container_name: 2
    environment:
    - node.name=2
    - cluster.name=docker-cluster
    - cluster.initial_master_nodes=1,2,3
    - discovery.seed_hosts=1,3
    - ES_JAVA_OPTS=-Xms1g -Xmx1g
    ports:
    - "9201:9200"
    networks:
    - localenv
 

Ответ №1:

elasticsearch в новых версиях (я думаю, 7.8 выше) имеет очень строгие правила присоединения и отсоединения узлов от кластеров. вы не можете легко отсоединить мастер или даже узлы данных. Я рекомендую использовать инструмент elasticsearch-node: https://www.elastic.co/guide/en/elasticsearch/reference/current/node-tool.html

самый простой способ — использовать команду ниже на всех узлах:

 elasticsearch-node detach-cluster
 

Комментарии:

1. Спасибо за ваш ответ, как запустить его для контейнеров docker, которые остановлены, а мои контейнеры docker являются эфемерными?

2. @ElasticsearchNinja вы пробовали docker exec для запуска команды в контейнере?

3. вы правы насчет эфемерности. но состояние кластера сохраняется в пути данных каждого узла.

4. да, но поскольку мой docker conatinar остановлен, я не могу выполнить docker exec и другой, который запущен, я вошел в этот docker conatiner, но эта команда, которую вы предоставили, не может быть запущена при запуске ES

Ответ №2:

Я исправил проблему, перейдя к опции устранения неполадок docker-desktop и выполнив опцию очистки / очистки, как показано на снимке экрана ниже.

введите описание изображения здесь