Kibana6.6.0 リリース記念 DokcerのKibanaから接続するElasticsearchを複数指定する

はじめに

Elastic Stack 6.6.0がリリースされました。

www.elastic.co

これまでKibanaでは単一のElasticsearchの場所しか指定できなかったところが、複数指定できるようになった、というアップデートが含まれているので、 これを試してみます。

確認環境

例によってDockerで確認します。 複数指定するため、Elasticsearchのノードを2つ、Kibanaを1つ、コンテナで用意することにします。

docker-compose.ymlは以下の通りです。 今回は、Kibanaから複数Elasticsearchに接続することを確認するためだけの環境のため、メモリを激しくケチっています。

version: '2'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:6.6.0
    container_name: elasticsearch
    environment:
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - esdata660-1:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - esnet

  elasticsearch-2:
    image: docker.elastic.co/elasticsearch/elasticsearch:6.6.0
    container_name: elasticsearch-2
    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:
      - esdata660-2:/usr/share/elasticsearch/data
    networks:
      - esnet

  kibana:
    image: docker.elastic.co/kibana/kibana:6.6.0
    container_name: kibana
    ports:
      - 5601:5601
    depends_on:
      - elasticsearch
    volumes:
      - ./custom/kibana.yml:/usr/share/kibana/config/kibana.yml
    links:
      - elasticsearch:elasticsearch
      - elasticsearch-2:elasticsearch-2
    networks:
      - esnet

volumes:
  esdata660-1:
    driver: local
  esdata660-2:
    driver: local

networks:
  esnet:

ノーマル設定の確認

https://www.elastic.co/guide/en/kibana/6.6/release-highlights-6.6.0.html#_support_for_multiple_elasticsearch_nodes

ここでは、このように書かれています。

Simply set elasticsearch.host in your kibana.yml file to the URLs of the Elasticsearch nodes you want to use.

しかし、Kibanaのdockerイメージの中に含まれているkibana.ymlでは、elasticsearch.urlの方が指定されていました。

---
# Default Kibana configuration from kibana-docker.

server.name: kibana
server.host: "0"
elasticsearch.url: http://elasticsearch:9200
xpack.monitoring.ui.container.elasticsearch.enabled: true

urlを指定しているところで、elasticsearch.hostを指定するように、書き換えることにします。

変更

www.elastic.co

ここで、設定項目を確認しますと、elasticsearch.hostsという項目が見つかります。 Releaseの方ではelasticsearch.hostと記載されており、hostsとどっちが正しいの?と、一瞬疑いましたが、settingsの方を信じて進むことにしました。

f:id:tsgkdt:20190131002600p:plain
elasticsearch.hosts

hostsとなっていることから、複数指定が可能そうと読み取れます。 これをkibana.ymlに反映させたものがこちら。

---
# Default Kibana configuration from kibana-docker.

server.name: kibana
server.host: "0"
elasticsearch.hosts: 
  - http://elasticsearch:9200
  - http://elasticsearch-2:9200

xpack.monitoring.ui.container.elasticsearch.enabled: true

あとは、この設定ファイルをvolumesでマウントして渡してやると良いです

ノードを止めて確認

テストデータを入れ、それぞれのノードにデータが格納されるようにしました。

elasticsearchでアクセスできる方のノードをdocker stopで止めてみます。 Monitoringの画面から確認すると、Offline表示になっています。

f:id:tsgkdt:20190131003311p:plain
node stop

この状態で、Discoverで確認すると、欠損なくデータが検索できることが確認できました。

f:id:tsgkdt:20190131003536p:plain

感想

今回はhostsを列挙する形で書きました。

elasticsearch.hostsの説明では、以下のようになっています。

All nodes listed here must be on the same cluster.

ここに記載するノードは同じクラスタ上にあるべき、と。 *1

いくつも列挙するのが面倒だと思う場合は、Releaseの中にあった以下の記述の方、automatically discover other nodesを使う方が、より容易かもしれません。

You can also configure Kibana to automatically discover other nodes in the cluster (elasticsearch.sniffOnStart) or on an interval (elasticsearch.sniffInterval).

これはまだ試せてませんが、そのうちやれたら良いなぁ。

*1:注1:大谷さんのご指摘により記述を訂正