elasticsearchの構築をしてみた

[Elasticsearch][構築]

環境

・サーバ
某社プライベートクラウド
CentOS release 6.5
4コア メモリ15GB Disk160GB
IPv4,IPv6両方付いてる
このインスタンスを4台(なんとなく4台にした)


・elasticsearch
バージョン: 1.0.1

構築手順

今回は公式サイトのダウンロードページにあるRPMを利用しようと思います

rpmのダウンロード

とりあえず、rootになってrpmファイルをダウンロードしてきます
※最新版は公式サイトに行ってURL確認してください


$ sudo su -
# cd /usr/local/src/
# wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.0.1.noarch.rpm

elasticsearchのインストール

そしたらローカルインストールをする


# yum install elasticsearch-1.0.1.noarch.rpm

ここで注意点があって、jdkが必要なんですがrpmで紐付けられてないので別途自分でインストールする必要があります。
今回はOracleJDKをrpm化したオレオレrpmで入れました。
/usr/bin/javaにパスが通ってる必要があるので、それ以外にjavaコマンドがある場合はシンボリックリンクとかチョメチョメしてパスを通してください。

設定をする

elasticsearchはymlファイルがconfになっているのでこいつを書き換えます。
中身は全てコメントアウトされていて書き換えなくても起動しますが、もろもろ変更するのでやります。
変更というか、追記です。


# vim /etc/elasticsearch/elasticsearch.yml

cluster.name: onuki-elasticsearch
node.name: "stg-onuki-elasticsearch01"
discovery.zen.ping.multicast.enabled: false
discovery.zen.ping.unicast.hosts: ["192.168.0.100", "192.168.0.101" , "192.168.0.102" , "192.168.0.103"]

