compose - Elasticsearch en clúster contenedor de ventana acoplable
elasticsearch docker-compose (3)
Quiero ejecutar 2 instancias de ElasticSeach en 2 hosts diferentes. Construí mi propia imagen docker basada en Ubuntu 14.04 y la versión 1.3.2 de elasticsearch. Si ejecuto el contenedor 2 ES en 1 host, cada instancia ve la otra y se puede comunicar, pero cuando ejecuto 2 instancias de ES en 2 host diferentes, no funcionó. El puerto 9300 del contenedor está vinculado al puerto del host 9300.
Mi pregunta es: ¿es posible crear un clúster de ES con mi configuración?
Saludos cordiales, Lucas Rival
Debería poder comunicar los dos contenedores que se ejecutan en hosts diferentes en la medida en que se pueda acceder a las máquinas host entre ellos en los puertos necesarios. Creo que su problema es que está tratando de usar el descubrimiento de multidifusión de ElasticSearch, pero si luego necesita exponer también el puerto 54328 de los contenedores. Si no funciona, también puede intentar configurar ElasticSearch mediante unicast, configurando adecuadamente las IP de las máquinas en su elasticsearch.yml.
Usar docker-compose es mucho más fácil que ejecutarlo manualmente en la línea de comandos:
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
Pude hacer que el clúster funcionara utilizando unicast en dos hosts de docker. Simplemente estoy usando la imagen de ehazlett/elasticsearch
, pero no creo que esto deba importar tanto. El bit realmente importante parece ser establecer la configuración de network.publish_host
en una IP pública o enrutable en su host docker.
Configuración
docker-host-01
eth0: 192.168.1.10
Docker version 1.4.1, build 5bc2ff8/1.4.1
docker-host-02
eth0: 192.168.1.20
Docker version 1.4.1, build 5bc2ff8/1.4.1
Construyendo el Clúster
En Docker Host 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
En Docker Host 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