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"
というような設定になっています。
ここは、それぞれの環境に合わせて変える必要があります。
さいごに
慣れてしまえば簡単にできそうです。