2015年2月8日日曜日

ElasticSearch 実戦に向けた学習 その1 バックアップと復元

ElasticSearch導入のための学習とメモ

環境

  • vagrant1.7.2
  • centos6.5

さて、その1,その2,その3で検索の基礎は理解できたので、実戦投入に向けた学習に切り替えます。あとは走りながらPDCAを回していきます。

運用で最低限利用しないと行けないのは、これまでの知識に加えて、

  • バックアップ
  • バックアップデータの復元
  • ログ
  • ユーザー辞書(必須ではないかな)

です。というわけでまずはバックアップから。(ElasticSearchではバックアップのことをスナップショットと読んでいるので、以降「スナップショット」で統一)

Snapshot And Restore

まずはテストデータの登録


curl -XPUT 'http://192.168.33.19:9200/game/nintendo/1' -d '
{
    "gama_name" :  "mario brothers",
    "main_character_name" :   "marip",
    "price" : 5000
}
'

curl -XPUT 'http://192.168.33.19:9200/game/nintendo/2' -d '
{
    "gama_name" :  "zelda",
    "main_character_name" :   "Smith",
    "price" : 6000
}
'

curl -XPUT 'http://192.168.33.19:9200/game/nintendo/3' -d '
{
    "gama_name" :  "donkey kong",
    "main_character_name" : "donkey",
    "price" : 7000
}
'

// 検索
curl -XGET 'http://192.168.33.19:9200/game/nintendo/_count?pretty' -d '
{
    "query": {
        "match_all": {}
    }
}
'

// 結果
{
  "count" : 3,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  }
}


データ登録が完了したら、スナップショットを作成します。

repositories

スナップショットの作成の前にrepositoryを作成します。


// snapshot用のフォルダを作成
mkdir -p /var/elastic_search/my_backup

// フォルダの権限をelastic_searchにする
sudo chown elasticsearch:elasticsearch /var/elastic_search/my_backup/

// repository登録する
curl -XPUT 'http://192.168.33.19:9200/_snapshot/my_backup' -d '{
    "type": "fs",
    "settings": {
        "location": "/var/elastic_search/my_backup",
        "compress": true
    }
}
'

// 結果
{"acknowledged":true}

上手くいったみたいですね。一応コマンドから確認してみましょう。


curl -XGET 'http://192.168.33.19:9200/_snapshot/my_backup?pretty'

// 結果
{
  "my_backup" : {
    "type" : "fs",
    "settings" : {
      "compress" : "true",
      "location" : "/var/elastic_search/my_backup"
    }
  }
}

リポジトリが作成できたので、スナップショットを作成します。が、その前に理解しておかないといけないスナップショットの仕様を以下にまとめ。

  • スナップショットはclusterの中の、一意な名称によって特定される。
  • http://192.168.33.19:9200/_snapshot/my_backup/snapshot_1なら「my_backup」がリポジトリで「snapshot_1」がスナップショット。
  • index スナップショットを作成する過程で、Elasticsearchはリポジトリの中に保存されたindexファイルの一覧を分析する。そして、最後のスナップショットから変更、もしくは作成されたファイルだけを保存する。
  • スナップショットがリポジトリから削除された時、Elasticsearchはリポジトリがスナップショットを保存している場所の参照だけ削除する。つまり、スナップショット自体はその場に残っている。

スナップショットを作成


// 作成
curl -XPUT "http://192.168.33.19:9200/_snapshot/my_backup/snapshot_1?wait_for_completion=true"

// 結果
{"snapshot":{"snapshot":"snapshot_1","indices":["game","test","megacorp"],"state":"SUCCESS","start_time":"2015-02-06T06:59:29.624Z","start_time_in_millis":1423205969624,"end_time":"2015-02-06T06:59:30.186Z","end_time_in_millis":1423205970186,"duration_in_millis":562,"failures":[],"shards":{"total":15,"failed":0,"successful":15}}}

全てのindexが保存されていますね。リクエストのjsonでスナップショットを作成したいindexだけを指定することもできます。

さて、スナップショットを作成したので、データを変更してみましょう。index[game]にデータを2件追加します。


// データ登録
curl -XPUT 'http://192.168.33.19:9200/game/nintendo/4' -d '
{
    "gama_name" :  "metoroido",
    "main_character_name" :   "Samusu",
    "price" : 7000
}
'

// データ登録
curl -XPUT 'http://192.168.33.19:9200/game/nintendo/5' -d '
{
    "gama_name" :  "pokemon",
    "main_character_name" :   "Pikachu",
    "price" : 8000
}
'

// 検索
curl -XGET 'http://192.168.33.19:9200/game/nintendo/_count?pretty' -d '
{
    "query": {
        "match_all": {}
    }
}
'

// 結果
{
  "count" : 5,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  }
}

3件から5件にデータが増えました。
次はバックアップデータの復元をしましょう。(ElasticSearchではバックアップデータの復元のことをリストアと読んでいるので、以降「リストア」で統一)


// リストア
curl -XPOST "http://192.168.33.19:9200/_snapshot/my_backup/snapshot_1/_restore" -d '{
    "indices": "game",
    "rename_pattern": "game",
    "rename_replacement": "game2"
}'

// 検索
curl -XGET 'http://192.168.33.19:9200/game2/nintendo/_count?pretty' -d '
{
    "query": {
        "match_all": {}
    }
}
'

// 結果
{
  "count" : 3,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  }
}

curl -XGET "http://192.168.33.19:9200/_aliases?pretty"

rename_patternとrename_replacementを指定しないと"error":"SnapshotRestoreException[[my_backup:snapshot_1] cannot restore index [game] because it's openが発生した。なぜ同じ名前だとリストアができないのだろうか。

indexの一覧を確認する


// indexの一覧を確認
curl -XGET "http://192.168.33.19:9200/_aliases?pretty"

// 結果
{
  "game" : { },
  "test" : { },
  "megacorp" : { },
  "game2" : { }
}


indexが増えています。indexが存在しているとリストアができないのかもしれない。indexを削除、リストアの順かな。


// game index削除
curl -XDELETE 'http://192.168.33.19:9200/game/'

// game2 index削除
curl -XDELETE 'http://192.168.33.19:9200/game2/'

// indexの一覧を確認
curl -XGET "http://192.168.33.19:9200/_aliases?pretty"

// 結果
{
  "test" : { },
  "megacorp" : { }
}

// リストア
curl -XPOST "http://192.168.33.19:9200/_snapshot/my_backup/snapshot_1/_restore" -d '{
    "indices": "game"
}
'

// 結果
{"accepted":true}

// indexの一覧を確認
curl -XGET "http://192.168.33.19:9200/_aliases?pretty"

// 結果
{
  "test" : { },
  "megacorp" : { }
}

// game indexの確認
curl -XGET 'http://192.168.33.19:9200/game/nintendo/_count?pretty' -d '
{
    "query": {
        "match_all": {}
    }
}
'

// 結果
{
  "count" : 3,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  }
}

ビンゴ!!。リストアでデータを復活させる場合は、indexを削除しないといけないようである。

さて、次はログの学習です。

では、また。

参照

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

0 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...