Je veux exécuter 2 instances d'ElasticSeach sur 2 hôtes différents. J'ai créé ma propre image docker basée sur Ubuntu 14.04 et la version 1.3.2 d'elasticsearch. Si j'exécute le conteneur de 2 ES sur 1 hôte, chaque instance voit l'autre et peut communiquer, mais lorsque j'exécute 2 instances d'ES sur 2 hôtes différents, cela n'a pas fonctionné. Le port 9300 du conteneur est lié au port de l'hôte 9300.
Ma question est: est-il possible de créer un cluster ES avec ma configuration?
Cordialement, Lucas Rival
Utiliser docker-compose est beaucoup plus facile que de l'exécuter manuellement en ligne de commande:
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
J'ai pu faire fonctionner le clustering en utilisant la monodiffusion sur deux hôtes Docker. Il se trouve que j'utilise le ehazlett/elasticsearch
image, mais je ne pense pas que cela ait autant d'importance. Le bit vraiment important semble être le réglage du network.publish_Host
définissant une adresse IP publique ou routable sur son hôte Docker.
eth0: 192.168.1.10
Docker version 1.4.1, build 5bc2ff8/1.4.1
eth0: 192.168.1.20
Docker version 1.4.1, build 5bc2ff8/1.4.1
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
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
Vous devriez être en mesure de communiquer les deux conteneurs s'exécutant sur des hôtes différents dans la mesure où les machines hôtes sont accessibles entre elles dans les ports nécessaires. Je pense que votre problème est que vous essayez d'utiliser la découverte de multidiffusion ElasticSearch, mais si c'est le cas, vous devez également exposer le port 54328 des conteneurs. Si cela ne fonctionne pas, vous pouvez également essayer de configurer ElasticSearch à l'aide de la monodiffusion, en définissant correctement les adresses IP des machines dans votre elasticsearch.yml.