oranie's blog

旧:iをgに変えると・・・なんだっけ・・・

ElasticSearchでノードを落とす際にshardの自動再配置を止める作法

現行のクラスタを一度止めてデータを別のサーバ群にコピーしてクラスタを再構築したいという要件があったので調べた。

公式ElasticSearch(Ver 0.90.5で確認)のrpm installで作成されるディレクトリ

/var/run/elasticsearch
/var/lib/elasticsearch
/var/lib/elasticsearch/elasticsearch
/var/lock/subsys/elasticsearch
/var/log/elasticsearch
/usr/share/elasticsearch
/usr/share/elasticsearch/bin/elasticsearch
/etc/elasticsearch
/etc/sysconfig/elasticsearch
/etc/rc.d/init.d/elasticsearch

上記の内、データディレクトリでデフォルト指定されている

 /var/lib/elasticsearch

をマルっとファイルレベルでのコピーすれば基本データ移行+リストアが可能。一応調べる限りクラスタの情報をどこかのファイルに持っているとかは無いので、elasticsearch.ymlに記述するdiscoverの項目辺りで挙動を制御し動的に保持している様子。

但し、通常時はノードをダウンさせると自動的にshardとレプリカの再配置が実行されてしまう。これを防ぐ為に

curl -XPUT localhost:9200/_cluster/settings \-d '{"transient":{"cluster.routing.allocation.disable_allocation": true}}';

が必要。これを実行する事で自動再配置を抑制する。戻す時は値をfalse。
自分で色々調べてソース斜め読みしたりして試したら「挙動的には大丈夫だな・・・」って感じだったけど、@johtaniさんが別の情報ソースを調べてくれたり、
https://groups.google.com/forum/m/?pli=1#!topic/elasticsearch/tQKQ37Ly5yM
公式ドキュメントの場所
http://www.elasticsearch.org/guide/reference/modules/cluster/
を教えてくれたりで本当に助かりましたm(_ _)m

その為、クラスタ全台を落とす時にまず上記コマンドを実行、次に全台停止したらまず1台を起動して再度このコマンドを実行する。そうすると自動配置が行われない状態でノードの起動・停止が可能。全て起動し、もう自動配置が行われても良くなったら

curl -XPUT localhost:9200/_cluster/settings -d '{"transient":{"cluster.routing.allocation.disable_allocation": false}}';

を実行して戻す。ちなみに、elasticsearch.ymlに書いたらずっとOFFに出来るんじゃね!とか思って書いてみたけど挙動は変わらなかった。

もしこの辺の運用お作法をご存知の方は教えて下さい!