ようへいの日々精進XP

よかろうもん

elasticsearch 1.0.0 RC1 の Snapshot と Restore 機能を触ってみる

はじめに

  • elasticsearch 1.0.0 RC1 がリリースされていた
  • とりあえずは Backup と Restore 機能(snapshot/restore API)を触ってみる

メモ

v1.0.0 前夜

こちらを読んだり、今までの認識だと 1.0 以前のバックアップとレストアは手順としても面倒な印象で、且つ、バックアップ、レストアを積極的に行っている事例というのをあまり見たことが無い印象だったが、 こちらの資料やドキュメントリリースノートを見て*1いると「curl 一発!」でいけそうな気がした。

ざっくり概要

  • 1.0.0.beta2 で公開された機能(厳密にはバックアップではなくて SnapShot / Restore
  • バックアップはローカルのファイルシステム以外にも取得することが出来る(例えば、S3 / HDFS / GlusterFS / Google Compute Engine / Microsoft Azure)
  • これらのファイルシステム上にリポジトリを作成して _snapshot というエンドポイントに対して repository 名と snapshot 名を付けて API にアクセスするだけでバックアップ(スナップショット)が取得出来る
  • レストアも _restore というエンドポイントに POST するだけ...
  • マジかよ...

触ってみる

マジかよってことでバックアップ(スナップショット)とレストアを触ってみることにした。

環境

まずは elasticsearch-head で確認

f:id:inokara:20140204010911p:plain

もちろん、特に 0.9 系と何も変わらない。

f:id:inokara:20140204011027p:plain

適当にインデックスを作成する。

早速リポジトリをローカルホストに作成してみる

以下のようにリポジトリ用のディレクトリを作成する。尚、スナップショットファイルの権限は elasticsearch ユーザーとなるので適切にディレクトリの権限を設定する必要がある(下記では chmod 777 としている)

mkdir ~/my_backup
chmod 777 ~/my_backup

以下のようにリポジトリを登録する。

curl -XPUT 'http://localhost:9200/_snapshot/my_backup' -d '{
    "type": "fs",
    "settings": {
        "location": "/home/ubuntu/my_backup",
        "compress": true
    }
}'

以下のようなレスポンスが返ってくる。

{"acknowledged":true}

ふむふむ。

適当にデータ投入

以下のようなデータを投入してみる。

curl -X POST localhost:9200/test01/hogehuga/1 -d '{"name":"MasaharuFukuyama","email" :"masha@tfm.com","age":45}'
curl -X POST localhost:9200/test01/hogehuga/2 -d '{"name":"YoheiKawahara","email" :"hage@tfm.com","age":38}'

確認してみる。

curl -X GET localhost:9200/test01/hogehuga/_search?pretty

以下のように登録されている。

{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 2,
    "max_score" : 1.0,
    "hits" : [ {
      "_index" : "test01",
      "_type" : "hogehuga",
      "_id" : "1",
      "_score" : 1.0, "_source" : {"name":"MasaharuFukuyama","email" :"masha@tfm.com","age":45}
    }, {
      "_index" : "test01",
      "_type" : "hogehuga",
      "_id" : "2",
      "_score" : 1.0, "_source" : {"name":"YoheiKawahara","email" :"hage@tfm.com","age":38}
    } ]
  }
}

スナップショットを取る

上記のインデックスのスナップショット(バックアップ)を以下のように取得してみる。

curl -XPUT localhost:9200/_snapshot/my_backup/snapshot_20140204

以下のようなレスポンスが返ってくる。

{"accepted":true}

あら、簡単。尚、リポジトリは以下のようなディレクトリ構成となっていた。

f:id:inokara:20140204231352p:plain

レストアしてみる

とりあえずレストアを試してみたいので、先ほど elasticsearch-head で削除したインデックスを削除した状態にした後でレストアしてみる。

f:id:inokara:20140204013704p:plain

当然、レコードも消えている。

{
  "error" : "IndexMissingException[[test01] missing]",
  "status" : 404
}

ところが、レストアも curl でポン。

curl -XPOST localhost:9200/_snapshot/my_backup/snapshot_20140204/_restore

以下のようなレスポンスが返ってくる。

{"accepted":true}

えっと思うくらい簡単にレストア出来た。念のために確認してみると...

{
  "took" : 3,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 2,
    "max_score" : 1.0,
    "hits" : [ {
      "_index" : "test01",
      "_type" : "hogehuga",
      "_id" : "1",
      "_score" : 1.0, "_source" : {"name":"MasaharuFukuyama","email" :"masha@tfm.com","age":45}
    }, {
      "_index" : "test01",
      "_type" : "hogehuga",
      "_id" : "2",
      "_score" : 1.0, "_source" : {"name":"YoheiKawahara","email" :"hage@tfm.com","age":38}
    } ]
  }
}

おお。但し、スナップショット名が重複していたりするとデータが正常にレストアされないような不安定な状態が見られた。これは偶々なのか否かは引き続き調査したい。


とりあえず

  • 駆け足でスナップショット(バックアップ)とレストア機能を触ってみたけど、どこまで簡単になるんやーという印象
  • もちろんデータ量も極限に小さい量だったので、殆ど参考にはならないかもしれないがお手軽感満載だった
  • 引き続き、いろいろな機能と少し大きめなデータ量で試してみたい
  • スナップショットのファイルシステムとして S3 が利用出来るので後で試してみる

*1:英語が解らないので読むでは無くて見る