Sichern von MongoDB mithilfe von Droplet-Snapshots

Einführung

Regelmäßige Datenbanksicherungen sind ein entscheidender Schritt zum Schutz vor unbeabsichtigten Datenverlustereignissen. Im Allgemeinen gibt es zwei große Kategorien von Sicherungen: Sicherungen auf Dateisystemebene ("physisch") und logische Sicherungen. Bei Sicherungen auf Dateisystemebene werden zu einem bestimmten Zeitpunkt Momentaufnahmen der zugrunde liegenden Datendateien erstellt, und die Datenbank kann sich anhand des in den Momentaufnahmen erfassten Zustands sauber wiederherstellen. Bei logischen Sicherungen wird ein Tool verwendet (z. mongodump oderpg_dump) zum Exportieren von Daten aus der Datenbank in Sicherungsdateien, die dann unter Verwendung eines entsprechenden Wiederherstellungstools (z. mongorestore oderpsql <).

In diesem Handbuch wird gezeigt, wie eine Sicherung einer laufenden MongoDB-Installation auf Dateisystemebene mitDroplet Snapshots durchgeführt wird. Außerdem erfahren Sie, wie Sie eine Wiederherstellung aus dem Snapshot-Image durchführen.

Note: Wie in den DigitalOcean-Sicherungenguide beschrieben, gibt es einige Leistungseinbußen bei der Verwendung von Droplet-Snapshots, insbesondere bei hoch geladenen Datenbanken. Sie sollten dieses Verfahren zuerst mit einer Nicht-Produktionsdatenbank mit simulierter Last testen, um zu überprüfen, ob diese Methode in Ihrer Produktionsbereitstellung funktioniert.

Voraussetzungen

Bevor Sie mit diesem Handbuch beginnen, stellen Sie sicher, dass Sie die folgenden erforderlichen Schritte ausgeführt haben:

In diesem Handbuch wird davon ausgegangen, dass MongoDB 3.2+ installiert ist und die standardmäßige WiredTiger-Speicher-Engine mit aktivierter Journalfunktion verwendet wird. Um dieses Handbuch verwenden zu können, ist es außerdem wichtig, dass das Verzeichnisdbpath (das Verzeichnis mit den Datendateien, standardmäßig/var/lib/mongodb) einem einzelnen Volume zugeordnet ist. Wenn Sie Ihrem Droplet keine zusätzlichen Blockspeicher-Volumes hinzugefügt haben, befolgen Sie diese Anleitung.

Sobald Sie sich bei Ihrem Droplet angemeldet haben und MongoDB ausgeführt wird, können Sie loslegen.

[[Schritt 1 - Überprüfen Sie Ihr Mongodb-Setup]] == Schritt 1 - Überprüfen Sie Ihr MongoDB-Setup

Wir werden zuerst überprüfen, ob das Journaling aktiviert wurde.

Journaling ist eine MongoDB-Funktion, die im Falle eines Datenbankfehlers Haltbarkeit bietet, indem Vorgänge in Journaldateien geschrieben werden. Weitere Informationen zum MongoDB-Journaling finden Sie unterMongoDB Manual.

Wenn Sie die obigen Anweisungen befolgt haben, ist die Journalfunktion standardmäßig aktiviert. Um dies zu bestätigen, können wir die MongoDB-Konfigurationsdatei überprüfen.

Öffnen Sie/etc/mongod.conf mit Ihrem bevorzugten Texteditor, z. B. nano:

nano /etc/mongod.conf

Sie sollten den folgenden Block sehen:

/etc/mongod.conf

# Where and how to store data.
storage:
  dbPath: /var/lib/mongodb
  journal:
    enabled: true
#  engine:
#  mmapv1:
#  wiredTiger:

Dies zeigt an, dass die Aufzeichnung aktiviert wurde. Wenn Sie MongoDB 3.2 oder höher verwenden, ist WiredTiger die Standardspeicherengine (MMAPv1 war die ursprüngliche Speicherengine von MongoDB).

Wir fügen jetzt einige Dummy-Daten ein, um das Sicherungs- und Wiederherstellungsverfahren zu testen.

[[Schritt-2 -—- Testdaten einfügen]] == Schritt 2 - Testdaten einfügen

Wenn Sie mit einem sauberen Server begonnen haben und noch keine Daten haben, können wir zu Demonstrationszwecken einige Beispieldaten in die Sammlung eines Dummyrestaurantseinfügen. Wenn Sie bereits einige Sammlungen und Dokumente in Ihrer Datenbank gespeichert haben, können Sie diesen Schritt überspringen.

Stellen Sie zunächst mit der MongoDB-Shell eine Verbindung zur laufenden Datenbank her:

mongo

Sie sollten die folgende Mongo-Shell-Eingabeaufforderung sehen:

