MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Synchronisieren Sie MongoDB über ssh

Sie können dies mit SSH-Tunneling erreichen, indem Sie Ihre Remote-MongoDB-Instance so einrichten, dass sie auf einem Ihrer lokalen Ports ausgeführt wird. Standardmäßig wird MongoDB auf 27017 ausgeführt, daher habe ich mich im folgenden Beispiel dafür entschieden, meine Remote-MongoDB-Instanz meinem lokalen 27018-Port zuzuordnen.

Wenn Sie versuchen, eine Datenbank von SERVER1 nach LOCALHOST zu kopieren, können Sie diesen Befehl auf Ihrem LOCALHOST ausführen:

ssh -L27018:localhost:27017 SERVER1

(Ersetzen Sie SERVER1 natürlich durch Ihren tatsächlichen Server- oder SSH-Alias)

Dies öffnet eine SSH-Verbindung zu SERVER1, ordnet aber auch den Port 27018 auf LOCALHOST dem Remote-Port 27017 auf SERVER1 zu. Schließen Sie diese SSH-Verbindung nicht und versuchen Sie jetzt, sich mit MongoDB auf Ihrem Localhost-Rechner mit Port 27018 zu verbinden, etwa so:

mongo --port 27018

Sie werden feststellen, dass dies jetzt die Daten auf SERVER1 sind, außer dass Sie von Ihrem lokalen Computer aus darauf zugreifen.

MongoDB einfach normal ausführen:

mongo (oder mongo --port 27107 )

Wird Ihr lokaler Computer sein.

Nun, da Sie technisch gesehen haben (auf Ihrem LOCALHOST, wo Sie den SSH-Tunnel betrieben haben):

  • MongoDB (LOCALHOST) auf 27017
  • MongoDB (SERVER1) auf 27018

Sie können einfach db.copyDatabase() verwenden Funktion innerhalb von MongoDB (LOCALHOST), um Daten zu kopieren.

VON LOCALHOST AUF PORT 27017 (Durch die Live-Ausführung werden IHRE DATEN VERLASSEN)

// Use the right DB
use DATABASENAME; 
// Drop the Existing Data on LOCALHOST
db.dropDatabase();
// Copies the entire database from 27018
db.copyDatabase("DATABASENAME", "DATABASENAME", "localhost:27018");

Sie sollten in der Lage sein, dies alles in ein Shell-Skript zu packen, das alle diese Befehle für Sie ausführen kann. Ich habe selbst eins, aber es hat tatsächlich ein paar zusätzliche Schritte, die es wahrscheinlich etwas verwirrender machen würden :)

Wenn Sie dies tun und die native Funktion db.copyDatabase() von MongoDB verwenden, müssen Sie nicht dumpen/komprimieren/wiederherstellen. Wenn Sie diesen Weg trotzdem gehen möchten, wäre es natürlich nicht allzu schwer, mongodump auszuführen , exportieren Sie die Daten, tar/gzip sie und verwenden Sie dann scp TARGETSERVER:/path/to/file /local/path/to/file herunterziehen und einen mongorestore ausführen drauf.

Scheint nur mehr Arbeit zu sein!

Bearbeiten - Hier ist eine SH- und JS-Datei, die zusammen ein Shell-Skript bilden, mit dem Sie dies ausführen können. Führen Sie diese auf Ihrem LOCALHOST aus , führen Sie sie nicht live aus, sonst wird die db.dropDatabase live ausgeführt. Legen Sie diese beiden Dateien in denselben Ordner und ersetzen Sie YOURSERVERNAME in pull-db.sh mit dem Alias ​​domain/ip/ssh und dann in pull-db.js Ändern Sie DBNAMEHERE in Ihren Datenbanknamen.

Normalerweise erstelle ich einen Ordner namens scripts In meinen Projekten und mit Textmate muss ich nur ⌘+R drücken während Sie pull-db.sh haben zum Bearbeiten öffnen, um es auszuführen.

pull-db.sh

ssh -L27018:localhost:27017 YOURSERVERNAME '
    echo "Connected on Remote End, sleeping for 10"; 
    sleep 10; 
    exit' &
echo "Waiting 5 sec on local";
sleep 5;
echo "Connecting to Mongo and piping in script";
cat pull-db.js | mongo

pull-db.js

use DBNAMEHERE;
db.dropDatabase();
use DBNAMEHERE;
db.copyDatabase("DBNAMEHERE","DBNAMEHERE","localhost:27018");

Ich habe dem Shell-Skript zusätzlichen Code hinzugefügt, um anzuzeigen, was es tut (sorta). Die Sleep-Timer im Skript dienen nur dazu, den SSH-Verbindungen Zeit zu geben, eine Verbindung herzustellen, bevor die nächste Zeile ausgeführt wird. Im Grunde passiert Folgendes:

  1. Die erste Zeile des Codes erstellt den Tunnel auf Ihrem Rechner und sendet ECHO, SLEEP und dann EXIT an die entfernte SSH-Sitzung.
  2. Es wartet dann 5 Sekunden, wodurch die SSH-Sitzung in Schritt 1 eine Verbindung herstellen kann.
  3. Dann leiten wir die pull-db.js-Datei in die lokale Mongo-Shell. (Schritt #1 sollte innerhalb von 5 Sekunden erledigt werden...)
  4. Die pull-db.js sollte jetzt in Mongo laufen, und das SSH-Terminal in Schritt #1 ist wahrscheinlich 10 Sekunden lang gelaufen, nachdem seine Verbindung geöffnet wurde, und der EXIT wurde an seine Sitzung gesendet. Der Befehl wird ausgegeben, JEDOCH bleibt die SSH-Sitzung tatsächlich geöffnet, bis die Aktivität aus Schritt 3 abgeschlossen ist.
  5. Sobald Ihr Pull-db.js-Skript alle Ihre Daten vom Remote-Server abgerufen hat, darf der EXIT-Befehl, der in Schritt #1 auf dem Remote-Server ausgegeben wurde, endlich die Verbindung schließen und 27108 auf Ihrem Localhost lösen.

Sie sollten jetzt alle Daten aus Ihrer entfernten Datenbank in Ihrem localhost haben.