sql >> Database teknologi >  >> NoSQL >> MongoDB

Synkroniser MongoDB via ssh

Du kan opnå dette med SSH Tunneling, ved at konfigurere din eksterne MongoDB-instans til at køre på en af ​​dine lokale porte. Som standard kører MongoDB på 27017, så i eksemplet nedenfor har jeg valgt at kortlægge min eksterne MongoDB-instans til min lokale 27018-port.

Hvis du prøver at kopiere en database fra SERVER1 til LOCALHOST, kan du køre denne kommando på din LOCALHOST:

ssh -L27018:localhost:27017 SERVER1

(Erstat naturligvis SERVER1 med din faktiske server eller ssh-alias)

Dette åbner en SSH-forbindelse til SERVER1, men kortlægger også port 27018 på LOCALHOST til fjernport 27017 på SERVER1. Luk ikke den SSH-forbindelse, og prøv nu at oprette forbindelse til MongoDB på din lokale værtsmaskine med port 27018, som sådan:

mongo --port 27018

Du vil bemærke, at dette nu er dataene på SERVER1, bortset fra at du får adgang til dem fra din lokale maskine.

Bare kører MongoDB normalt:

mongo (eller mongo --port 27107 )

Vil være din lokale maskine.

Nu, da du teknisk set har (på din LOCALHOST, hvor du kørte SSH-tunnelen):

  • MongoDB (LOCALHOST) på 27017
  • MongoDB (SERVER1) på 27018

Du kan bare bruge db.copyDatabase() funktion inde i MongoDB (LOCALHOST) til at kopiere data.

FRA LOCALHOST ON PORT 27017 (Hvis du udfører på live vil DINE DATA DROPPE)

// 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");

Du burde være i stand til at pakke alt dette ind i et shell-script, der kan udføre alle disse kommandoer for dig. Jeg har selv en, men den har faktisk et par ekstra trin, der nok ville gøre det lidt mere forvirrende :)

Gør du dette og bruger MongoDB's indbyggede db.copyDatabase() funktion vil du forhindre dig i at skulle dumpe/zip/gendan. Selvfølgelig, hvis du stadig ønsker at gå den rute, ville det ikke være for svært at køre mongodump , eksporter dataene, tar/gzip det, og brug derefter scp TARGETSERVER:/path/to/file /local/path/to/file at trække den ned og køre en mongorestore på den.

Det virker bare som mere arbejde!

Rediger - Her er en SH- og JS-fil, der går sammen for at lave et shell-script, du kan køre dette med. Kør disse på din LOCALHOST , lad være med at køre dem på live eller det vil gøre db.dropDatabase på live. Læg disse to filer i samme mappe, og erstat DIN SERVERNAVN i pull-db.sh med domænet/ip/ssh-aliasset og derefter i pull-db.js ændre DBNAMEHERE til, hvad end dit databasenavn er.

Jeg opretter normalt en mappe kaldet scripts i mine projekter, og ved at bruge Textmate, skal jeg bare trykke ⌘+R mens du har pull-db.sh åben for at redigere for at udføre den.

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");

Jeg tilføjede noget ekstra kode til shell-scriptet for at genkende, hvad det laver (sorta). Sleep-timerne i scriptet er kun for at give SSH-forbindelserne tid til at blive forbundet, før den næste linje køres. Grundlæggende er det her, hvad der sker:

  1. Første linje i koden opretter tunnelen på din maskine og sender EKKO, SLEEP og derefter EXIT til den eksterne SSH-session.
  2. Den venter derefter 5 sekunder, hvilket gør det muligt for SSH-sessionen i trin 1 at oprette forbindelse.
  3. Så overfører vi pull-db.js-filen til den lokale mongo-shell. (Trin #1 skal udføres inden for 5 sek...)
  4. Pull-db.js skulle køre i mongo nu, og SSH-terminalen i trin #1 har sandsynligvis kørt i 10 sekunder efter dens forbindelse åbnede, og EXIT er sendt til dens session. Kommandoen udstedes, DOG vil SSH-sessionen faktisk forblive åben, indtil aktiviteten fra trin #3 er fuldført.
  5. Så snart dit pull-db.js-script er færdig med at trække alle dine data fra fjernserveren, får EXIT-kommandoen udstedt i trin #1 på fjernserveren endelig lov til at lukke forbindelsen og frigøre 27108 på din lokale vært.

Du skulle nu have alle data fra din fjerndatabase i din lokale vært.



  1. Brugerdefinerede fejlmeddelelser med Mongoose

  2. Meteor og DBRefs

  3. $lookup returnerer tom matrix

  4. Keras forudser ikke at vende tilbage inden for selleri opgaven