MongoDB shell version: 3.2.19
connecting to: test
Server has startup warnings:
2018-02-16T02:40:13.071+0000 I CONTROL  [initandlisten]
2018-02-16T02:40:13.071+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2018-02-16T02:40:13.071+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-02-16T02:40:13.071+0000 I CONTROL  [initandlisten]
2018-02-16T02:40:13.071+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2018-02-16T02:40:13.071+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-02-16T02:40:13.071+0000 I CONTROL  [initandlisten]
>

Die Standarddatenbank, die die Shell verwendet, ist dietest-Datenbank.

Lassen Sie uns die in dertest-Datenbank vorhandenen Sammlungen auflisten:

show collections

Da wir noch nichts in die Datenbank eingefügt haben, gibt es keine Sammlungen und wir werden ohne Ausgabe zur Eingabeaufforderung zurückgebracht.

Fügen Sie ein Dokument in die Sammlung eines Dummyrestaurantsein, das wir gleichzeitig erstellen:

db.restaurants.insert({'name': 'Sammy's Pizzeria'})

Sie sollten die folgende Ausgabe sehen:

WriteResult({ "nInserted" : 1 })

Dies zeigt an, dass der Einfügevorgang erfolgreich war. Da die Sammlung vonrestaurantszuvor nicht vorhanden war, wurde sie gleichzeitig erstellt.

Lassen Sie uns noch einmal Sammlungen auflisten:

show collections

Wir sehen jetzt unsere neu erstellterestaurants-Sammlung:

restaurants

Nachdem wir einige Beispieldaten in der Datenbank gespeichert haben, können wir sie jetzt sichern.

[[Schritt-3 -—- Schnappschuss-das-Mongodb-Tröpfchen]] == Schritt 3 - Schnappschuss des MongoDB-Tröpfchens

Um die Sicherung durchzuführen, werden wir DigitalOceanDroplet Snapshots nutzen. Droplet-Snapshots ermöglichen es uns, ein Bild des Droplets zu dem Zeitpunkt zu erstellen, zu dem der Snapshot gestartet wurde. Dieses Image kann dann in einem neuen Droplet wiederhergestellt werden, in dem weitere Wiederherstellungsvorgänge stattfinden können.

Da MongoDB 3.2+ (mit WiredTiger und aktivierter Journalfunktion) verwendet wird, müssen Schreibvorgänge im Dateisystem nicht angehalten werden, während der Snapshot ausgeführt wird. Sobald das Image wiederhergestellt und die Datenbank gestartet wurde, stellt sich MongoDB von einem Prüfpunkt aus selbst wieder her und gibt die Vorgänge aus den Journaldateien wieder, bis der Zeitpunkt erreicht ist, an dem der Snapshot erstellt wurde. Wenn Sie das Journaling weiter erforschen möchten, konsultieren SieMongoDB Manual,

Um den Snapshot-Prozesslog in to your DigitalOcean account zu starten, navigieren Sie zu Ihrem MongoDB-Droplet und klicken Sie auf den LinkSnapshots in der Seitenleiste.

Sie sollten die folgende Eingabeaufforderung sehen:

Take Snapshot

Note: Obwohl empfohlen wird, das Droplet vor dem Erstellen eines Snapshots auszuschalten, ist dies in Produktionsbereitstellungen möglicherweise nicht immer möglich. Die Journalfunktion von MongoDB ermöglicht konsistente und gültige Snapshots, auch wenn die Datenbank und Droplet ausgeführt werden.

Geben Sie Ihrem Snapshot einen beschreibenden Namen und klicken Sie auf die SchaltflächeTake Live Snapshot, um den Snapshot-Vorgang zu starten.

Sie sollten die folgende Anzeige des Schnappschussfortschritts sehen:

Snapshot Progress

Sobald der Schnappschuss fertig ist, können Sie aus dem Bild ein neues Droplet erstellen oder das ausgeführte Droplet in dem in Ihrem Schnappschussbild erfassten Zustand wiederherstellen.

Jetzt können Sie eine Wiederherstellung und Validierung des Sicherungsvorgangs durchführen.

[[Schritt-4 -—-Wiederherstellen-des-Mongodb-Tröpfchens]] == Schritt 4 - Wiederherstellen des MongoDB-Tröpfchens

Jetzt erstellen wir ein neues Droplet, das aus dem soeben erstellten Image wiederhergestellt wird. Die in unserer MongoDB-Datenbank verfügbaren Daten sind dieselben, die zum Zeitpunkt der Erstellung des Snapshots verfügbar waren.

Navigieren Sie mithilfe der Seitenleiste zurück zuSnapshots und suchen Sie Ihren fertigen Droplet-Snapshot.

Completed Snapshot

Klicken Sie inMore und wählen SieCreate Droplet aus.

Sie werden zumCreate Droplet-Menü weitergeleitet, in dem Sie ein neues Droplet aus Ihrem Schnappschuss erstellen können.

Wählen Sie das Bild aus, das dem zuvor aufgenommenen Schnappschuss entspricht. In diesem Fall verwenden wir das Bildmongo-backup-test.

Choose Image

Beenden Sie die Konfiguration Ihres Wiederherstellungs-Droplets und klicken Sie aufCreate. Sobald Ihr Wiederherstellungs-Droplet ausgeführt wird, melden Sie sich an.

Wenn Sie MongoDB so konfiguriert haben, dass es beim Start von Droplet gestartet wird, sollte es jetzt ausgeführt werden. Sie können dies mitsystemctl überprüfen:

sudo systemctl status mongod

Sie sollten die folgende Ausgabe sehen:

Output● mongod.service - High-performance, schema-free document-oriented database
   Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2018-02-14 21:14:40 UTC; 4min 53s ago
     Docs: https://docs.mongodb.org/manual
 Main PID: 1302 (mongod)
    Tasks: 19
   Memory: 87.2M
      CPU: 1.802s
   CGroup: /system.slice/mongod.service
           └─1302 /usr/bin/mongod --quiet --config /etc/mongod.conf

Zeigt an, dass alles in Ordnung ist und MongoDB korrekt gestartet wurde.

Wenn MongoDB nicht ausgeführt wird, müssen wir zuerst die Sperrdatei löschen und dann den Dienst starten:

rm /var/lib/mongodb/mongod.lock
sudo systemctl start mongod

Stellen Sie sicher, dass MongoDB mitsystemctl status korrekt gestartet wurde.

Sobald MongoDB in Betrieb ist, beginnt es, sich selbst zu bereinigen und seinen Zustand bis zu dem Zeitpunkt wiederherzustellen, an dem der Snapshot erstellt wurde. Dies kann einige Minuten dauern und die Shell vonmongoist möglicherweise erst verfügbar, wenn dies abgeschlossen ist.

Sobald der Server verfügbar ist, können wir uns mit dem Befehlmongo anmelden:

mongo

Sie erhalten jetzt die Eingabeaufforderung für die Mongo-Shell:

OutputMongoDB shell version: 3.2.19
connecting to: test
Server has startup warnings:
2018-02-14T21:14:41.923+0000 I CONTROL  [initandlisten]
2018-02-14T21:14:41.923+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2018-02-14T21:14:41.923+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-02-14T21:14:41.923+0000 I CONTROL  [initandlisten]
2018-02-14T21:14:41.923+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2018-02-14T21:14:41.923+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-02-14T21:14:41.923+0000 I CONTROL  [initandlisten]
>

Wenn Sie es bis hierher geschafft haben, herzlichen Glückwunsch! Sie haben erfolgreich eine Sicherung und Wiederherstellung Ihrer MongoDB-Datenbank durchgeführt.

Als zusätzliche Vorsichtsmaßnahme können wir die Integrität unserer Sammlungen überprüfen.

[[Schritt 5 - Datenintegrität prüfen]] == Schritt 5 - Datenintegrität prüfen

Vor der produktiven Verwendung dieser Sicherungsdaten ist es hilfreich, die wiederhergestellten Sammlungen auf ungültige BSON-Objekte zu überprüfen.

Note: Der Befehlvalidate kann bei sehr großen Sammlungen langsam sein. Außerdem werden alle Lese- und Schreibvorgänge in der Sammlung blockiert, bis der Befehlvalidate zurückgegeben wird.

In diesem Beispiel haben wir eine Sammlung mit dem Namenrestaurants, für die wir den Befehlvalidate ausführen möchten.

Führen Sie in der Mongo-Shell den Befehl validate aus:

db.restaurants.validate({full:true})

Sie sollten eine ähnliche Ausgabe wie die folgende sehen:

{
    "ns" : "test.restaurants",
    "nrecords" : 1,
    "nIndexes" : 1,
    "keysPerIndex" : {
        "test.restaurants.$_id_" : 1
    },
    "indexDetails" : {
        "test.restaurants.$_id_" : {
            "valid" : true
        }
    },
    "valid" : true,
    "errors" : [ ],
    "ok" : 1
}

Wenn Sievalid: true sehen, sind alle Aspekte Ihrer Sammlung gültig und Sie können Daten aus dieser Sammlung sicher in der Produktion verwenden.

Fazit

In diesem Tutorial haben wir gelernt, wie eine physische Sicherung eines laufenden MongoDB-Datenbankservers auf Dateisystemebene durchgeführt wird.

Weitere Informationen zu verschiedenen Methoden zum Sichern einer MongoDB-Datenbank finden Sie inMongoDB manual.

Diese besondere Sicherungstechnik wurde durch die praktische Droplet Snapshots-Funktion von DigitalOcean ermöglicht. Weitere Informationen zu Droplet-Snapshots finden Sie inSnapshot docs.

Darüber hinaus können Sie diese Snapshots mithilfe der Sicherungsfunktion so planen, dass sie automatisch erstellt werden. Weitere Informationen zu Droplet-Backups finden Sie inBackups Introduction.