Mongodb inkrementelle Sicherungen

26

Ich hatte die Aufgabe, inkrementelle Backups für das MongoDB-Replikatset einzurichten. Als Startpunkt habe ich natürlich gegoogelt und konnte nichts in MongoDB-Dokumenten finden. Diese Frage zu Stack Overflow hat mich jedoch dazu veranlasst, eine eigene Lösung zu entwickeln Tayra war nicht sehr aktiv.

Ich habe darüber gelesen oplogund festgestellt, dass es sehr einfach war, etwas zu entwickeln, um das Protokoll wiederzugeben, aber es stellte sich heraus, dass ich das nicht musste, wie mongorestorees für mich der Fall war.

Jetzt habe ich eine funktionierende Lösung mit Bash-Skripten und es war ziemlich einfach. Aus diesem Grund frage ich mich hier, ob meine Logik einen Fehler aufweist oder vielleicht etwas, das mich in Zukunft beißen wird.

Nachfolgend, wie ich das umgesetzt habe:

Vollständiger Sicherungsvorgang

  1. Sperre schreibt auf ein sekundäres Mitglied db.fsyncLock()
  2. Schnappschuss machen
  3. Notiere die letzte Position von oplog

    db.oplog.rs.find().sort({$natural:-1}).limit(1).next().ts
  4. Schreibvorgänge entsperren db.fsyncUnlock()

Inkrementelle Sicherung

  1. Sperre schreibt auf ein sekundäres Mitglied
  2. Erstellen Sie einen Speicherauszug von der aufgezeichneten Oplog-Position bei einer vollständigen (oder letzten inkrementellen) Sicherung:

    mongodump --host <secondary> -d local -c oplog.rs -o /mnt/mongo-test_backup/1 
        --query '{ "ts" : { $gt :  Timestamp(1437725201, 50) } }'
  3. Letzte Oplog-Position aufzeichnen (wie bei vollständigen Backups)

  4. Schreibvorgänge entsperren

Vollständige Sicherung Wiederherstellungsvorgang

  1. stoppen Sie alle Instanzen von mongod
  2. Snapshot Datenverzeichnis der Box kopieren , die die primären sein werden, aber sicher , dass alle ausschließen machen local*und mongod.lock diese Restore - Technik genannt wird recon durch den Spiegel brechen
  3. Primär starten
  4. Konfigurieren Sie das Replicaset neu
  5. Starten Sie Secondaries ohne Daten, und lassen Sie sie die erste Synchronisierung durchführen. Oder kopieren Sie die Daten von der neuen Primärdatenbank mit einer neuen localDatenbank

Inkrementelle Sicherung wiederherstellen

Als wir ein inkrementelles Backup erstellt haben, wurde es folgendermaßen gespeichert:

/mnt/mongo-test_backup/1/local/oplog.rs.bson
/mnt/mongo-test_backup/1/local/oplog.rs.metadata.json

Wir werden weitergeleitet, oplog.rs.bsonaber wir müssen es umbenennen, also sind hier die Schritte:

  1. Wechseln Sie in das Sicherungsverzeichnis: cd /mnt/mongo-test_backup/1/local
  2. Löschen Sie die JSON-Datei rm *.json
  3. benennen sie die bson datei um mv oplog.rs.bson oplog.bson
  4. stelle es wieder her:

    mongorestore -h <primary> --port <port> --oplogReplay /mnt/mongo-test_backup/1/local

Ich habe alles geskriptet, ich kann es später auf GitHub festschreiben.

Die Frage ist, ob es einen Fehler in der Logik gibt. Ich bin ein bisschen misstrauisch, da das Verfahren recht unkompliziert ist und ich es dennoch nirgendwo dokumentiert finden konnte.

Tiago
quelle
2
Welche Mongo-Version verwendest du? Wenn Sie wiredtiger verwenden, ist das erste Element, auf das Sie mit db.fsyncLock () verwiesen haben, ein Problem. MongoDB Inc behauptet: "Mit WiredTiger kann der Befehl fsync mit der Option lock nicht garantieren, dass sich die Datendateien nicht ändern. Verwenden Sie diese Methoden daher nicht, um die Konsistenz zum Erstellen von Sicherungen sicherzustellen." Link
SDillon
1
@SDillon mit 3.0.4, aber noch nicht mit WiredTiger, zumindest noch nicht. Wenn wir uns dazu entschließen, es zu verwenden, müssen wir anstelle von Schreibvorgängen aufhören, alle gemeinsam zu mongodieren. Es ist ein fairer Punkt, danke
Tiago
Ich fand das folgende Tool für inkrementelle Sicherung github.com/EqualExperts/Tayra hoffe, dies wird helfen
Ahmad Abuhasna
1
"In Version 3.2 geändert: Der Befehl fsync mit der Option lock kann sicherstellen, dass sich die Datendateien für MongoDB-Instanzen weder mit der MMAPv1- noch mit der WiredTiger-Speicher-Engine ändern. Auf diese Weise wird Konsistenz für die Erstellung von Sicherungen gewährleistet."
Sicherheit
Die normale (und absolut einfachste) Möglichkeit, inkrementelle Sicherungen durchzuführen, ist die Verwendung von LVM und Snapshots. docs.mongodb.com/manual/tutorial/…
JJussi

Antworten:

3

Zur Beantwortung Ihrer Frage. Nein! Ihre Logik ist fehlerfrei und sollte problemlos funktionieren. Wenn jedoch LVM-Snapshots verwendet werden können, ist es besser, Backups durchzuführen.

JJussi
quelle
Wie können Sie inkrementelle Sicherungen eines LVM-Snapshots durchführen? Vielen Dank!
TanisDLJ
LVM-Snapshots sind von Natur aus inkrementell. Momentaufnahmen sind Momentaufnahmen und es werden nur Änderungen aufgezeichnet.
JJussi
Nur ein Schnappschuss gemacht ja, es ist inkrementell. Wenn Sie den Snapshot jedoch archivieren, handelt es sich um eine vollständige Sicherung. Sie können keine unterschiedlichen inkrementellen Sicherungen archivieren, wie dies beispielsweise bei Duplizität der Fall ist. Und Sie können nicht einfach alle 30 Minuten Snapshots für inkrementelle Backups erstellen, da dies die Leistung erheblich beeinträchtigen würde.
TanisDLJ