読者です 読者をやめる 読者になる 読者になる

Carpe Diem

備忘録。https://github.com/jun06t

Elasticsearch のクラスタを構築する

Elasticsearch

概要

Vagrant上にElasticsearchのクラスタを構築してfailoverを検証してみます。

環境

以下の3台でクラスタを構築します。

ノード IP
web1 192.168.33.10
web2 192.168.33.11
web3 192.168.33.12

Vagrantの用意

以下のコードをVagrantfileに追加して起動してください。

  config.vm.define :web1 do |web|
    web.vm.network :private_network, ip: "192.168.33.10"
    web.vm.provider "virtualbox" do |vb|
      vb.memory = "1048"
    end
  end

  config.vm.define :web2 do |web|
    web.vm.network :private_network, ip: "192.168.33.11"
    web.vm.provider "virtualbox" do |vb|
      vb.memory = "1048"
    end
  end

  config.vm.define :web3 do |web|
    web.vm.network :private_network, ip: "192.168.33.12"
    web.vm.provider "virtualbox" do |vb|
      vb.memory = "1048"
    end
  end

Elasticsearchのインストール

ElasticSearch のインストールを参考に各サーバにインストールしてください。

複数台のElasticsearchを必要とするので上記のインストール作業が面倒な方は以下のansibleのコードを使ってください。

jun06t/ansible-examples

設定

cluster.nameを揃える

Elasticsearchはクラスタ名を揃えるだけで自動でクラスタを構築してくれます。
今回testというクラスタ名で構築します。/etc/elasticsearch/elasticsearch.ymlcluster.nameをアンコメントして値を変更してください。

# Cluster name identifies your cluster for auto-discovery. If you're running
# multiple clusters on the same network, make sure you're using unique names.
#
cluster.name: test

シャード、レプリカ数を設定する

/etc/elasticsearch/elasticsearch.ymlで以下のように設定をアンコメントして値を変更してください。

# Set the number of shards (splits) of an index (5 by default):
#
index.number_of_shards: 5

# Set the number of replicas (additional copies) of an index (1 by default):
#
index.number_of_replicas: 1

vagrantの場合NICを指定する

先ほどのcluster.nameが同一ネットワーク上で一致していればElasticsearchは自動でクラスタを構築してくれます。しかしvagrantの場合、同一ネットワークで使用しているNICeth1であるため、そちらを指定しないと別ネットワークにあるとみなされます。
なので使用するNICeth1にするように/etc/elasticsearch/elasticsearch.ymlで以下のように設定をアンコメントして値を変更してください。

# Set both 'bind_host' and 'publish_host':
#
network.host: '_eth1:ipv4_'

設定が完了したら各サーバのElasticsearchを再起動してください。

$ sudo service elasticsearch restart

動作確認

初期状態

headプラグインを使用して動作を確認します。

起動時はこうなっているはずです。 f:id:quoll00:20150222143204p:plain

3つのノードがありますね。

データの投入

ダミーデータを投入します。

stormpython/Elasticsearch-datasetsでデータが提供されていたので使わせていただきます。

$ wget https://github.com/stormpython/Elasticsearch-datasets/archive/master.zip
$ unzip master.zip
$ cd Elasticsearch-datasets-master/
$ curl -XPOST 192.168.33.10:9200/test_index
$ curl -XPUT 192.168.33.10:9200/test_index/2013/_mapping -d @mappings/nfl_mapping.json
$ curl -XPOST 192.168.33.10:9200/test_index/2013/_bulk --data-binary @datasets/nfl_2013.json > /dev/null

確認すると f:id:quoll00:20150222143217p:plain

シャード5つ・レプリカ1つなので、プライマリ・レプリカ合わせて計10のシャードがあります。

サーバを1台落としてfailoverの確認

サービスを落とすだけでもいいですが、物理障害が起きたと仮定してvagrant自体落としてみます

$ vagrant halt web3

確認してみると f:id:quoll00:20150222143400p:plain

シャードが再配置されています。レプリカを1つに設定しているのでステータスもグリーンのままです。
プライマリ用1つ・レプリカ用1つの最低2つのノードが必要ですが、まだ2台あるから大丈夫ということです。

落としたサーバを復帰させて、シャードが再配置されることを確認

落としたサービスを戻してデータが再度レプリケーションを組んでくれるか確認します。

$ vagrant up web3

確認してみると f:id:quoll00:20150222143511p:plain

3つのノードに再配置されました。

ソース