akishin999の日記

調べた事などを書いて行きます。

elasticsearch で clustering を試してみる

elasticsearch だと簡単に clustering が出来るということなので、実際に試してみました。
環境は CentOS 6.3、elasticsearch 0.20.5 です。

まずはダウンロードして展開します。

# wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-0.20.5.tar.gz
# tar xzf elasticsearch-0.20.5.tar.gz

elasticsearch の準備はこれだけ。

展開したら master ノードとなる最初のノードを起動します。
以下のように引数「-Des.cluster.name」にクラスタの名前を指定して起動してください。

# ./elasticsearch-0.20.5/bin/elasticsearch -f -Des.cluster.name=mycluster &

コンソールに以下のようなログが表示されます。
途中「new_master」と表示されており、このノードが master ノードとなった事がわかります。

[2013-03-15 22:13:09,995][INFO ][node                     ] [D'Ken] {0.20.5}[1933]: initializing ...
[2013-03-15 22:13:09,999][INFO ][plugins                  ] [D'Ken] loaded [], sites []
[2013-03-15 22:13:12,122][INFO ][node                     ] [D'Ken] {0.20.5}[1933]: initialized
[2013-03-15 22:13:12,122][INFO ][node                     ] [D'Ken] {0.20.5}[1933]: starting ...
[2013-03-15 22:13:12,192][INFO ][transport                ] [D'Ken] bound_address {inet[/0:0:0:0:0:0:0:0:9300]}, publish_address {inet[/192.168.81.140:9300]}
[2013-03-15 22:13:15,214][INFO ][cluster.service          ] [D'Ken] new_master [D'Ken][cSaezczjS3WcMyjkoS4Lsg][inet[/192.168.81.140:9300]], reason: zen-disco-join (elected_as_master)
[2013-03-15 22:13:15,236][INFO ][discovery                ] [D'Ken] mycluster/cSaezczjS3WcMyjkoS4Lsg
[2013-03-15 22:13:15,257][INFO ][http                     ] [D'Ken] bound_address {inet[/0:0:0:0:0:0:0:0:9200]}, publish_address {inet[/192.168.81.140:9200]}
[2013-03-15 22:13:15,257][INFO ][node                     ] [D'Ken] {0.20.5}[1933]: started
[2013-03-15 22:13:15,281][INFO ][gateway                  ] [D'Ken] recovered [0] indices into cluster_state

elasticsearch はデフォルトで 9200 - 9300 の範囲のポートを自動で割り当ててくれるので、実はこの後も同じコマンドでノードを起動するだけです。
二台目のノードを起動してみます。

# ./elasticsearch-0.20.5/bin/elasticsearch -f -Des.cluster.name=mycluster &

コンソールのログを見ると、 master ノードを発見し、その配下にノードが追加された事が分かります。

[2013-03-15 22:13:29,150][INFO ][node                     ] [Namor the Sub-Mariner] {0.20.5}[1969]: initializing ...
[2013-03-15 22:13:29,154][INFO ][plugins                  ] [Namor the Sub-Mariner] loaded [], sites []
[2013-03-15 22:13:31,253][INFO ][node                     ] [Namor the Sub-Mariner] {0.20.5}[1969]: initialized
[2013-03-15 22:13:31,253][INFO ][node                     ] [Namor the Sub-Mariner] {0.20.5}[1969]: starting ...
[2013-03-15 22:13:31,321][INFO ][transport                ] [Namor the Sub-Mariner] bound_address {inet[/0:0:0:0:0:0:0:0:9301]}, publish_address {inet[/192.168.81.140:9301]}
[2013-03-15 22:13:34,372][INFO ][cluster.service          ] [D'Ken] added {[Namor the Sub-Mariner][lsAu6NYBSHKPEygA5rpRxA][inet[/192.168.81.140:9301]],}, reason: zen-disco-receive(join from node[[Namor the Sub-Mariner][lsAu6NYBSHKPEygA5rpRxA][inet[/192.168.81.140:9301]]])
[2013-03-15 22:13:34,382][INFO ][cluster.service          ] [Namor the Sub-Mariner] detected_master [D'Ken][cSaezczjS3WcMyjkoS4Lsg][inet[/192.168.81.140:9300]], added {[D'Ken][cSaezczjS3WcMyjkoS4Lsg][inet[/192.168.81.140:9300]],}, reason: zen-disco-receive(from master [[D'Ken][cSaezczjS3WcMyjkoS4Lsg][inet[/192.168.81.140:9300]]])
[2013-03-15 22:13:34,434][INFO ][discovery                ] [Namor the Sub-Mariner] mycluster/lsAu6NYBSHKPEygA5rpRxA
[2013-03-15 22:13:34,437][INFO ][http                     ] [Namor the Sub-Mariner] bound_address {inet[/0:0:0:0:0:0:0:0:9201]}, publish_address {inet[/192.168.81.140:9201]}
[2013-03-15 22:13:34,437][INFO ][node                     ] [Namor the Sub-Mariner] {0.20.5}[1969]: started

elasticsearch では、cluster.name に同じ名前を指定しておけばこのように自動的にノードを検出してクラスタを構成してくれます。
ただし、クラスタの構成が実行されるのは各ノードの起動時だけなのか、master ノードの起動を待たずに連続で複数のノードを起動した場合、正しく master ノードを検出してくれない事があるようでした。

同様に三台目を起動してみます。

# ./elasticsearch-0.20.5/bin/elasticsearch -f -Des.cluster.name=mycluster &
[3] 2005
[2013-03-15 22:19:49,889][INFO ][node                     ] [Squirrel Girl] {0.20.5}[2005]: initializing ...
[2013-03-15 22:19:49,893][INFO ][plugins                  ] [Squirrel Girl] loaded [], sites []
[2013-03-15 22:19:52,035][INFO ][node                     ] [Squirrel Girl] {0.20.5}[2005]: initialized
[2013-03-15 22:19:52,035][INFO ][node                     ] [Squirrel Girl] {0.20.5}[2005]: starting ...
[2013-03-15 22:19:52,125][INFO ][transport                ] [Squirrel Girl] bound_address {inet[/0:0:0:0:0:0:0:0:9302]}, publish_address {inet[/192.168.81.140:9302]}
[2013-03-15 22:19:55,183][INFO ][cluster.service          ] [D'Ken] added {[Squirrel Girl][m7G2uB51THamnmHxTEN_Gw][inet[/192.168.81.140:9302]],}, reason: zen-disco-receive(join from node[[Squirrel Girl][m7G2uB51THamnmHxTEN_Gw][inet[/192.168.81.140:9302]]])
[2013-03-15 22:19:55,188][INFO ][cluster.service          ] [Namor the Sub-Mariner] added {[Squirrel Girl][m7G2uB51THamnmHxTEN_Gw][inet[/192.168.81.140:9302]],}, reason: zen-disco-receive(from master [[D'Ken][cSaezczjS3WcMyjkoS4Lsg][inet[/192.168.81.140:9300]]])
[2013-03-15 22:19:55,196][INFO ][cluster.service          ] [Squirrel Girl] detected_master [D'Ken][cSaezczjS3WcMyjkoS4Lsg][inet[/192.168.81.140:9300]], added {[D'Ken][cSaezczjS3WcMyjkoS4Lsg][inet[/192.168.81.140:9300]],[Namor the Sub-Mariner][lsAu6NYBSHKPEygA5rpRxA][inet[/192.168.81.140:9301]],}, reason: zen-disco-receive(from master [[D'Ken][cSaezczjS3WcMyjkoS4Lsg][inet[/192.168.81.140:9300]]])
[2013-03-15 22:19:55,250][INFO ][discovery                ] [Squirrel Girl] mycluster/m7G2uB51THamnmHxTEN_Gw
[2013-03-15 22:19:55,254][INFO ][http                     ] [Squirrel Girl] bound_address {inet[/0:0:0:0:0:0:0:0:9202]}, publish_address {inet[/192.168.81.140:9202]}
[2013-03-15 22:19:55,254][INFO ][node                     ] [Squirrel Girl] {0.20.5}[2005]: started

先ほどのクラスタに追加された事が分かります。

クラスタの状態の確認はやはりビジュアルで見た方がわかりやすいので、管理用のツール elasticsearch-head を入れてみます。
elasticsearch-head は elasticsearch のプラグインとしてもインストールできるようですが、ここではプラグインではなく、standalone でインストールしてみます。

まずは Web サーバが必要なようなので Apache を入れて起動しておきます。
ついでに SELinux も Permissive モードにしておきました。

# yum install httpd
# setenforce 0
# service httpd start

Apache の DocumentRoot に移動し、elasticsearch-head を取得。

# cd /var/www/html/
# git clone git://github.com/mobz/elasticsearch-head.git

このままだとディレクトリ名がちょっと長くてブラウザからアクセスするときに面倒なので短くしておきました。

# mv elasticsearch-head elhead

これでブラウザから以下のような URL にアクセスすれば elasticsearch-head の画面が表示されるはずです。

http://yourserver/elhead/index.html

最初はまだ未接続なので、真っ白な画面に以下のようなヘッダだけ。

Connect ボタンの横の URL がデフォルトでは localhost になっているので、 elasticsearch を配置したサーバのアドレスに変更します。
また、elasticsearch-head はクラスタではない単体の elasticsearch も管理できるのですが、ここではクラスタの状態を確認したいので、ポート番号には master ノードのポート番号を指定します。

変更したら Connect ボタンをクリックすると以下のようにクラスタのノード一覧が表示されます。

この画面から各ノードを停止したり、インデックスを作成したりすることも可能です。
インデックスが存在する場合、以下のように Shard の状態も画面から確認することができます。

これで目で確認しながら簡単にクラスタを管理する事ができるようになりました。

elasticsearch は Solr より後発ということもあってか、面倒な設定などほとんどしなくてもすぐに使い始められるようになっているのですが、それにしてもクラスタまでがほぼ設定無しで構築できてしまうのはすごいですね。
もっと流行って情報が増えてくれるといいなー。


ElasticSearch Server
ElasticSearch Server
posted with amazlet at 13.06.05
Packt Publishing (2013-02-21)