Elasticsearchのクラスタを作る方法

目次

概要

Elasticsearchをふたつ使ったクラスタを作ったので、その時にやったことをここに書きます。

私の環境では、Kubernetesで2つのElasticsearchを動かしてクラスタを構成したので、サーバに直接Elasticsearchをインストールしている場合は、この設定では動かない可能性があります。

環境

  • Elasticsearch 6.2.2

クラスタ

Elasticsearchのクラスタを作ることで、クエリの応答を早くできたり冗長化をすることができます。

クラスタの組み方として、Dockerでは設定したい値を環境変数に代入して設定することができるので、この方法を使います。

設定

最低限設定する値は次のものです。

cluster.name # クラスタ名
node.name # ノード名
network.host # バインドアドレス
discovery.zen.ping.unicast.hosts # 全ノードのIP
discovery.zen.minimum_master_nodes # マスターノードの数

クラスタを構成するElasticsearchのことをノードと呼びます。

ここでは、まずクラスタの名前をcluster、ノード名をそれぞれnode1``node2とします。

マスターノードは、データの書き込みを受け付けるノードの数です。全てのノードはデータの読み取りができますが、書き込みができるのはマスターノードのみです。ちなみに、マスターノード以外にデータの書き込みのリクエストをした場合、自動的にマスターノードにそのリクエストが送られます。

マスターノードの数は、(ノードの数 / 2) + 1で計算します。結果が小数になった場合は切り捨てます。今回は、2つのノードがあるので、(2 / 2) + 1 = 2となり、マスターノードの数は2となります。

このマスターノードの計算方法から分かるように、Elasticsearchがふたつのクラスタの場合、どちらもマスターノードとなるため冗長性は確保できません。冗長化をしたい場合は、最低限みっつのElasticsearchを用意する必要があります。

ノードのIPは、ホスト名を指定しても良いので、KubernetesのServicesとして作成した値を設定します。

具体的な設定として、それぞれのElasticsearchを配置するDeploymentのymlファイルの環境変数の設定の抜粋を載せておきます。

env:
  - name: cluster.name
    value: cluster
  - name: node.name
    value: node1
  - name: network.host
    value: "0.0.0.0"
  - name: discovery.zen.ping.unicast.hosts
    value: "elasticsearch1, elasticsearch2"
  - name: discovery.zen.minimum_master_nodes
    value: "2"
env:
  - name: cluster.name
    value: cluster
  - name: node.name
    value: node2
  - name: network.host
    value: "0.0.0.0"
  - name: discovery.zen.ping.unicast.hosts
    value: "elasticsearch1, elasticsearch2"
  - name: discovery.zen.minimum_master_nodes
    value: "2"

2つともほとんど設定は同じです。唯一違うのはノード名で、それぞれnode1とnode2を指定しています。

discovery.zen.ping.unicast.hostsには、それぞれのElasticsearchのIPまたはホスト名を書くのですが、書き方として、カンマで区切って書きます。

私の環境では、それぞれのElasticsearchのホスト名はelasticsearch1``elasticsearch2となっているので、"elasticsearch1, elasticsearch2"というような設定になっています。

ここは、それぞれの環境に合わせて変える必要があります。

さいごに

慣れてしまえば簡単にできそうです。