Elasticsearch6.xで設定していたdiscovery.zen.ping.unicast.hostsは7.xだとdeprecationなのでdiscovery.seed_hostsとcluster.initial_master_nodesを設定する

Elasticsearchの勉強のために以下の書籍を読んで、ローカルでDockerを使ってElasticsearchを複数ノード起動して遊んでいました。この書籍ではElasticsearchは6.x系が前提です。


6.x系でノードをクラスターに参加させる設定については、以下の記事を読んでdiscovery.zen.ping.unicast.hostsにマスターノードを設定していました。

www.elastic.co



今まで6.x系しか触っていなかったため、最新のElasticsearch(7.6.2)のDockerイメージで遊んでみようと思ってElasticsearch6.x系のdocker-compose.ymlを流用して起動してみたところ、discovery.zen.ping.unicast.hostsはdeprecation warningが出ていました。

{
  "type": "deprecation",
  "timestamp": "2020-05-12T14:05:43,936Z",
  "level": "WARN",
  "component": "o.e.d.c.s.Settings",
  "cluster.name": "play-cluster",
  "node.name": "es_1",
  "message": "[discovery.zen.ping.unicast.hosts] setting was deprecated in Elasticsearch and will be removed in a future release! See the breaking changes documentation for the next major version." 
}


最新版(7.x系から?)はdiscovery.zen.ping.unicast.hostsではない設定値でクラスター参加(ディスカバリー)設定をする必要があるようです。


色々調べてみると、以下の「Elasticsearchの重要な構成」という公式のセットアップガイドが参考になりそうです。

www.elastic.co


discovery.seed_hostscluster.initial_master_nodesの内容をしっかりとは理解していませんが、とりあえず以下ののdocker-compose.ymlで起動しました。ベースイメージはdocker build -t es_7_6_2 .でビルドしておきます。

# Dockerfile 
FROM docker.elastic.co/elasticsearch/elasticsearch:7.6.2
RUN bin/elasticsearch-plugin install analysis-kuromoji
# docker-compose.yml

version: '3.7'
services:
  es_1:
    image: es_7_6_2
    container_name: es_1
    environment:
      - node.name=es_1
      - cluster.name=play-cluster
      - discovery.seed_hosts=es_1 # 重要
      - cluster.initial_master_nodes=es_1 # 重要
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - "9200:9200"
    volumes:
      - ./es_data_1:/usr/share/elasticsearch/data
    networks:
      - es_net

  es_2:
    image: es_7_6_2
    container_name: es_2
    environment:
      - node.name=es_2
      - cluster.name=play-cluster
      - discovery.seed_hosts=es_1 # 重要
      - cluster.initial_master_nodes=es_1 # 重要
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - ./es_data_2:/usr/share/elasticsearch/data
    networks:
      - es_net

  es_3:
    image: es_7_6_2
    container_name: es_3
    environment:
      - node.name=es_3
      - cluster.name=play-cluster
      - discovery.seed_hosts=es_1 # 重要
      - cluster.initial_master_nodes=es_1 # 重要
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - ./es_data_3:/usr/share/elasticsearch/data
    networks:
      - es_net

  kibana:
    image: docker.elastic.co/kibana/kibana:7.6.2
    container_name: kibana
    environment:
      SERVER_NAME: localhost:5601
      ELASTICSEARCH_HOSTS: http://es_1:9200 # 重要
    ports:
      - "5601:5601"
    depends_on:
      - es_1
    networks:
      - es_net

networks:
  es_net:


ちなみに、KibanaのELASTICSEARCH_HOSTという環境変数は、6.x系ではELASTICSEARCH_URLでしたが・・・これも変わったみたいです。

www.elastic.co


KibanaのDevToolでGET /_cat/nodes?vを実行すると、以下のように3ノード表示されました。意図通りes_1がマスターノードとなっています。

※ローカルで確認するためだけが目的なのでマスターノードは1台だけにしています。

ip          heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.0.4           33          71   5    2.84    2.15     1.72 dilm      -      es_2
192.168.0.3           32          71   5    2.84    2.15     1.72 dilm      -      es_3
192.168.0.2           28          71   5    2.84    2.15     1.72 dilm      *      es_1


・・・と思ったら、docker-compose downdocker-composeupで起動して直してみたところ、今度はes_3がマスターノードになっていました。

やはり、ちゃんと設定値を理解しないと意図した通りに動かないので、discovery.seed_hostscluster.initial_master_nodesについては今後のもっと詳しく調査しようと思います。

今回はとりあえず最新バージョンで起動できたのでOK・・・



Elasticsearchはバージョンが変わると結構仕様が変わっていますが、web上の記事は古い情報が混ざっていて混乱する時があります。

困った時は公式ドキュメントにあたるのが良いですね、全て英語ですが・・・・。

※本記事で使用しているDockerfile/docker-compose.ymlは以下のリポジトリにあります。

github.com