Großer Mongodump, gefolgt von Mongorestore

7

Ich habe eine ziemlich große Mongo-Datenbank (~ 240 GB), die ich über ein träges Netzwerk auf einen neuen Server übertragen muss.

Traditionell für diese Situationen habe ich festgestellt , dass ein , mongodumpgefolgt von einem mongorestorewar viel schneller als ein db.cloneCollection()Verfahren. Heute wurde mir jedoch klar, dass es etwas verschwenderisch ist, ein vollständiges mongodumpgefolgt von einem zu machen mongorestore(glaube ich), da ich die gesamte Datenübertragung und dann alle Einfügungen durchführe.

Ich würde es vorziehen, Daten vom alten Mongo (dem mongodumpSchritt) zu übertragen und gleichzeitig verfügbare Daten in die neue Datenbank (den mongorestoreSchritt) einzufügen.

Weiß jemand, wie man den Dumping- und Einfügeprozess in MongoDB parallelisiert? (Und wäre das tatsächlich schneller?)

therealrootuser
quelle
Haben Sie darüber nachgedacht, eine Dateisystemsicherung oder einen lvm-Snapshot durchzuführen? Dies ist viel schneller als Mongodump / Mongorestore.
Iľja
Ich habe zwischen Mongo-Versionen gewechselt, daher bin ich mir nicht sicher, ob das funktionieren würde.
Therealrootuser

Antworten:

12

Zunächst können Sie eine Pfeife verwenden

mongodump -h sourceHost -d yourDatabase  | mongorestore -h targetHost -d yourDatabase 

Dies verkürzt die Zeit, da jedes gelesene Dokument mehr oder weniger sofort wiederhergestellt wird targetHost.

Dies hat jedoch den Nachteil, dass Sie möglicherweise auf Probleme stoßen, wenn der Vorgang aus irgendeinem Grund abgebrochen wird, z. B. aufgrund eines Netzwerkfehlers. In Bezug auf die Parallelisierung könnten Sie die oben genannten Schritte für jede Sammlung ausführen, aber ich bezweifle, dass Sie einen Leistungsgewinn erzielen werden, da der begrenzende Faktor höchstwahrscheinlich E / A ist, und selbst wenn nicht, wird die Parallelität höchstwahrscheinlich ein Killer sein.

Ich würde ein temporäres Replikatset erstellen , das aus dem alten Server, dem neuen Server und einem Arbiter besteht. Die anfängliche Synchronisierung ist ziemlich schnell, und selbst wenn Sie auf Netzwerkprobleme stoßen, stellt der Synchronisierungsmechanismus sicher, dass alles in Ordnung ist. Nach der ersten Synchronisierung wird der alte Server einfach als primärer Server heruntergefahren und der neue Server ohne die Option replSetName neu gestartet , sodass er wieder eigenständig wird. Jetzt können Sie eine Verbindung zum neuen Server herstellen und alle Daten werden übertragen.

Der Vorteil ist, dass dies mit minimalen Ausfallzeiten und ohne Anwesenheit funktioniert. Nachdem Sie den Replikatsatz initialisiert haben, kann Ihre Anwendung weiterhin den alten Server verwenden, und selbst neue Daten werden automatisch auf den neuen Server übertragen. Sie müssen also nicht daneben sitzen - und wir alle wissen, dass der Prozess wahrscheinlich um 3 Uhr morgens abgeschlossen sein wird, unabhängig von der Zeitzone. ;) Jedes Mal , nachdem die erste Synchronisierung abgeschlossen ist (noch Stunden oder Tage später), können Sie den neuen Server ein eigenständiges, und Ihre Anwendung Verbindungszeichenfolge ändern , um den neuen Server. Dies ist eine Frage von 2 oder 3 Minuten, wenn dies richtig geplant ist.

Bearbeiten

Diese Methode hat jedoch einen Nachteil: Sie können nur von einer Version auf eine höhere Version aktualisieren. Wenn Sie also von 2.4 (Archäologie zum Zeitpunkt dieses Schreibens) auf 3.4 (Schneide) migrieren, müssen Sie den Vorgang mehrmals wiederholen:

  • Von 2,4 bis 2,6
  • Von 2,6 bis 3,0
  • Von 3.0 bis 3.2
  • Von 3.2 bis 3.4
Markus W Mahlberg
quelle
5

Die akzeptierte Antwort funktionierte bei mir nicht, da einige Parameter fehlten:

mongodump --host source:port --db databasename --gzip --archive | \
mongorestore --drop -vvvvvv -h target:port --db databasename --gzip --archive

--gzipkann und sollte wahrscheinlich weggelassen werden, da dies nur die Daten in der Pipe (auf dem Bus der Maschine, die den Befehl ausführt) komprimiert, nicht jedoch die Daten (über das Kabel) zwischen den Datenbanken und der Maschine, die den Befehl ausführt. Möglicherweise verursacht es nur unnötigen Rechenaufwand. Wenn ich mich nicht irre, komprimiert MongoDB die Daten trotzdem über das Kabel (zwischen Server und Treiber).

--archiveohne Dateinamen schreibt in stdoutbzw. liest aus stdin, wenn kein Dateiname angegeben ist

--drop Ersetzt die Zieldatenbank vollständig.

Daniel F.
quelle