Elasticsearchのバックアップ

ElasticSearchではインデックスのバックアップ方法として、snapshotの機能を提供しています。今回その機能を利用したので、備忘録しておきます。

環境です。尚、ざっと確認した限り、バージョン5のElasticSearchでも手順は同じっぽいです。

  • CentOS 7.2
  • ElasticSearch 2.4.1

公式ドキュメントに手順が記載されています。手順通りに実施しています。

Snapshot And Restore | Elasticsearch Reference [2.4] | Elastic

リポジトリの作成

まずOS上にスナップショット保管先のリポジトリ領域を作成し、その情報をElasticSearchに登録してあげます。

「/data/es_bkup」配下をリポジトリ先として利用するので、そのためのディレクトリを作成。

$ sudo mkdir /data/es_bkup
$ sudo chown -R elasticsearch:elasticsearch /data/es_bkup

「elasticsearch.yml」に上記で作成したリポジトリ・パスの情報を追記。

[/etc/elasticsearch/elasticsearch.yml]
path.repo: ["/data/es_bkup"]

ElasticSearchの再起動。

$ sudo systemctl restart elasticsearch

ちなみに複数ノードでElasticSearchを運用している場合、適当な共有フォルダを全ノードの同一パスにマウントしてあげて、そこをリポジトリ先として利用すべきだそうです。僕の環境はsingle nodeなので、今回は試していません。

続いて、ElasticSeachにリポジトリ情報を登録してあげます。リポジトリ情報として、「my_backup」という名前のリポジトリ定義を作成しています。「elasticsearch.yml」に追記したリポジトリパスが参照され、「/data/es_bkup/backups」というディレクトリに圧縮されたスナップショットが作成されることになります。尚、その他にもパラメータを与えることはでき、気になる方は公式サイトを見てみて下さい。

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

リポジトリが作成されたことを確認するコマンド。

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

スナップショットの取得

実際にスナップショットを取得します。先ほど作成した「my_backup」というリポジトリに、「snapshot1」という名前のスナップショットを取得してみます。「wait_for_completion=true」を与えることで、処理完了までコマンドの戻りを待つことになります。(処理ステータスを判別するようなコマンドはないっぽく、これを入れておかないと処理中か否か判断できないっぽい?)「indices」はその名の通りスナップショット取得先のインデックス名を指定します。「ignore_unavailable」をtrueにしておくと、存在しないインデックスを指定した場合、それを無視してくれます。また「include_global_state」はglobal stateファイルを含めるか否かの指定になります。

$ curl -XPUT 'http://localhost:9200/_snapshot/my_backup/snapshot1?wait_for_completion=true' -d '{
  "indices": "shikiho",
  "ignore_unavailable": true,
  "include_global_state": false
}'

「/data/es_bkup/backups」配下にファイルが作成されたはずです。また以下のコマンドで、リポジトリ「my_backup」内に作成されているsnapshot情報を取得できます。

$ curl -XGET 'http://localhost:9200/_snapshot/my_backup/_all?pretty'
{
  "snapshots" : [ {
    "snapshot" : "snapshot1",
    "version_id" : 2040199,
    "version" : "2.4.1",
    "indices" : [ "shikiho" ],
    "state" : "SUCCESS",
    "start_time" : "2017-03-07T04:07:42.105Z",
    "start_time_in_millis" : 1488859662105,
    "end_time" : "2017-03-07T04:07:42.530Z",
    "end_time_in_millis" : 1488859662530,
    "duration_in_millis" : 425,
    "failures" : [ ],
    "shards" : {
      "total" : 1,
      "failed" : 0,
      "successful" : 1
    }
  } ]
}

作成されるスナップショットは増分で管理されるとのことです。リポジトリ先を確認して、更新があった部分に限りスナップショットを取得しているらしいです。また、スナップショット取得中もインデクシングやサーチは実行できるらしいですが、スナップショット作成中のshardはノード間の移動ができなくなるとあるので、やはりElasticSearchが忙しい時は実行しない方が良さげです。

リストア

実際にリストアする際のコマンドは以下です。「my_backup」リポジトリ内の「snapshot1」より、「shikiho」というインデックスをリストアしています。

$ curl -XPOST 'http://localhost:9200/_snapshot/my_backup/snapshot1/_restore?wait_for_completion=true' -d '{
  "indices": "shikiho",
  "ignore_unavailable": true,
  "include_global_state": true
}'

上書きで同名のインデックスをリストアする場合には、上書き先インデックスをcloseステータスにしておく必要があります。且つ、shardの数も合わせて置く必要があります。上書き以外にも、インデックス名を変更してリストアや、インデックスのsettings情報を変更しながらのリストア、といった事もできるようです。