一つのサーバに2つのClusterを作る方法

現在、自分はElasticSearchを使うRailsアプリケーションを開発しています。
Mac内部にdocker_composeを使いdocker.elastic.co/elasticsearch/elasticsearch:6.8.0のイメージを使用して、環境を構築しています。

その際rspecでテストを行う為にdevelop環境とは別のElasticSearchを用意したくなりました。

自分はあまりElasticSearchに詳しくない為、間違っている可能性はあるのですが、この場合はtest用とdevelopment用の二つのClusterを建てれば良いはず、と考察しました。
しかしどの様なconfigを掛けば同一サーバに二つのClusterを用意できるかわかりませんでした。

そこで質問なのですがどの様なconfigを書けば良いでしょうか?
また、そもそも私の選択した手法は合っているでしょうか?

Elasticsearchの、というよりはdockerの知識よりになるかと思いますが、
Elasticsearchのdockerで動かす際のマニュアルの記載が参考になるかと思います。

https://www.elastic.co/guide/en/elasticsearch/reference/6.8/docker.html

version: '2.2'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:6.8.1
    container_name: elasticsearch
    environment:
      - cluster.name=docker-cluster  ←クラスタ名の指定箇所。

(中略)
  elasticsearch2:
    image: docker.elastic.co/elasticsearch/elasticsearch:6.8.1
    container_name: elasticsearch2
    environment:
  (中略)
      - "discovery.zen.ping.unicast.hosts=elasticsearch"  ←docker-clusterに参加するため指定

異なるクラスタを、ということでしたらクラスタ名を変え、そしてunicast先も変えた設定を入れれば良いです。

仮にdocker-clusterは2台ノード、docker-cluster2は3ノード構成でつくる例です。
ネットワークも念のため分けておきました。

node 所属するクラスタ network
elasticsearch docker-cluster esnet
elasticsearch2 docker-cluster esnet
elasticsearch3 docker-cluster2 esnet2
elasticsearch4 docker-cluster2 esnet2
elasticsearch5 docker-cluster2 esnet2

このときの設定がこちらになりました。

version: '2.2'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:6.8.1
    container_name: elasticsearch
    environment:
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - esdata1:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - esnet
  elasticsearch2:
    image: docker.elastic.co/elasticsearch/elasticsearch:6.8.1
    container_name: elasticsearch2
    environment:
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - "discovery.zen.ping.unicast.hosts=elasticsearch"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - esdata2:/usr/share/elasticsearch/data
    networks:
      - esnet
  elasticsearch3:
    image: docker.elastic.co/elasticsearch/elasticsearch:6.8.1
    container_name: elasticsearch3
    environment:
      - cluster.name=docker-cluster2
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - esdata3:/usr/share/elasticsearch/data
    ports:
      - 9201:9200
    networks:
      - esnet2
  elasticsearch4:
    image: docker.elastic.co/elasticsearch/elasticsearch:6.8.1
    container_name: elasticsearch4
    environment:
      - cluster.name=docker-cluster2
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - "discovery.zen.ping.unicast.hosts=elasticsearch3"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - esdata4:/usr/share/elasticsearch/data
    networks:
      - esnet2
  elasticsearch5:
    image: docker.elastic.co/elasticsearch/elasticsearch:6.8.1
    container_name: elasticsearch5
    environment:
      - cluster.name=docker-cluster2
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - "discovery.zen.ping.unicast.hosts=elasticsearch3"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - esdata5:/usr/share/elasticsearch/data
    networks:
      - esnet2


volumes:
  esdata1:
    driver: local
  esdata2:
    driver: local
  esdata3:
    driver: local
  esdata4:
    driver: local
  esdata5:
    driver: local

networks:
  esnet:
  esnet2:

_cat/healthコマンドでクラスタ情報を確認すると、docker-clusterに2台、docker-clusterに3台と分けて作れていることが確認できました。

現実的にはMacで動作させられるとのことなので、ホストとのポートマッピングがあるかと思います。

  • 9200:9200
  • 9201:9200
    と、実際にはポートをわけてアクセス先を分けることになるのではないでしょうか?

ホストにマッピングして使うような場合ならば、クラスタ名を分けずとも、ポートで分けられるかもしれません。

http://localhost:9200/ ←本番用
http://localhost:9201/ ←テスト用

のイメージです。

参考になりましたら、幸いです。

tsgkdtさん、詳細なご返答ありがとうございます。
cluster.nameを別々のを指定して、その上で9200のポートに対して別々のポートを割り振ればよかったんですね。
ありがとうございます、理解できました。

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.