#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