ようへいの日々精進XP

よかろうもん

(既に elasticsearch 1.5.0 ですが)触って身に付く elasticsearch 1.0.0 の Snapshot と Restore 操作メモ(復習)

はじめに

  • こちらの記事の続き...改めて elasticsearch 1.5.0 で試してみたメモ

操作

流れ

  • スナップショットディレクトリ作成
  • リポジトリ登録
  • スナップショット
  • 必要に応じてレストア

スナップショットディレクトリ作成

スナップショットディレクトリを作成する。

mkdir /path/to/elasticsearch_backup
chmod -R 777 /path/to/elasticsearch_backup

注意が必要なのが /path/to/elasticsearch_backup には全てのユーザー、グループに対する書き込みの権限を付与する必要があった。(以下、「リポジトリ登録」にて。)

リポジトリ登録

地味にハマった。

curl -XPUT 'http://127.0.0.1:9200/_snapshot/elasticsearch_backup' -d '{
    "type": "fs",
    "settings": {
        "location": "/path/to/elasticsearch_backup",
        "compress": true
    }
}'

を実行すると以下のようなエラー。

{"error":"RepositoryException[[my_backup] failed to create repository]; nested: CreationException[Guice creation errors:\n\n1) Error injecting constructor, org.elasticsearch.common.blobstore.BlobStoreException: Failed to create directory at [~/tmp/my_backup]\n  at org.elasticsearch.repositories.fs.FsRepository.<init>(Unknown Source)\n  while locating org.elasticsearch.repositories.fs.FsRepository\n  while locating org.elasticsearch.repositories.Repository\n\n1 error]; nested: BlobStoreException[Failed to create directory at [~/tmp/my_backup]]; ","status":500}

スナップショットディレクトリに対して権限を付与することで解決。

 curl -XPUT 'http://127.0.0.1:9200/_snapshot/my_backup' -d '{                                                                                                                                               [/tmp]
quote>     "type": "fs",
quote>     "settings": {
quote>         "location": "/tmp/my_backup",
quote>         "compress": true
quote>     }
quote> }'
{"acknowledged":true}

リポジトリの一覧は以下のように取得。

curl -XGET 'http://127.0.0.1:9200/_snapshot/?pretty' 
{
  "my_backup" : {
    "type" : "fs",
    "settings" : {
      "compress" : "true",
      "location" : "/tmp/my_backup"
    }
  }
}

※上記はあくまでも一例。バックアップを /tmp 以下に置いたりするのは止めましょう。

スナップショットを取得

curl -XPUT "http://127.0.0.1:9200/_snapshot/my_backup/snapshot_1?pretty&wait_for_completion=true" -d '{
quote>     "ignore_unavailable": "true",
quote>     "include_global_state": false
quote> }'
{
  "snapshot" : {
    "snapshot" : "snapshot_1",
    "indices" : [ "ansible-2015.03.26", ".kibana" ],
    "state" : "SUCCESS",
    "start_time" : "2015-03-28T14:32:17.211Z",
    "start_time_in_millis" : 1427553137211,
    "end_time" : "2015-03-28T14:32:17.837Z",
    "end_time_in_millis" : 1427553137837,
    "duration_in_millis" : 626,
    "failures" : [ ],
    "shards" : {
      "total" : 6,
      "failed" : 0,
      "successful" : 6
    }
  }
}

レストア

以下のようにレストア。

curl -XPOST "http://127.0.0.1:9200/_snapshot/my_backup/snapshot_1/_restore?pretty" -d '{
    "indices": "ansible-2015.03.26",
    "ignore_unavailable": "true",
    "include_global_state": false,
    "rename_pattern": "ansible-2015.03.26",
    "rename_replacement": "ansible-2015.03.26_restored"
}'

同じ名前でレストアしようとするとエラーになるので rename_replacement でインデックス名を指定してレストアする。

レスポンスは以下のように。

{
  "accepted" : true
}

レストアされているか確認。

 curl 'http://127.0.0.1/ansible-2015.03.26_restored?pretty' 
{
  "ansible-2015.03.26_restored" : {
    "aliases" : { },
    "mappings" : {
      "fluentd" : {
        "properties" : {
          "@log_name" : {
            "type" : "string"
          },
          "@timestamp" : {
            "type" : "date",
            "format" : "dateOptionalTime"
          },
          "category" : {
            "type" : "string"
          },
          "host" : {
            "type" : "string"
          },
          "messages" : {
            "type" : "string"
          }
        }
      }
    },
    "settings" : {
      "index" : {
        "creation_date" : "1427330374170",
        "uuid" : "5RNmrmRRTK-GSUYX3Fkjuw",
        "number_of_replicas" : "1",
        "number_of_shards" : "5",
        "version" : {
          "created" : "1050099"
        }
      }
    },
    "warmers" : { }
  }
}

ちなみにインスタンス一覧は _aliases を利用して取得出来る。

curl 'http://127.0.0.1:9200/_aliases?pretty'
{
  "ansible-2015.03.26" : {
    "aliases" : { }
  },
  ".kibana" : {
    "aliases" : { }
  },
  "ansible-2015.03.26_restaurant" : {
    "aliases" : { }
  },
  "ansible-2015.03.26_restored" : {
    "aliases" : { }
  }
}

Amazon S3 へのスナップショット

IAM ユーザーで

適切な権限を与えておく。

f:id:inokara:20150329013028p:plain

とりあえず今回は S3 に対する Full Access 権限を付与。 IAM ロールでインスタンスに権限を与える方がクレデンシャルな情報を書く必要が無いので良い(と思う)。

プラグインの導入

プラグインのバージョンと Elasticsearch のバージョンは合わせておく必要があるので注意。

$ cd /usr/share/elasticsearch
$ sudo bin/plugin install elasticsearch/elasticsearch-cloud-aws/2.5.0
-> Installing elasticsearch/elasticsearch-cloud-aws/2.5.0...
Trying http://download.elasticsearch.org/elasticsearch/elasticsearch-cloud-aws/elasticsearch-cloud-aws-2.5.0.zip...
Downloading ...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................DONE
Installed elasticsearch/elasticsearch-cloud-aws/2.5.0 into /usr/share/elasticsearch/plugins/cloud-aws

access_keysecret_key を elasticsearch.yml に設定しておく。(あまりオススメ出来ないので実運用の際には IAM ロールで対応したい)

cloud:
    aws:
        access_key: AKXXXXXXXXXXXXXXXXXXXXXXXXXX
        secret_key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

設定したら Elasticsearch は再起動しておく。

S3 のバケット作成

$ aws --profile s3_test --region ap-northeast-1 s3 mb s3://es-snapshot-inokappa-test
make_bucket: s3://es-snapshot-inokappa-test/

リポジトリの作成

curl -XPUT 'http://127.0.0.1:9200/_snapshot/s3_backup_test' -d '{
   "type": "s3",
   "settings": {
       "bucket": "es-snapshot-inokappa-test",
       "region": "ap-northeast-1"
   }
}'

リポジトリの一覧

$ curl -s -XGET 'http://127.0.0.1:9200/_snapshot/' | python -m json.tool
{
    "elasticsearch_backup": {
        "settings": {
            "compress": "true",
            "location": "/elasticsearch_backup"
        },
        "type": "fs"
    },
    "s3_backup_test": {
        "settings": {
            "bucket": "es-snapshot-inokappa-test",
            "region": "ap-northeast-1"
        },
        "type": "s3"
    }
}

あとは通常通りにスナップショットを取得する。


ということで

  • ざくっとスナップショットとレストアを試してみた
  • curl 一発でスナップショット、レストア出来るのは嬉しい限り