Edited at

Elasticsearch の Auto-Rebalancing を Docker で試す

More than 1 year has passed since last update.

Linuxど素人の Docker 入門第二弾です。

ちょっと Docker おもしろくなってきたかも。

Elasticsearch というのは、Apache Solr と並ぶ(むしろ Solr より流行ってきた?)全文検索システムなんですが、複数のサーバにデータを分散配置して並列処理やフェイルオーバーができたりします。

んで、Auto-Rebalancing というのは、サーバ(ノードというらしい)を追加した時に、そのサーバの役割が自動的に決まって、他のサーバからデータを分けて貰って、全体としてデータの平衡化が行われる事です。

Docker なら、サーバーの起動が容易なので、Auto-Rebalancing を試すのに持ってこいだと思い、やってみました。

全体的には、

を参考にしています。


ubuntu の Docker コンテナに Elasticsearch をインストール

昨日使った ubuntu のコンテナに Elasticsearch をインストールします。

Elasticsearch のインストールは、

を参考にしました。(なんか Elasticsearch を導入済みのコンテナとか Dockerfile もあったみたい)

次に、Elasticsearch の管理GUIを提供するプラグイン elasticsearch-head を導入します。

elasticsearch-head については、こちらがとても参考になりました。

インストールは、以下のコマンド一発です。(./ を付けないとうまく動いてくれなかった)

[ root@bb638d1f825f:/ ]$ cd elasticsearch/bin

[ root@bb638d1f825f:/ ]$ ./plugin -install mobz/elasticsearch-head


Elasticsearch のクラスタの設定

複数の Elasticsearch を動かす場合、共通のグループ名を付ける必要があります。

elasticsearch.yml を編集して、グループ名を付けます。

[ root@bb638d1f825f:/ ]$ vim elasticsearch/config/elasticsearch.yml

json elasticsearch.yml

cluster.name: amaycluster

Elasticsearch の分散環境での使用については、

を参考にしました。

「EC2ではマルチキャストが使えない」などと書かれていますが、これは Docker なのでスルーで。結果的には elasticsearch.yml は上記の修正しかしていません。


Elasticsearch 設定済のイメージを作る

ここまでで一旦コンテナを終了し、docker commit で保存します。

docker images でイメージが作成できたのが確認できます。

docker@boot2docker:~$ docker commit -m "Setting Elasticsearch cluster" bb638d1f825f amay077/es_cluster

docker@boot2docker:~$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
amay077/es_cluster latest b9d05b77d71a 9 hours ago 1.075 GB
ubuntu latest ba5877dc9bec 2 weeks ago 192.7 MB


複数の Docker コンテナを起動し、それぞれで Elasticsearch を起動する

下のようなコマンドで、コンテナを起動し、Elasticsearch を開始します。

/bin/bash の代わりに直接 elasticsearch を開始してもよいと思いますが、後で直接コンソールに接続したいかなーと思いまして。)

docker@boot2docker:~$ docker run -i -t -p 9200:9200 -p 9300:9300 amay077/es_cluster /bin/bash

[ root@bb638d1f825f:/ ]$ /elasticsearch/bin/elasticsearch -d
#Control+p, Control+q でデタッチ

1つ起動した時点で、ホストPC(Mac)のブラウザから http://localhost:9200/_plugin/head/ にアクセスします。

あ、その前に VirtualBox の設定で、9200と9300のポートフォワーディングを行う必要があります。

設定できたら先のアドレスにアクセスすると elasticsearch-head の管理画面が表示されるはずです。

続いて、さっきのコマンドを複数回実行し、複数の Elasticsearch を起動します。

-p 9200:9200 のところが重複するとエラーになるので -p 9201:9200 などとズラしましたが、これで正しかったのかわかりません。


Elasticsearch にデータ投入

Elasticsearch へのデータ投入は、ホストPC(Mac)の Terminal から、

curl -XPOST 'http://localhost:9200/mytest/memo/' -d '{ "name" : "kappa", "date" : "2013-09-07", "message" : "test1" }'

curl -XPOST 'http://localhost:9200/mytest/memo/' -d '{ "name" : "kappa", "date" : "2013-09-07", "message" : "test2" }'
curl -XPOST 'http://localhost:9200/mytest/memo/' -d '{ "name" : "kappa", "date" : "2013-09-07", "message" : "test3" }'
…続く

のような感じで、3万件ほど投入しました。

投入後、 http://localhost:9200/_plugin/head/ を見ると、

となっています。4台のサーバにデータが分散して登録されたことが分かります。四角内の数字(0〜4)は、「データが5つに分割され」て、その「ブロックがどのサーバに配置されているか」を示していて、太枠がプライマリ、細枠がスレーブであることを示しています。

いずれのサーバが死んでも、データの欠損なくサービス継続できることを示しています。


ノードを追加してみる

5台目の Elasticsearh を追加してみます。

docker@boot2docker:~$ docker run -i -t -p 9204:9200 -p 9304:9300 amay077/es_cluster /bin/bash

[ root@de6d825fa34d:/ ]$ /elasticsearch/bin/elasticsearch -d
#Control+p, Control+q でデタッチ

その後 elasticsearch-head を見ると、

となり、しばらくしてから Refresh すると、

となります。

追加された「Isaiah Bradley」サーバには、データブロック1と3のスレーブの役割が与えられ、データが移動されたことが分かります。(移動中は色が変わったけどスクショ撮れなかった)

このように Elasticsearch の Auto-Rebalancing を、Docker を使うことでお手軽に試すことができました。(実運用では Elasticsearch に Docker は、、、使わないですよねたぶん)