概要
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のコードを使ってください。
設定
cluster.nameを揃える
Elasticsearchはクラスタ名を揃えるだけで自動でクラスタを構築してくれます。
今回test
というクラスタ名で構築します。/etc/elasticsearch/elasticsearch.yml
のcluster.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の場合、同一ネットワークで使用しているNICはeth1
であるため、そちらを指定しないと別ネットワークにあるとみなされます。
なので使用するNICをeth1
にするように/etc/elasticsearch/elasticsearch.yml
で以下のように設定をアンコメントして値を変更してください。
# Set both 'bind_host' and 'publish_host': # network.host: '_eth1:ipv4_'
設定が完了したら各サーバのElasticsearchを再起動してください。
$ sudo service elasticsearch restart
動作確認
初期状態
headプラグインを使用して動作を確認します。
起動時はこうなっているはずです。
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
確認すると
シャード5つ・レプリカ1つなので、プライマリ・レプリカ合わせて計10のシャードがあります。
サーバを1台落としてfailoverの確認
サービスを落とすだけでもいいですが、物理障害が起きたと仮定してvagrant自体落としてみます
$ vagrant halt web3
確認してみると
シャードが再配置されています。レプリカを1つに設定しているのでステータスもグリーンのままです。
プライマリ用1つ・レプリカ用1つの最低2つのノードが必要ですが、まだ2台あるから大丈夫ということです。
落としたサーバを復帰させて、シャードが再配置されることを確認
落としたサービスを戻してデータが再度レプリケーションを組んでくれるか確認します。
$ vagrant up web3
確認してみると
3つのノードに再配置されました。