Elasticsearchのバックアップ方法について解説します。(スナップショット、リストア)

Elasticsearchのバックアップ方法について解説します。(スナップショット、リストア)

どうもこんにちはkoheiです。

一昨日、天気予報で秋が終わったことを知りました。

そもそも、秋来てたんですね(笑)

天気悪い日が多いので、みなさん気をつけましょう。

先日に下記のようなツイートをしました。

Elasticsearchについて更に深堀り中。クラスタ構成のバックアップ方法の設定や気をつけたほうがいいこと・・・なるほど、インプット×2。

実際に業務でElasticsearchを使うにいたり、バックアップについてインプットしました。

よくわからなかった点を踏まえて書きたいと思います。

たこ
たこ
バックアップ方法について知りたい
クラスタ構成のときのバックアップってどうなってるの?
犬

そんな疑問に答えます。

バックアップの必要性

そもそも、なぜバックアップが必要なのでしょうか。

クラスタ全体での壊滅的なエラーが起きた場合にデータをバックアップ時点まで戻すことで復旧することができます。

そもそもElasticsearchには可用性を高めるためにレプリケーション機能が備わっているのですが、

レプリケーションとはクラスタ構成ではシャード数をうまく設定してやることによって、ノード単体が動かなくなった場合に高可用性を発揮します。

こういったノード単体のエラーではなく、クラスタ構成全体でのエラーが起きた場合のためにバックアップが必要になってくるということです。

Elasticsearchについての関連記事!

全文検索エンジンElasticsearchについてまとめてみました

Elasticsearchの設定方法について簡単に解説

全体の流れ

全体の流れは以下になります。

設定変更→リポジトリ登録→スナップショット作成、リストア

それでは見ていきましょう。

設定を変更する。

まずはじめに、バックアップを有効にするための設定が必要になります。

elasticsearch.ymlに以下を追加します。

【elasticsearch.yml】

path.repo : リポジトリを登録するためのディレクトリ(例:/mnt/snapshot)

注意点

ここで注意する必要があります。

  • クラスタ内共通のファイルサーバを用意し、マウントする必要がある。
  • マウントしたディレクトをpath.repo に設定する必要がある。

リポジトリを作成する。

リポジトリ作成 API

リポジトリ作成用のRest APIが用意されてます。

【リポジトリ作成】

curl -XPUT http:localhost:9200/_snapshot/my_backup
{
  "type": "fs", →ファイルシステムリポジトリを作成する場合
  "settings": {
    "location": "my_backup_location" →path.repoからの相対パス
    "compress": true →圧縮するかどうか
  }
}

ここでポイントとなる設定の説明は以下になります。

・”type”は「fs」または「url」、「source」を指定します。「url」を指定した場合は読み取り専用方法リポジトリとなり、「http」、「https」、「ftp」、「file」、および「jar」というプロトコルをサポートしています。 http:、https :、およびftpの場合はrepositories.url.allowed_urls設定で許可されたURLを指定してホワイトリストに登録する必要があります。→例:repositories.url.allowed_urls: [“http://www.example.org/root/*”, “https://*.mydomain.com/*?*#*”]

・”location”は相対パスか絶対パスで記載します。相対パスの場合はpath.repoからのパスになります。

リポジトリ削除API

リポジトリ削除用のRest APIが用意されてます。

【リポジトリ削除】

curl -XPOST http:localhost:9200/_snapshot/my_repository/_cleanup

スナップショットを取得する。

スナップショット取得API

スナップショット用のRest APIが用意されてます。

【リポジトリ「my_backup」にすべてのインデックスを含むスナップショット「snapshot_1」を取得する場合】

curl -XPUT http://localhost:9200/_snapshot/my_backup/snapshot_1?wait_for_completion=true

※wait_for_completionはスナップショットの完了を待つかどうか

【リポジトリ「my_backup」にインデックス「index_1」「index_2」のスナップショット「snapshot_2」を取得する場合】

curl -XPUT http:localhost:9200/_snapshot/my_backup/snapshot_2?wait_for_completion=true
{
  "indices": "index_1,index_2",
  "ignore_unavailable": true, →存在しないインデックスを無視するか(無視しない場合はエラーになる)
  "include_global_state": false, →調査中
  "metadata": { →任意のメタデータをつけることができる。(作成者、理由)
    "taken_by": "kimchy",
    "taken_because": "backup before upgrading"
  }
}

スナップショット削除API

スナップショット削除用のRest APIが用意されてます。

【スナップショット削除】

curl -XDELETE http:localhost:9200/_snapshot/my_backup/snapshot_2

スナップショットに含まれる内容

インデックスの他に設定で含まれる内容と含まれない内容は以下になります。

設定APIの一時的な設定はスナップショットには反映されない

設定APIの永続的設定はスナップショットには反映される

スナップショット実行時は1プロセスのみしか動作しない

スナップショットが終了したら新たなスナップショットを実行できるようになります。

スナップショット実行中にシャードを他のノードに移動することはできない

リストアする。

リストアAPI

リストア用用のRest APIが用意されてます。

【スナップショット「snapshot_1」をリストアする場合】

curl -XPOST http:localhost:9200/_snapshot/my_backup/snapshot_1/_restore

【スナップショット「snapshot_1」のインデックス「index_1」「index_2」をリストアする場合】

curl -XPOST http:localhost:9200/_snapshot/my_backup/snapshot_1/_restore
{
  "indices": "index_1,index_2",
  "ignore_unavailable": true,
  "include_global_state": true,
  "rename_pattern": "index_(.+)",
  "rename_replacement": "restored_index_$1"
}

疑問点

まだずべてのパラメータについて理解度が浅いとことがある。定着させていきたい。

最後に

以上でバックアップ方法については以上になります。

詳しくは公式ドキュメントもしくはおすすめ書籍を参照してください。


人気記事:
【最新】Elastic Stack学習におすすめの本5選