web-dev-qa-db-fra.com

Elasticsearch dans le cluster de conteneurs Docker

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

21
rival lucas

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
18
Alex Fernandez

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.

Configuration


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

Construire le cluster


Sur l'hôte Docker 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

Sur 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
18
BrandoCorp

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.

3
Javier Cortejoso