これだけ追記しました。(IPは適当なのに書き換えてます)
elasticsearchはマルチキャストで勝手にノードを探してクラスタリングしてくれるんですが、
某社プライベートクラウドではクラスタリングできたり、できなかったりしました('A`)マンドクセ
たぶん、DHCPでv4を振ってるのでなんかダメなのかもしれないっす。そこの検証はしてないです。
そのため
discovery.zen.ping.multicast.enabled: false →マルチキャストしないように設定
discovery.zen.ping.unicast.hosts: [hogehoge] →クラスタリングするノードのIPを直書き('A`)ダセー

そして起動

rpmで入れたら起動スクリプトもあったのでそれで起動しました


# /etc/init.d/elasticsearch start
# ps uaxf |grep elasticsearch
497 17199 0.7 2.8 4519940 440188 ? Sl 17:39 2:02 /usr/bin/java -Xms256m -Xmx1g -Xss256k -Djava.awt.headless=true -XX:+UseParNewGC -XX:+UseCon
〜略〜

起動できました。

ログを見る

ログもあるのでログを眺めて見ます


# tail -f /var/log/elasticsearch/onuki-elasticsearch.log
[2014-03-05 22:29:04,467][INFO ][node ] [stg-onuki-elasticsearch01] version[1.0.1], pid[18703], build[5c03844/2014-02-25T15:52:53Z]
[2014-03-05 22:29:04,468][INFO ][node ] [stg-onuki-elasticsearch01] initializing ...
[2014-03-05 22:29:04,483][INFO ][plugins ] [stg-onuki-elasticsearch01] loaded [analysis-kuromoji], sites [head, bigdesk]
[2014-03-05 22:29:07,674][INFO ][node ] [stg-onuki-elasticsearch01] initialized
[2014-03-05 22:29:07,675][INFO ][node ] [stg-onuki-elasticsearch01] starting ...
[2014-03-05 22:29:07,900][INFO ][transport ] [stg-onuki-elasticsearch01] bound_address {inet[/0:0:0:0:0:0:0:0:9300]}, publish_address {inet[/192.168.0.100:9300]}
[2014-03-05 22:29:10,955][INFO ][cluster.service ] [stg-onuki-elasticsearch01] new_master [stg-onuki-elasticsearch01][sjLm_35aRZWYN59AASGfBA][stg-onuki-elasticsearch01][inet[/192.168.0.100:9300]], reason: zen-disco-join (elected_as_master)
[2014-03-05 22:29:10,975][INFO ][discovery ] [stg-onuki-elasticsearch01] onuki-elasticsearch/sjLm_35aRZWYN59AASGfBA
[2014-03-05 22:29:11,018][INFO ][http ] [stg-onuki-elasticsearch01] bound_address {inet[/0:0:0:0:0:0:0:0:9200]}, publish_address {inet[/192.168.0.100:9200]}
[2014-03-05 22:29:11,991][INFO ][gateway ] [stg-onuki-elasticsearch01] recovered [11] indices into cluster_state
[2014-03-05 22:29:12,684][INFO ][node ] [stg-onuki-elasticsearch01] started

なんか起動してる感のあるログになりました。

他のノードのelasticsearchも起動します。

02ノードのログはこんな感じになりました。


[2014-03-05 22:30:51,117][INFO ][transport ] [stg-onuki-elasticsearch02] bound_address {inet[/0:0:0:0:0:0:0:0:9300]}, publish_address {inet[/192.168.0.101:9300]}
[2014-03-05 22:30:54,271][INFO ][cluster.service ] [stg-onuki-elasticsearch02] detected_master [stg-onuki-elasticsearch01][sjLm_35aRZWYN59AASGfBA][stg-onuki-elasticsearch01][inet[/192.168.0.100:9300]], added {[stg-onuki-elasticsearch01][sjLm_35aRZWYN59AASGfBA][stg-onuki-elasticsearch01][inet[/192.168.0.100:9300]],}, reason: zen-disco-receive(from master [[stg-onuki-elasticsearch01][sjLm_35aRZWYN59AASGfBA][stg-onuki-elasticsearch01][inet[/192.168.0.100:9300]]])
[2014-03-05 22:30:54,323][INFO ][discovery ] [stg-onuki-elasticsearch02] onuki-elasticsearch/8FYOPb0OT4iKc54jcJ493Q

クラスタリングされたっぽいログが出てます。

01ノードのログも見てみます


[2014-03-05 22:30:54,238][INFO ][cluster.service ] [stg-onuki-elasticsearch01] added {[stg-onuki-elasticsearch02][8FYOPb0OT4iKc54jcJ493Q][stg-onuki-elasticsearch02][inet[/192.168.0.101:9300]],}, reason: zen-disco-receive(join from node[[stg-onuki-elasticsearch02][8FYOPb0OT4iKc54jcJ493Q][stg-onuki-elasticsear
ch02][inet[/192.168.0.101:9300]]])

新しいノードを追加したログが出ていました。
今回4台用意したので全部起動して、それぞれ追加されたログが出ました。

ノードを追加する時

最初3台でクラスタリングを組んでノード05のIP(192.168.0.103)をymlにあえて書かずに起動させました。
ノード05の設定にはノード01〜03のIPをdiscovery.zen.ping.unicast.hosts:に追記して起動させたら
自動でクラスタリング組んでくれました。既存のノードの設定をいちいち書き換えて再起動とかいらないようです。

動作確認

curlでelasticsearchのHTTPポートを叩けるか試しました


# curl -XGET http://localhost:9200/
{
"status" : 200,
"name" : "stg-onuki-elasticsearch01",
"version" : {
"number" : "1.0.1",
"build_hash" : "5c03844e1978e5cc924dab2a423dc63ce881c42b",
"build_timestamp" : "2014-02-25T15:52:53Z",
"build_snapshot" : false,
"lucene_version" : "4.6"
},
"tagline" : "You Know, for Search"
}

ステータス200がちゃんと返ってきました。

次にデータのインサート、サーチをします。


# curl -X POST http://localhost:9200/hogege/dayo/5 -d '{"famiry_name":"onuki","first_name":"aaa","email" :"sample@sample.email.com","age":27}'
{"_index":"hogege","_type":"dayo","_id":"5","_version":1,"created":true}

# curl -X GET http://localhost:9200/hogege/dayo/_search -d '{"query":{"match":{"famiry_name":"onuki"}},"size":10,"from":0}'
{"took":109,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":1,"max_score":0.30685282,"hits":[{"_index":"hogege","_type":"dayo","_id":"5","_score":0.30685282, "_source" : {"famiry_name":"onuki","first_name":"aaa","email" :"sample@sample.email.com","age":27}}]}}

インサートとサーチ両方できました。

プラグイン

ここまでで、アプリから使うことはできるんですが、もうちょい便利にしたいなーってことでいろいろ入れてみました

headプラグイン

インストールは1行だけです


# /usr/share/elasticsearch/bin/plugin --install mobz/elasticsearch-head

GUIでインデックス作成したり、検索したりいろいろできます

bigdeskプラグイン?(正式名称わからん)


# /usr/share/elasticsearch/bin/plugin --install lukas-vlcek/bigdesk

これで動的にリソース監視が可能になります。いろんな項目が取れるのでいいかなーっと思います。

感想

一旦入れて動かすところまでの確認だけですが、やってみました的な感じです。