課題
運用中のサービスでElasticsearchを使っているのだけれど、基本的にRead onlyで、特定のタイミングでしか更新していません。開発環境と本番環境で同様のデータを使うのですが、Elasticsearchのindexの再構築はrake task
に定義しており、それぞれの環境で実行していましたが、データ量がそこそこ多いせいもあるけれど、これがまた遅い!時間がかかって仕方がない。
そこで、マスタ環境からバックアップを取って、それぞれの環境にリストアできれば高速にできそうだしよさそう!と思ってバックアップの取得方法を調べたのだけれど、なさそうでした(使っているのはHerokuのアドオンのSearchboxのため)
調査
Searchboxを提供しているSearchlyのフォーラムに、以下の投稿がありました。
How to backup and dowload the backup?
2014年の情報ではあるのだけれど、「バックアップをDLする方法はない。esigrateを使ってSearchlyからlocalhostにマイグレートしなさい」と書かれています。
esigrate、初めて知りました!!
esigrateとは?
Searchlyが開発しているElasticsearchのマイグレーションツールです。
srcで指定したElasticsearchのURLとindexのデータを、destで指定したElasticsearchのURLとindexにコピーしてくれます。バックアップファイルなどの中間ファイルは生成されず、そのままコピーされる感じです。
closureで作られているようなので、環境変数にJAVA_HOME
を設定しておく必要があるようです。
インストール
上記のURLから、最新版をダウンロードします。私の場合はesigrate-0.2.1.tar
でした。
解凍し、そのディレクトリに移動し、以下のコマンドを実行します。
bin/launcher.sh start
以下のようになったら起動完了です。
Starting esigrate...
Waiting for esigrate...
.
.
.
.
.
.
running: PID:19606
使い方
README.mdに書いてあるのですが、そのままです。curlでアクセスしてみます。
curl -XPOST http://localhost:9090/migration -d '{
"id" :"001",
"src": {
"url": "http://localhost:9200/",
"index" :"index1"
},
"dest" : {
"url": "http://newhost:9200/",
"index": "index2"
}
}'
idは、依頼が完了したかどうかを確認するために利用します。
srcはデータの移行元の情報です。
destはデータの移行先の情報です。
HerokuのSearchboxからローカルのElasticsearchにデータを移行する場合は、こんな感じで書きます。
curl -XPOST http://localhost:9090/migration -d '{
"id" :"001",
"src": {
"url": "https://paas:XXXXXXXXXXXXXXXXXXXXX@XXXXX-us-east-1.searchly.com/",
"index" :"index_production"
},
"dest" : {
"url": "http://localhost:9200/",
"index": "index_development"
}
}'
あとは待つだけです。処理が終了したかどうかチェックする場合は、指定したidを使って問い合わせます。
curl http://localhost:9090/migration/001
[:response "running"]
が返ってきたら、まだ移行中。
[:response "stopped"]
が返ってきたら、処理完了です。
結果
ローカルでrake taskを流して行うElasticsearchのindexの再構築には20分近くかかっていたのですが、esigrateでデータの移行をしてみたところ、約10分程度で終わりました。ちなみにデータ量は約400MBくらい。
めっちゃ速いってことはないですが、それでも断然速い!!
まとめ
バックアップを手元に残そうと思えば、一旦コピーしてからローカルのElasticsearchでバックアップを取ることもできるし、落としどころとしてはまぁまぁいいんじゃないかなと思います。