Elasticsearch в кластере контейнеров докеров
Я хочу запустить 2 экземпляра ElasticSeach на 2 разных хостах. Я создал собственное изображение докеров, основанное на Ubuntu 14.04 и 1.3.2 версии elasticsearch. Если я запускаю контейнер 2 ES на 1 хост, каждый экземпляр видит другой и может связываться, но когда я запускаю 2 экземпляра ES на 2-х разных хостах, он не работает. Порт 9300 контейнера связывается с хостом порта 9300.
Мой вопрос: возможно ли создать кластер ES с моей конфигурацией?
С уважением,
Lucas Rival
Ответы
Ответ 1
Мне удалось получить работу кластеризации, используя одноадресную рассылку через два узла докеров. Я просто использую образ ehazlett/elasticsearch
, но я не думаю, что это должно иметь большое значение. Кажется, что действительно важный бит устанавливает параметр network.publish_host
для общедоступного или маршрутизируемого IP-узла своего докера.
Конфигурация
докер-хост-01
eth0: 192.168.1.10
Docker version 1.4.1, build 5bc2ff8/1.4.1
докер-хост-02
eth0: 192.168.1.20
Docker version 1.4.1, build 5bc2ff8/1.4.1
Создание кластера
На докерном хосте 01
docker run -d \
-p 9200:9200 \
-p 9300:9300 \
ehazlett/elasticsearch \
--cluster.name=unicast \
--network.publish_host=192.168.1.10 \
--discovery.zen.ping.multicast.enabled=false \
--discovery.zen.ping.unicast.hosts=192.168.1.20 \
--discovery.zen.ping.timeout=3s \
--discovery.zen.minimum_master_nodes=1
На докерном хосте 02
docker run -d \
-p 9200:9200 \
-p 9300:9300 \
ehazlett/elasticsearch \
--cluster.name=unicast \
--network.publish_host=192.168.1.20 \
--discovery.zen.ping.multicast.enabled=false \
--discovery.zen.ping.unicast.hosts=192.168.1.10 \
--discovery.zen.ping.timeout=3s \
--discovery.zen.minimum_master_nodes=1
Ответ 2
Использование docker-compose намного проще, чем запустить его вручную в командной строке:
elasticsearch_master:
image: elasticsearch:latest
command: "elasticsearch -Des.cluster.name=workagram -Des.node.master=true -Des.node.data=false"
environment:
- ES_HEAP_SIZE=512m
ports:
- "9200:9200"
- "9300:9300"
elasticsearch1:
image: elasticsearch:latest
command: "elasticsearch -Des.cluster.name=workagram -Des.discovery.zen.ping.unicast.hosts=elasticsearch_master"
links:
- elasticsearch_master
volumes:
- "/opt/elasticsearch/data"
environment:
- ES_HEAP_SIZE=512m
elasticsearch2:
image: elasticsearch:latest
command: "elasticsearch -Des.cluster.name=workagram -Des.discovery.zen.ping.unicast.hosts=elasticsearch_master"
links:
- elasticsearch_master
volumes:
- "/opt/elasticsearch/data"
environment:
- ES_HEAP_SIZE=512m
Ответ 3
Вы должны иметь возможность связывать два контейнера, работающие на разных хостах, до тех пор, пока хост-компьютеры не будут доступны между ними в необходимых портах. Я думаю, ваша проблема в том, что вы пытаетесь использовать многоадресное обнаружение ElasticSearch, но если вам нужно также открыть порт 54328 из контейнеров. Если он не работает, вы также можете попытаться настроить ElasticSearch с помощью одноадресной рассылки, правильно настроив IP-адрес компьютеров в вашем elasticsearch.yml.