スナップショットの作成

このガイドでは、実行中のクラスターのスナップショットを取得する方法を示します。後でスナップショットを復元して、そのデータを回復または転送できます。

このガイドでは、次のことを学びます:

  • スナップショットライフサイクル管理(SLM)を使用して、スナップショットの作成と保持を自動化する
  • 手動でスナップショットを取得する
  • スナップショットの進行状況を監視する
  • スナップショットを削除またはキャンセルする
  • クラスターの構成ファイルをバックアップする

このガイドでは、専用のクラスター状態スナップショットを作成するためのヒントや、異なる時間間隔でスナップショットを取得する方法も提供します。

前提条件

  • Kibanaのスナップショットと復元機能を使用するには、次の権限が必要です:
  • 選出されたマスターノードを持つ実行中のクラスターからのみスナップショットを取得できます。
  • スナップショットリポジトリは登録済みであり、クラスターに利用可能でなければなりません。
  • クラスターのグローバルメタデータは読み取り可能でなければなりません。スナップショットにインデックスを含めるには、そのインデックスとメタデータも読み取り可能である必要があります。クラスターブロックインデックスブロックが読み取りアクセスを妨げていないことを確認してください。

考慮事項

  • 各スナップショットは、そのリポジトリ内で一意の名前を持たなければなりません。既存のスナップショットと同じ名前のスナップショットを作成しようとすると失敗します。
  • スナップショットは自動的に重複排除されます。ストレージオーバーヘッドにほとんど影響を与えずに頻繁にスナップショットを取得できます。
  • 各スナップショットは論理的に独立しています。スナップショットを削除しても、他のスナップショットには影響しません。
  • スナップショットを取得すると、シャードの割り当てが一時的に停止することがあります。スナップショットとシャードの割り当てを参照してください。
  • スナップショットを取得しても、インデックスや他のリクエストはブロックされません。ただし、スナップショットプロセスが開始された後に行われた変更はスナップショットに含まれません。
  • 同時に複数のスナップショットを取得できます。snapshot.max_concurrent_operationsクラスター設定は、同時スナップショット操作の最大数を制限します。
  • データストリームをスナップショットに含めると、スナップショットにはストリームのバックインデックスとメタデータも含まれます。特定のバックインデックスのみをスナップショットに含めることもできます。ただし、スナップショットにはデータストリームのメタデータや他のバックインデックスは含まれません。
  • スナップショットにはデータストリームを含めることができますが、特定のバックインデックスを除外することもできます。そのようなデータストリームを復元すると、スナップショットに含まれるバックインデックスのみが含まれます。ストリームの元の書き込みインデックスがスナップショットに含まれていない場合、スナップショットからの最新のバックインデックスがストリームの書き込みインデックスになります。

SLMを使用してスナップショットを自動化する

スナップショットライフサイクル管理(SLM)は、クラスターを定期的にバックアップする最も簡単な方法です。SLMポリシーは、事前に設定されたスケジュールで自動的にスナップショットを取得します。このポリシーは、定義した保持ルールに基づいてスナップショットを削除することもできます。

Elasticsearch Serviceのデプロイメントには、自動的にcloud-snapshot-policy SLMポリシーが含まれます。Elasticsearch Serviceは、このポリシーを使用してクラスターの定期的なスナップショットを取得します。詳細については、Elasticsearch Serviceスナップショットドキュメントを参照してください。

SLMセキュリティ

次のクラスター権限は、Elasticsearchのセキュリティ機能が有効な場合にSLMアクションへのアクセスを制御します:

  • manage_slm
  • ユーザーがポリシーの作成と更新、SLMの開始と停止を含むすべてのSLMアクションを実行できるようにします。
  • read_slm
  • ユーザーがポリシーの取得やSLMの状態を確認するなど、すべての読み取り専用SLMアクションを実行できるようにします。
  • cluster:admin/snapshot/*
  • ユーザーがインデックスにアクセスできるかどうかにかかわらず、任意のインデックスのスナップショットを取得および削除できるようにします。

これらの権限をKibana Managementを通じて割り当てるために、役割を作成および管理できます。

SLMポリシーとスナップショットを作成および管理するために必要な権限を付与するには、manage_slmおよびcluster:admin/snapshot/*クラスター権限とSLM履歴インデックスへの完全なアクセスを持つ役割を設定できます。

たとえば、次のリクエストはslm-admin役割を作成します:

Python

  1. resp = client.security.put_role(
  2. name="slm-admin",
  3. cluster=[
  4. "manage_slm",
  5. "cluster:admin/snapshot/*"
  6. ],
  7. indices=[
  8. {
  9. "names": [
  10. ".slm-history-*"
  11. ],
  12. "privileges": [
  13. "all"
  14. ]
  15. }
  16. ],
  17. )
  18. print(resp)

Js

  1. const response = await client.security.putRole({
  2. name: "slm-admin",
  3. cluster: ["manage_slm", "cluster:admin/snapshot/*"],
  4. indices: [
  5. {
  6. names: [".slm-history-*"],
  7. privileges: ["all"],
  8. },
  9. ],
  10. });
  11. console.log(response);

コンソール

  1. POST _security/role/slm-admin
  2. {
  3. "cluster": [ "manage_slm", "cluster:admin/snapshot/*" ],
  4. "indices": [
  5. {
  6. "names": [ ".slm-history-*" ],
  7. "privileges": [ "all" ]
  8. }
  9. ]
  10. }

SLMポリシーとスナップショットの履歴への読み取り専用アクセスを付与するには、read_slmクラスター権限とスナップショットライフサイクル管理履歴インデックスへの読み取りアクセスを持つ役割を設定できます。

たとえば、次のリクエストはslm-read-only役割を作成します:

Python

  1. resp = client.security.put_role(
  2. name="slm-read-only",
  3. cluster=[
  4. "read_slm"
  5. ],
  6. indices=[
  7. {
  8. "names": [
  9. ".slm-history-*"
  10. ],
  11. "privileges": [
  12. "read"
  13. ]
  14. }
  15. ],
  16. )
  17. print(resp)

Js

  1. const response = await client.security.putRole({
  2. name: "slm-read-only",
  3. cluster: ["read_slm"],
  4. indices: [
  5. {
  6. names: [".slm-history-*"],
  7. privileges: ["read"],
  8. },
  9. ],
  10. });
  11. console.log(response);

コンソール

  1. POST _security/role/slm-read-only
  2. {
  3. "cluster": [ "read_slm" ],
  4. "indices": [
  5. {
  6. "names": [ ".slm-history-*" ],
  7. "privileges": [ "read" ]
  8. }
  9. ]
  10. }

SLMポリシーの作成

KibanaでSLMを管理するには、メインメニューに移動し、スタック
管理
スナップショットと復元
ポリシーをクリックします。ポリシーを作成するには、ポリシーの作成をクリックします。

SLM APIを使用してSLMを管理することもできます。ポリシーを作成するには、create SLM policy APIを使用します。

次のリクエストは、クラスター状態、すべてのデータストリーム、およびすべてのインデックスを毎日午前1時30分(UTC)にバックアップするポリシーを作成します。

Python

  1. resp = client.slm.put_lifecycle(
  2. policy_id="nightly-snapshots",
  3. schedule="0 30 1 * * ?",
  4. name="<nightly-snap-{now/d}>",
  5. repository="my_repository",
  6. config={
  7. "indices": "*",
  8. "include_global_state": True
  9. },
  10. retention={
  11. "expire_after": "30d",
  12. "min_count": 5,
  13. "max_count": 50
  14. },
  15. )
  16. print(resp)

Js

  1. const response = await client.slm.putLifecycle({
  2. policy_id: "nightly-snapshots",
  3. schedule: "0 30 1 * * ?",
  4. name: "<nightly-snap-{now/d}>",
  5. repository: "my_repository",
  6. config: {
  7. indices: "*",
  8. include_global_state: true,
  9. },
  10. retention: {
  11. expire_after: "30d",
  12. min_count: 5,
  13. max_count: 50,
  14. },
  15. });
  16. console.log(response);

コンソール

  1. PUT _slm/policy/nightly-snapshots
  2. {
  3. "schedule": "0 30 1 * * ?",
  4. "name": "<nightly-snap-{now/d}>",
  5. "repository": "my_repository",
  6. "config": {
  7. "indices": "*",
  8. "include_global_state": true
  9. },
  10. "retention": {
  11. "expire_after": "30d",
  12. "min_count": 5,
  13. "max_count": 50
  14. }
  15. }
スナップショットを取得するタイミング、Cron構文で記述されます。
スナップショット名。 日付数学をサポートしています。命名の競合を防ぐために、ポリシーは各スナップショット名にUUIDを追加します。
ポリシーのスナップショットを復元するために使用される登録済みスナップショットリポジトリ
ポリシーのスナップショットに含めるデータストリームとインデックス。
trueの場合、ポリシーのスナップショットにはクラスター状態が含まれます。これにはデフォルトですべての機能状態も含まれます。特定の機能状態のみを含めるには、特定の機能状態をバックアップを参照してください。
オプションの保持ルール。この設定では、スナップショットを30日間保持し、年齢に関係なく、少なくとも5つ、最大50のスナップショットを保持します。 SLM保持およびスナップショット保持制限を参照してください。

SLMポリシーを手動で実行する

SLMポリシーを手動で実行して、すぐにスナップショットを作成できます。これは、新しいポリシーをテストしたり、アップグレード前にスナップショットを取得したりするのに便利です。ポリシーを手動で実行しても、そのスナップショットスケジュールには影響しません。

Kibanaでポリシーを実行するには、ポリシーページに移動し、アクション列の下にある実行アイコンをクリックします。または、execute SLM policy APIを使用することもできます。

コンソール

  1. POST _slm/policy/nightly-snapshots/_execute

スナップショットプロセスはバックグラウンドで実行されます。その進行状況を監視するには、スナップショットを監視を参照してください。

SLM保持

SLMスナップショット保持は、ポリシーのスナップショットスケジュールとは別に実行されるクラスター全体のタスクです。SLM保持タスクが実行されるタイミングを制御するには、slm.retention_scheduleクラスター設定を構成します。

Python

  1. resp = client.cluster.put_settings(
  2. persistent={
  3. "slm.retention_schedule": "0 30 1 * * ?"
  4. },
  5. )
  6. print(resp)

Ruby

  1. response = client.cluster.put_settings(
  2. body: {
  3. persistent: {
  4. 'slm.retention_schedule' => '0 30 1 * * ?'
  5. }
  6. }
  7. )
  8. puts response

Js

  1. const response = await client.cluster.putSettings({
  2. persistent: {
  3. "slm.retention_schedule": "0 30 1 * * ?",
  4. },
  5. });
  6. console.log(response);

コンソール

  1. PUT _cluster/settings
  2. {
  3. "persistent" : {
  4. "slm.retention_schedule" : "0 30 1 * * ?"
  5. }
  6. }

保持タスクを即座に実行するには、execute SLM retention policy APIを使用します。

Python

  1. resp = client.slm.execute_retention()
  2. print(resp)

Ruby

  1. response = client.slm.execute_retention
  2. puts response

Js

  1. const response = await client.slm.executeRetention();
  2. console.log(response);

コンソール

  1. POST _slm/_execute_retention

SLMポリシーの保持ルールは、そのポリシーを使用して作成されたスナップショットにのみ適用されます。他のスナップショットはポリシーの保持制限にカウントされません。

スナップショット保持制限

不要なスナップショットを削除するために、SLMポリシーに保持ルールを含めることをお勧めします。

スナップショットリポジトリは、数千のスナップショットに安全にスケールできます。ただし、大きなリポジトリは、マスターノードでより多くのメモリを必要とします。保持ルールは、リポジトリのメタデータがマスターノードを不安定にする可能性のあるサイズに成長しないようにします。

スナップショットを手動で作成する

SLMポリシーなしでスナップショットを取得するには、create snapshot APIを使用します。スナップショット名は日付数学をサポートしています。

Python

  1. resp = client.snapshot.create(
  2. repository="my_repository",
  3. snapshot="<my_snapshot_{now/d}>",
  4. )
  5. print(resp)

Ruby

  1. response = client.snapshot.create(
  2. repository: 'my_repository',
  3. snapshot: '<my_snapshot_{now/d}>'
  4. )
  5. puts response

Js

  1. const response = await client.snapshot.create({
  2. repository: "my_repository",
  3. snapshot: "<my_snapshot_{now/d}>",
  4. });
  5. console.log(response);

コンソール

  1. # PUT _snapshot/my_repository/
  2. <my_snapshot_{now/d}>
  3. PUT _snapshot/my_repository/%3Cmy_snapshot_%7Bnow%2Fd%7D%3E

サイズに応じて、スナップショットの完了には時間がかかる場合があります。デフォルトでは、create snapshot APIはスナップショットプロセスを開始するだけで、バックグラウンドで実行されます。スナップショットが完了するまでクライアントをブロックするには、wait_for_completionクエリパラメータをtrueに設定します。

Python

  1. resp = client.snapshot.create(
  2. repository="my_repository",
  3. snapshot="my_snapshot",
  4. wait_for_completion=True,
  5. )
  6. print(resp)

Ruby

  1. response = client.snapshot.create(
  2. repository: 'my_repository',
  3. snapshot: 'my_snapshot',
  4. wait_for_completion: true
  5. )
  6. puts response

Js

  1. const response = await client.snapshot.create({
  2. repository: "my_repository",
  3. snapshot: "my_snapshot",
  4. wait_for_completion: "true",
  5. });
  6. console.log(response);

コンソール

  1. PUT _snapshot/my_repository/my_snapshot?wait_for_completion=true

既存のスナップショットをclone snapshot APIを使用してクローンすることもできます。

スナップショットを監視する

現在実行中のスナップショットを監視するには、get snapshot APIを使用し、_currentリクエストパスパラメータを指定します。

Python

  1. resp = client.snapshot.get(
  2. repository="my_repository",
  3. snapshot="_current",
  4. )
  5. print(resp)

Ruby

  1. response = client.snapshot.get(
  2. repository: 'my_repository',
  3. snapshot: '_current'
  4. )
  5. puts response

Js

  1. const response = await client.snapshot.get({
  2. repository: "my_repository",
  3. snapshot: "_current",
  4. });
  5. console.log(response);

コンソール

  1. GET _snapshot/my_repository/_current

現在実行中のスナップショットに参加している各シャードの完全な内訳を取得するには、get snapshot status APIを使用します。

Python

  1. resp = client.snapshot.status()
  2. print(resp)

Ruby

  1. response = client.snapshot.status
  2. puts response

Js

  1. const response = await client.snapshot.status();
  2. console.log(response);

コンソール

  1. GET _snapshot/_status

SLM履歴の確認

クラスターのSLM実行履歴に関する詳細情報を取得するには、各SLMポリシーの統計を含むget SLM stats APIを使用します。このAPIは、クラスターのスナップショット保持タスク履歴に関する情報も返します。

Python

  1. resp = client.slm.get_stats()
  2. print(resp)

Ruby

  1. response = client.slm.get_stats
  2. puts response

Js

  1. const response = await client.slm.getStats();
  2. console.log(response);

コンソール

  1. GET _slm/stats

特定のSLMポリシーの実行履歴に関する情報を取得するには、get SLM policy APIを使用します。レスポンスには次の情報が含まれます:

  • 次回のスケジュールされたポリシー実行。
  • ポリシーがスナップショットプロセスを正常に開始した最後の時間(該当する場合)。正常な開始は、スナップショットが完了したことを保証するものではありません。
  • ポリシー実行が失敗した最後の時間(該当する場合)と関連するエラー。

Python

  1. resp = client.slm.get_lifecycle(
  2. policy_id="nightly-snapshots",
  3. )
  4. print(resp)

Ruby

  1. response = client.slm.get_lifecycle(
  2. policy_id: 'nightly-snapshots'
  3. )
  4. puts response

Js

  1. const response = await client.slm.getLifecycle({
  2. policy_id: "nightly-snapshots",
  3. });
  4. console.log(response);

コンソール

  1. GET _slm/policy/nightly-snapshots

スナップショットの削除またはキャンセル

Kibanaでスナップショットを削除するには、スナップショットページに移動し、アクション列の下にあるゴミ箱アイコンをクリックします。または、delete snapshot APIを使用できます。

Python

  1. resp = client.snapshot.delete(
  2. repository="my_repository",
  3. snapshot="my_snapshot_2099.05.06",
  4. )
  5. print(resp)

Ruby

  1. response = client.snapshot.delete(
  2. repository: 'my_repository',
  3. snapshot: 'my_snapshot_2099.05.06'
  4. )
  5. puts response

Js

  1. const response = await client.snapshot.delete({
  2. repository: "my_repository",
  3. snapshot: "my_snapshot_2099.05.06",
  4. });
  5. console.log(response);

コンソール

  1. DELETE _snapshot/my_repository/my_snapshot_2099.05.06

進行中のスナップショットを削除すると、Elasticsearchはそれをキャンセルします。スナップショットプロセスは停止し、スナップショットのために作成されたファイルは削除されます。スナップショットを削除しても、他のスナップショットで使用されるファイルは削除されません。

構成ファイルのバックアップ

Elasticsearchを自分のハードウェアで実行している場合は、バックアップに加えて、各ノードの$ES_PATH_CONFディレクトリ内のファイルを定期的にバックアップすることをお勧めします。スナップショットはこれらのファイルをバックアップしません。また、これらのファイルは各ノードで異なるため、各ノードのファイルは個別にバックアップする必要があります。

  1. ## 特定の機能状態をバックアップする
  2. デフォルトでは、クラスター状態を含むスナップショットは、すべての[機能状態](8220cfb6c2f28b72.md#feature-state)も含みます。同様に、クラスター状態を除外するスナップショットは、デフォルトですべての機能状態を除外します。
  3. クラスター状態に関係なく、特定の機能状態のみを含むスナップショットを構成することもできます。
  4. 利用可能な機能のリストを取得するには、[get features API](/read/elasticsearch-8-15/cc32f64bf1460d54.md)を使用します。
  5. #### Python
  6. ``````python
  7. resp = client.features.get_features()
  8. print(resp)
  9. `

Ruby

  1. response = client.features.get_features
  2. puts response

Js

  1. const response = await client.features.getFeatures();
  2. console.log(response);

コンソール

  1. GET _features

APIは次の情報を返します:

コンソール-結果

  1. {
  2. "features": [
  3. {
  4. "name": "tasks",
  5. "description": "Manages task results"
  6. },
  7. {
  8. "name": "kibana",
  9. "description": "Manages Kibana configuration and reports"
  10. },
  11. {
  12. "name": "security",
  13. "description": "Manages configuration for Security features, such as users and roles"
  14. },
  15. ...
  16. ]
  17. }

スナップショットに特定の機能状態を含めるには、namefeature_states配列に指定します。

たとえば、次のSLMポリシーは、KibanaとElasticsearchのセキュリティ機能の機能状態のみをスナップショットに含めます。

Python

  1. resp = client.slm.put_lifecycle(
  2. policy_id="nightly-snapshots",
  3. schedule="0 30 2 * * ?",
  4. name="<nightly-snap-{now/d}>",
  5. repository="my_repository",
  6. config={
  7. "indices": "*",
  8. "include_global_state": True,
  9. "feature_states": [
  10. "kibana",
  11. "security"
  12. ]
  13. },
  14. retention={
  15. "expire_after": "30d",
  16. "min_count": 5,
  17. "max_count": 50
  18. },
  19. )
  20. print(resp)

Js

  1. const response = await client.slm.putLifecycle({
  2. policy_id: "nightly-snapshots",
  3. schedule: "0 30 2 * * ?",
  4. name: "<nightly-snap-{now/d}>",
  5. repository: "my_repository",
  6. config: {
  7. indices: "*",
  8. include_global_state: true,
  9. feature_states: ["kibana", "security"],
  10. },
  11. retention: {
  12. expire_after: "30d",
  13. min_count: 5,
  14. max_count: 50,
  15. },
  16. });
  17. console.log(response);

コンソール

  1. PUT _slm/policy/nightly-snapshots
  2. {
  3. "schedule": "0 30 2 * * ?",
  4. "name": "<nightly-snap-{now/d}>",
  5. "repository": "my_repository",
  6. "config": {
  7. "indices": "*",
  8. "include_global_state": true,
  9. "feature_states": [
  10. "kibana",
  11. "security"
  12. ]
  13. },
  14. "retention": {
  15. "expire_after": "30d",
  16. "min_count": 5,
  17. "max_count": 50
  18. }
  19. }

機能状態の一部であるインデックスまたはデータストリームは、スナップショットの内容に表示されます。たとえば、security機能状態をバックアップすると、security-*システムインデックスがget snapshot APIのレスポンスにindicesfeature_statesの両方の下に表示されます。

専用のクラスター状態スナップショット

一部の機能状態には機密データが含まれています。たとえば、security機能状態には、ユーザー名や暗号化されたパスワードハッシュを含む可能性のあるシステムインデックスが含まれています。パスワードは暗号ハッシュを使用して保存されているため、スナップショットの開示は、第三者があなたのユーザーとして認証したり、APIキーを使用したりすることを自動的に可能にするものではありません。ただし、機密情報が開示され、第三者がスナップショットを変更できる場合、バックドアをインストールされる可能性があります。

このデータをよりよく保護するために、クラスター状態のスナップショット用に専用のリポジトリとSLMポリシーを作成することを検討してください。これにより、リポジトリへのアクセスを厳密に制限および監査できます。

たとえば、次のSLMポリシーは、クラスター状態のみをバックアップします。このポリシーは、これらのスナップショットを専用のリポジトリに保存します。

Python

  1. resp = client.slm.put_lifecycle(
  2. policy_id="nightly-cluster-state-snapshots",
  3. schedule="0 30 2 * * ?",
  4. name="<nightly-cluster-state-snap-{now/d}>",
  5. repository="my_secure_repository",
  6. config={
  7. "include_global_state": True,
  8. "indices": "-*"
  9. },
  10. retention={
  11. "expire_after": "30d",
  12. "min_count": 5,
  13. "max_count": 50
  14. },
  15. )
  16. print(resp)

Js

  1. const response = await client.slm.putLifecycle({
  2. policy_id: "nightly-cluster-state-snapshots",
  3. schedule: "0 30 2 * * ?",
  4. name: "<nightly-cluster-state-snap-{now/d}>",
  5. repository: "my_secure_repository",
  6. config: {
  7. include_global_state: true,
  8. indices: "-*",
  9. },
  10. retention: {
  11. expire_after: "30d",
  12. min_count: 5,
  13. max_count: 50,
  14. },
  15. });
  16. console.log(response);

コンソール

  1. PUT _slm/policy/nightly-cluster-state-snapshots
  2. {
  3. "schedule": "0 30 2 * * ?",
  4. "name": "<nightly-cluster-state-snap-{now/d}>",
  5. "repository": "my_secure_repository",
  6. "config": {
  7. "include_global_state": true,
  8. "indices": "-*"
  9. },
  10. "retention": {
  11. "expire_after": "30d",
  12. "min_count": 5,
  13. "max_count": 50
  14. }
  15. }
クラスター状態を含みます。これにはデフォルトですべての機能状態も含まれます。
通常のデータストリームとインデックスを除外します。

クラスター状態の専用スナップショットを取得する場合は、他のスナップショットからクラスター状態を除外する必要があります。たとえば:

Python

  1. resp = client.slm.put_lifecycle(
  2. policy_id="nightly-snapshots",
  3. schedule="0 30 2 * * ?",
  4. name="<nightly-snap-{now/d}>",
  5. repository="my_repository",
  6. config={
  7. "include_global_state": False,
  8. "indices": "*"
  9. },
  10. retention={
  11. "expire_after": "30d",
  12. "min_count": 5,
  13. "max_count": 50
  14. },
  15. )
  16. print(resp)

Js

  1. const response = await client.slm.putLifecycle({
  2. policy_id: "nightly-snapshots",
  3. schedule: "0 30 2 * * ?",
  4. name: "<nightly-snap-{now/d}>",
  5. repository: "my_repository",
  6. config: {
  7. include_global_state: false,
  8. indices: "*",
  9. },
  10. retention: {
  11. expire_after: "30d",
  12. min_count: 5,
  13. max_count: 50,
  14. },
  15. });
  16. console.log(response);

コンソール

  1. PUT _slm/policy/nightly-snapshots
  2. {
  3. "schedule": "0 30 2 * * ?",
  4. "name": "<nightly-snap-{now/d}>",
  5. "repository": "my_repository",
  6. "config": {
  7. "include_global_state": false,
  8. "indices": "*"
  9. },
  10. "retention": {
  11. "expire_after": "30d",
  12. "min_count": 5,
  13. "max_count": 50
  14. }
  15. }
クラスター状態を除外します。これにはデフォルトですべての機能状態も含まれません。
すべての通常のデータストリームとインデックスを含みます。

異なる時間間隔でスナップショットを作成する

単一のSLMポリシーのみを使用する場合、頻繁にスナップショットを取得し、長い時間間隔でスナップショットを保持することは難しい場合があります。

たとえば、30分ごとにスナップショットを取得し、最大100のスナップショットを保持するポリシーは、約2日間スナップショットを保持します。この設定は最近の変更をバックアップするのに最適ですが、前の週や月からデータを復元することはできません。

これを修正するには、異なるスケジュールで実行される同じスナップショットリポジトリを持つ複数のSLMポリシーを作成できます。ポリシーの保持ルールはそのスナップショットにのみ適用されるため、ポリシーは他のポリシーによって作成されたスナップショットを削除しません。

たとえば、次のSLMポリシーは、最大24のスナップショットを保持し、毎時スナップショットを取得します。このポリシーは、スナップショットを1日保持します。

Python

  1. resp = client.slm.put_lifecycle(
  2. policy_id="hourly-snapshots",
  3. name="<hourly-snapshot-{now/d}>",
  4. schedule="0 0 * * * ?",
  5. repository="my_repository",
  6. config={
  7. "indices": "*",
  8. "include_global_state": True
  9. },
  10. retention={
  11. "expire_after": "1d",
  12. "min_count": 1,
  13. "max_count": 24
  14. },
  15. )
  16. print(resp)

Js

  1. const response = await client.slm.putLifecycle({
  2. policy_id: "hourly-snapshots",
  3. name: "<hourly-snapshot-{now/d}>",
  4. schedule: "0 0 * * * ?",
  5. repository: "my_repository",
  6. config: {
  7. indices: "*",
  8. include_global_state: true,
  9. },
  10. retention: {
  11. expire_after: "1d",
  12. min_count: 1,
  13. max_count: 24,
  14. },
  15. });
  16. console.log(response);

コンソール

  1. PUT _slm/policy/hourly-snapshots
  2. {
  3. "name": "<hourly-snapshot-{now/d}>",
  4. "schedule": "0 0 * * * ?",
  5. "repository": "my_repository",
  6. "config": {
  7. "indices": "*",
  8. "include_global_state": true
  9. },
  10. "retention": {
  11. "expire_after": "1d",
  12. "min_count": 1,
  13. "max_count": 24
  14. }
  15. }

次のポリシーは、同じスナップショットリポジトリで毎晩スナップショットを取得します。このポリシーは、スナップショットを1か月保持します。

Python

  1. resp = client.slm.put_lifecycle(
  2. policy_id="daily-snapshots",
  3. name="<daily-snapshot-{now/d}>",
  4. schedule="0 45 23 * * ?",
  5. repository="my_repository",
  6. config={
  7. "indices": "*",
  8. "include_global_state": True
  9. },
  10. retention={
  11. "expire_after": "30d",
  12. "min_count": 1,
  13. "max_count": 31
  14. },
  15. )
  16. print(resp)

Js

  1. const response = await client.slm.putLifecycle({
  2. policy_id: "daily-snapshots",
  3. name: "<daily-snapshot-{now/d}>",
  4. schedule: "0 45 23 * * ?",
  5. repository: "my_repository",
  6. config: {
  7. indices: "*",
  8. include_global_state: true,
  9. },
  10. retention: {
  11. expire_after: "30d",
  12. min_count: 1,
  13. max_count: 31,
  14. },
  15. });
  16. console.log(response);

コンソール

  1. PUT _slm/policy/daily-snapshots
  2. {
  3. "name": "<daily-snapshot-{now/d}>",
  4. "schedule": "0 45 23 * * ?",
  5. "repository": "my_repository",
  6. "config": {
  7. "indices": "*",
  8. "include_global_state": true
  9. },
  10. "retention": {
  11. "expire_after": "30d",
  12. "min_count": 1,
  13. "max_count": 31
  14. }
  15. }
毎日午後11時45分(UTC)に実行されます。

次のポリシーは、同じリポジトリで月次スナップショットを作成します。このポリシーは、スナップショットを1年間保持します。

Python

  1. resp = client.slm.put_lifecycle(
  2. policy_id="monthly-snapshots",
  3. name="<monthly-snapshot-{now/d}>",
  4. schedule="0 56 23 1 * ?",
  5. repository="my_repository",
  6. config={
  7. "indices": "*",
  8. "include_global_state": True
  9. },
  10. retention={
  11. "expire_after": "366d",
  12. "min_count": 1,
  13. "max_count": 12
  14. },
  15. )
  16. print(resp)

Js

  1. const response = await client.slm.putLifecycle({
  2. policy_id: "monthly-snapshots",
  3. name: "<monthly-snapshot-{now/d}>",
  4. schedule: "0 56 23 1 * ?",
  5. repository: "my_repository",
  6. config: {
  7. indices: "*",
  8. include_global_state: true,
  9. },
  10. retention: {
  11. expire_after: "366d",
  12. min_count: 1,
  13. max_count: 12,
  14. },
  15. });
  16. console.log(response);

コンソール

  1. PUT _slm/policy/monthly-snapshots
  2. {
  3. "name": "<monthly-snapshot-{now/d}>",
  4. "schedule": "0 56 23 1 * ?",
  5. "repository": "my_repository",
  6. "config": {
  7. "indices": "*",
  8. "include_global_state": true
  9. },
  10. "retention": {
  11. "expire_after": "366d",
  12. "min_count": 1,
  13. "max_count": 12
  14. }
  15. }
毎月1日の午後11時56分(UTC)に実行されます。