sql >> Databasteknik >  >> NoSQL >> MongoDB

Synkronisera MongoDB via ssh

Du kan åstadkomma detta med SSH Tunneling, ställa in din fjärranslutna MongoDB-instans för att köras på en av dina lokala portar. Som standard körs MongoDB på 27017, så i exemplet nedan har jag valt att mappa min fjärranslutna MongoDB-instans till min lokala 27018-port.

Om du försöker kopiera en databas från SERVER1 till LOCALHOST kan du köra det här kommandot på din LOCALHOST:

ssh -L27018:localhost:27017 SERVER1

(Självklart ersätt SERVER1 med din faktiska server eller ssh-alias)

Detta öppnar en SSH-anslutning till SERVER1, men mappar också porten 27018 på LOCALHOST till fjärrporten 27017 på SERVER1. Stäng inte den SSH-anslutningen, och försök nu att ansluta till MongoDB på din lokala värddator med port 27018, så här:

mongo --port 27018

Du kommer att märka att detta nu är data på SERVER1, förutom att du kommer åt det från din lokala dator.

Kör bara MongoDB normalt:

mongo (eller mongo --port 27107 )

Kommer att vara din lokala maskin.

Nu, eftersom du tekniskt sett har (på din LOCALHOST, där du körde SSH-tunneln):

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

Du kan bara använda db.copyDatabase() funktion inuti MongoDB (LOCALHOST) för att kopiera över data.

FRÅN LOCALHOST ON PORT 27017 (Om du kör live kommer DIN DATA TAPPAS)

// 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 bör kunna slå in allt detta i ett skalskript som kan utföra alla dessa kommandon åt dig. Jag har en själv, men den har faktiskt några extra steg som förmodligen skulle göra det lite mer förvirrande :)

Om du gör detta och använder MongoDB:s inbyggda funktion db.copyDatabase() kommer du att förhindra att du behöver dumpa/zip/återställa. Naturligtvis, om du fortfarande vill gå den vägen, skulle det inte vara så svårt att köra mongodump , exportera data, tar/gzip den och använd sedan scp TARGETSERVER:/path/to/file /local/path/to/file för att dra ner den och köra en mongorestore på den.

Verkar bara som mer jobb!

Redigera - Här är en SH- och JS-fil som går ihop för att göra ett skalskript du kan köra det här med. Kör dessa på din LOCALHOST , kör dem inte på live eller det kommer att göra db.dropDatabasen på live. Lägg dessa två filer i samma mapp och ersätt DITT SERVERNAMN i pull-db.sh med domänen/ip/ssh-aliaset och sedan i pull-db.js ändra DBNAMEHERE till vad ditt databasnamn än är.

Jag skapar normalt en mapp som heter scripts i mina projekt och med Textmate behöver jag bara trycka på ⌘+R medan du har pull-db.sh öppen för att redigera för att köra 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");

Jag lade till lite extra kod till skalskriptet för att återspegla vad det gör (sorta). Sömntimerna i skriptet är bara för att ge SSH-anslutningarna tid att ansluta innan nästa rad körs. I grund och botten, det här är vad som händer:

  1. Första raden i koden skapar tunneln på din maskin och skickar ECHO, SLEEP och sedan EXIT till fjärr-SSH-sessionen.
  2. Den väntar sedan 5 sekunder, vilket gör att SSH-sessionen i steg 1 kan ansluta.
  3. Sedan skickar vi filen pull-db.js till det lokala mongoskalet. (Steg #1 bör göras inom 5 sek...)
  4. Pull-db.js bör köras i mongo nu, och SSH-terminalen i steg #1 har förmodligen körts i 10 sekunder efter det att anslutningen öppnats och EXIT skickas till sin session. Kommandot utfärdas, MEN SSH-sessionen kommer faktiskt att vara öppen tills aktiviteten från steg #3 är klar.
  5. Så snart ditt pull-db.js-skript slutar dra all din data från fjärrservern, tillåts EXIT-kommandot som utfärdats i steg #1 på fjärrservern äntligen att stänga anslutningen och avbinda 27108 på din lokala värd.

Du bör nu ha all data från din fjärrdatabas i din lokala värd.



  1. Hadoop Map/Reduce vs inbyggd Map/Reduce

  2. Hur upphör nycklar för redis?

  3. Grundläggande överväganden för att ta en MongoDB-säkerhetskopia

  4. Apache Hadoop Ozon Security – Autentisering