47 Backup und Recovery

Daten sind einer Ihrer wertvollsten Vermögenswerte, und ihr Verlust kann für Ihre Organisation katastrophal sein. OpenSearch bietet robuste Mechanismen für Backup und Recovery Ihrer Daten und gewährleistet damit die Geschäftskontinuität auch bei unerwarteten Ereignissen. In diesem Kapitel erfahren Sie, wie Sie umfassende Backup- und Recovery-Strategien implementieren, die Ihre Daten schützen und gleichzeitig die Systemleistung aufrechterhalten.

47.1 OpenSearch Snapshots verstehen

Stellen Sie sich Snapshots in OpenSearch wie eine Momentaufnahme Ihrer Daten zu einem bestimmten Zeitpunkt vor. Genau wie ein Foto den exakten Zustand einer Szene erfasst, speichert ein Snapshot den exakten Zustand Ihrer Indizes, einschließlich ihrer Daten, Mappings und Einstellungen. Sehen wir uns an, wie das im Detail funktioniert.

47.1.1 Das Snapshot-Repository

Bevor wir Snapshots erstellen können, benötigen wir einen Speicherort für sie. OpenSearch unterstützt verschiedene Repository-Typen, jeder mit eigenen Vorteilen. Richten wir beispielsweise ein Repository mit Amazon S3 ein:

PUT /_snapshot/backup_repository
{
  "type": "s3",
  "settings": {
    "bucket": "my-opensearch-backups",
    "region": "us-west-2",
    "compress": true,
    "chunk_size": "256mb",
    "base_path": "snapshots",
    "canned_acl": "private"
  }
}

Diese Konfiguration erstellt ein sicheres, effizientes Repository für unsere Snapshots. Die gewählten Einstellungen optimieren sowohl Sicherheit als auch Performance:

47.1.2 Ihren ersten Snapshot erstellen

Sobald unser Repository konfiguriert ist, können wir unseren ersten Snapshot erstellen. Beginnen wir mit einem einfachen Beispiel:

PUT /_snapshot/backup_repository/snapshot_1
{
  "indices": "products,orders,customers",
  "ignore_unavailable": true,
  "include_global_state": true,
  "metadata": {
    "taken_by": "system",
    "taken_because": "daily_backup",
    "timestamp": "2024-01-14T00:00:00Z"
  }
}

Dieser Befehl erstellt einen Snapshot mit wichtigen Eigenschaften:

47.2 Automatisierte Backup-Strategien implementieren

Manuelle Snapshots sind nützlich, aber automatisierte Backups gewährleisten konsistenten Datenschutz. Implementieren wir eine umfassende Backup-Strategie.

47.2.1 Eine Snapshot Lifecycle Policy erstellen

Zunächst definieren wir eine Policy, die unseren Backup-Prozess automatisiert:

PUT /_slm/policy/daily_backup_policy
{
  "schedule": "0 0 1 * * ?",  // Ausführung um 1 Uhr morgens täglich
  "name": "<daily-snap-{now/d}>",
  "repository": "backup_repository",
  "config": {
    "indices": ["*"],
    "ignore_unavailable": true,
    "include_global_state": true,
    "metadata": {
      "backup_type": "daily",
      "retention_days": 30
    }
  },
  "retention": {
    "expire_after": "30d",
    "min_count": 5,
    "max_count": 50
  }
}

Diese Policy implementiert mehrere Best Practices:

47.2.2 Backup-Status überwachen

Die Überwachung Ihrer Backups ist entscheidend. Hier ist eine Implementierung eines umfassenden Backup-Monitorings:

PUT _plugins/_alerting/monitors/backup_monitor
{
  "type": "monitor",
  "name": "Backup Status Monitor",
  "enabled": true,
  "schedule": {
    "period": {
      "interval": 1,
      "unit": "HOURS"
    }
  },
  "inputs": [
    {
      "search": {
        "indices": [".slm-history-*"],
        "query": {
          "bool": {
            "must": [
              {
                "range": {
                  "start_time": {
                    "gte": "now-24h"
                  }
                }
              },
              {
                "term": {
                  "policy": "daily_backup_policy"
                }
              },
              {
                "term": {
                  "success": false
                }
              }
            ]
          }
        }
      }
    }
  ],
  "triggers": [
    {
      "name": "Backup-Fehler-Alert",
      "severity": "High",
      "condition": {
        "script": {
          "source": "ctx.results[0].hits.total.value > 0"
        }
      },
      "actions": [
        {
          "name": "Ops-Team benachrichtigen",
          "destination_id": "ops_slack",
          "message_template": {
            "source": "Backup-Fehler erkannt für daily_backup_policy. Bitte sofort untersuchen."
          }
        }
      ]
    }
  ]
}

47.3 Recovery-Prozeduren implementieren

Recovery-Prozeduren müssen gut dokumentiert und getestet sein. Betrachten wir verschiedene Recovery-Szenarien und ihre Implementierungen.

47.3.1 Vollständige Cluster-Recovery

Wenn Sie einen gesamten Cluster wiederherstellen müssen, folgen Sie diesen Schritten:

# Schritt 1: Snapshot-Verfügbarkeit prüfen
GET /_snapshot/backup_repository/snapshot_1

