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 , mongodump
gefolgt von einem mongorestore
war viel schneller als ein db.cloneCollection()
Verfahren. Heute wurde mir jedoch klar, dass es etwas verschwenderisch ist, ein vollständiges mongodump
gefolgt 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 mongodump
Schritt) zu übertragen und gleichzeitig verfügbare Daten in die neue Datenbank (den mongorestore
Schritt) einzufügen.
Weiß jemand, wie man den Dumping- und Einfügeprozess in MongoDB parallelisiert? (Und wäre das tatsächlich schneller?)
Antworten:
Zunächst können Sie eine Pfeife verwenden
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:
quelle
Die akzeptierte Antwort funktionierte bei mir nicht, da einige Parameter fehlten:
--gzip
kann 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).--archive
ohne Dateinamen schreibt instdout
bzw. liest ausstdin
, wenn kein Dateiname angegeben ist--drop
Ersetzt die Zieldatenbank vollständig.quelle