LoginSignup
10
8

More than 5 years have passed since last update.

Elasticsearchのデータ移行ツールesigrateを試した

Last updated at Posted at 2017-03-09

課題

運用中のサービスで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でバックアップを取ることもできるし、落としどころとしてはまぁまぁいいんじゃないかなと思います。

10
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
8