# Schritt 2: Indizes schließen, falls sie existieren
POST /products,orders,customers/_close

# Schritt 3: Aus Snapshot wiederherstellen
POST /_snapshot/backup_repository/snapshot_1/_restore
{
  "indices": "products,orders,customers",
  "include_global_state": true,
  "include_aliases": true,
  "ignore_unavailable": true,
  "rename_pattern": "(.+)",
  "rename_replacement": "restored_$1",
  "index_settings": {
    "index.number_of_replicas": 0
  }
}

# Schritt 4: Wiederherstellungsfortschritt überwachen
GET /_recovery

47.3.2 Point-in-Time Recovery

Für granularere Recovery-Anforderungen können wir die Point-in-Time-Funktionalität nutzen:

# Schritt 1: Point-in-Time-ID erstellen
POST /products/_pit
{
  "keep_alive": "1h"
}

# Schritt 2: PIT-ID in der Recovery verwenden
POST /products/_clone/products_recovered
{
  "settings": {
    "index.number_of_replicas": 0
  },
  "aliases": {
    "products_current": {}
  }
}

47.4 Disaster Recovery Planung

Ein umfassender Disaster Recovery Plan beinhaltet mehrere Komponenten. Implementieren wir die wichtigsten Elemente:

47.4.1 Recovery Time Objective (RTO) Testing

Hier ein Skript zur Messung der Recovery-Zeit:

def measure_recovery_time(snapshot_name, indices):
    """
    Misst die Zeit, die für die Wiederherstellung bestimmter Indizes benötigt wird.
    
    Args:
        snapshot_name: Name des wiederherzustellenden Snapshots
        indices: Liste der wiederherzustellenden Indizes
        
    Returns:
        Dictionary mit Recovery-Metriken
    """
    start_time = time.time()
    
    # Recovery starten
    recovery_response = client.snapshot.restore(
        repository="backup_repository",
        snapshot=snapshot_name,
        body={
            "indices": ",".join(indices),
            "include_global_state": False
        }
    )
    
    # Recovery-Fortschritt überwachen
    while True:
        recovery_status = client.indices.recovery(index=",".join(indices))
        if all(shard["stage"] == "DONE" 
               for index in recovery_status.values()
               for shard in index["shards"]):
            break
        time.sleep(10)
    
    end_time = time.time()
    
    return {
        "total_time": end_time - start_time,
        "indices_recovered": len(indices),
        "snapshot_name": snapshot_name
    }

47.4.2 Regelmäßige Recovery-Tests

Implementieren Sie regelmäßige Recovery-Tests, um sicherzustellen, dass Ihre Backup-Strategie funktioniert:

PUT _plugins/_alerting/monitors/recovery_test_monitor
{
  "type": "monitor",
  "name": "Wöchentlicher Recovery-Test",
  "enabled": true,
  "schedule": {
    "period": {
      "interval": 1,
      "unit": "WEEKS"
    }
  },
  "inputs": [
    {
      "search": {
        "indices": ["test_recovery_results*"],
        "query": {
          "range": {
            "timestamp": {
              "gte": "now-7d"
            }
          }
        }
      }
    }
  ],
  "triggers": [
    {
      "name": "Recovery-Test erforderlich",
      "severity": "High",
      "condition": {
        "script": {
          "source": "ctx.results[0].hits.total.value == 0"
        }
      },
      "actions": [
        {
          "name": "Recovery-Test initiieren",
          "destination_id": "recovery_test_webhook",
          "message_template": {
            "source": "Wöchentlicher Recovery-Test ist fällig. Bitte Testprozedur einleiten."
          }
        }
      ]
    }
  ]
}

47.5 Performance-Überlegungen

Backup- und Recovery-Operationen können die Cluster-Performance beeinflussen. Implementieren wir Strategien, um diese Auswirkungen zu minimieren:

47.5.1 Backup-Operationen drosseln

Konfigurieren Sie Throttling, um Backup-Geschwindigkeit und Cluster-Performance auszubalancieren:

PUT /_cluster/settings
{
  "persistent": {
    "indices.recovery.max_bytes_per_sec": "40mb",
    "indices.recovery.max_concurrent_file_chunks": 2,
    "indices.recovery.max_concurrent_operations": 1
  }
}

47.5.2 Backup-Fenster-Management

Planen Sie Backups während Zeiten geringer Auslastung:

PUT /_slm/policy/backup_window_policy
{
  "schedule": "0 0 2 * * ?",  // 2 Uhr morgens täglich
  "name": "<nightly-backup-{now/d}>",
  "repository": "backup_repository",
  "config": {
    "indices": ["*"],
    "ignore_unavailable": true,
    "include_global_state": true,
    "metadata": {
      "backup_type": "nightly",
      "retention_days": 30
    }
  },
  "retention": {
    "expire_after": "30d",
    "min_count": 7,
    "max_count": 30
  }
}

47.6 Best Practices und Richtlinien

Bei der Implementierung von Backup- und Recovery-Strategien sollten Sie diese Grundprinzipien beachten:

Tests und Validierung:

Performance-Management:

Sicherheitsaspekte: