Elasticsearch スナップショットによる増分バックアップと復元の実践

スナップショットによるバックアップの仕組み

Elasticsearch が提供するスナップショット機能は、データのバックアップと復元を効率的に行う仕組みです。この方法にはいくつかの重要な特徴があります:

  • 増分バックアップ:変更されたファイルのみを保存することで、ストレージ効率を向上させます。
  • メタデータ管理:各スナップショットに必要なファイルのマッピング情報を維持します。
  • 柔軟な復元:全量復元および増分復元が可能です。

スナップショットの準備

スナップショットを利用するには、事前にリポジトリを登録する必要があります。以下は MinIO を利用した S3 リポジトリの設定例です。


# プラグインのインストール
./bin/elasticsearch-plugin install repository-s3

# 認証情報の設定
bin/elasticsearch-keystore add s3.client.default.access_key
bin/elasticsearch-keystore add s3.client.default.secret_key

# 設定の再読み込み
POST /_nodes/{node_id}/reload_secure_settings

# リポジトリの登録
PUT _snapshot/my-minio-repository
{
  "type": "s3",
  "settings": {
    "bucket": "es-bucket",
    "endpoint": "http://127.0.0.1:9002",
    "compress": true
  }
}

バックアップの実行

初回バックアップ

初回のスナップショットでは、対象インデックスのすべてのデータファイルがリポジトリに保存されます。


PUT _snapshot/my-minio-repository/snapshot_1
{
  "indices": "sample_data_flights",
  "ignore_unavailable": true,
  "include_global_state": false
}

増分バックアップ

初回バックアップ後にデータが変更された場合、Elasticsearch は変更されたファイルのみを増分バックアップとして保存します。これは、ファイルのチェックサムを比較して判断されます。


# データの更新
POST sample_data_flights/_update_by_query?refresh=true
{
  "script": {
    "source": "ctx._source.status = 'update'"
  },
  "query": {
    "term": {
      "DestCityName": "Sydney"
    }
  }
}

# 増分バックアップの実行
PUT _snapshot/my-minio-repository/snapshot_2
{
  "indices": "sample_data_flights",
  "ignore_unavailable": true,
  "include_global_state": false
}

復元の実行

全量復元

全量復元では、指定したスナップショットに含まれるすべてのデータが復元されます。


POST _snapshot/my-minio-repository/snapshot_1/_restore
{
  "indices": "sample_data_flights",
  "rename_pattern": "(.+)",
  "rename_replacement": "restored-$1"
}

増分復元

増分復元では、既存の復元済みインデックスに変更分のみを追加的に復元します。ただし、同名のインデックスが存在する場合は一度閉じる必要があります。


# 既存インデックスのクローズ
POST restored-sample_data_flights/_close

# 増分復元の実行
POST _snapshot/my-minio-repository/snapshot_2/_restore
{
  "indices": "sample_data_flights",
  "rename_pattern": "(.+)",
  "rename_replacement": "restored-$1"
}

復元結果の検証

復元後、変更されたドキュメント(例: status = 'update')が正しく含まれているかを確認します。


GET restored-sample_data_flights/_count
{
  "query": {
    "term": {
      "status": "update"
    }
  }
}

さらに、ファイルレベルで復元されたデータの整合性を確認します。同じファイル名(例: _0.si)の cksum および md5sum が一致するかをチェックします。


# cksum および md5sum の確認
cksum _0.si
md5sum _0.si

スナップショットの管理とクリーンアップ

不要になったスナップショットは削除することで、ストレージの無駄を防ぎます。削除されたスナップショットに関連するファイルがリポジトリから自動的に削除されます。


# スナップショットの削除
DELETE _snapshot/my-minio-repository/snapshot_1

まとめ

Elasticsearch のスナップショット機能は、増分バックアップと復元を効率的に行うための強力な仕組みです。適切にリポジトリを構成し、定期的にスナップショットを作成することで、データの安全性を確保できます。また、復元時のパフォーマンスを向上させるために、max_restore_bytes_per_sec の調整も有効です。

タグ: Elasticsearch Snapshot Backup Restore minio

5月17日 06:12 投稿