はじめに
- こちらの記事の続き...改めて 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 ユーザーで
適切な権限を与えておく。
とりあえず今回は 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_key
と secret_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 一発でスナップショット、レストア出来るのは嬉しい限り