sql >> Database >  >> NoSQL >> MongoDB

MongoDB synchroniseren via ssh

U kunt dit bereiken met SSH Tunneling, door uw externe MongoDB-instantie in te stellen om op een van uw lokale poorten te draaien. Standaard draait MongoDB op 27017, dus in het onderstaande voorbeeld heb ik ervoor gekozen om mijn externe MongoDB-instantie toe te wijzen aan mijn lokale 27018-poort.

Als u probeert een database van SERVER1 naar LOCALHOST te kopiëren, kunt u deze opdracht uitvoeren op uw LOCALHOST:

ssh -L27018:localhost:27017 SERVER1

(Vervang uiteraard SERVER1 door uw eigenlijke server of ssh-alias)

Dit opent een SSH-verbinding met SERVER1, maar wijst ook de poort 27018 op LOCALHOST toe aan de externe poort 27017 op SERVER1. Sluit die SSH-verbinding niet en probeer nu verbinding te maken met MongoDB op uw localhost-machine met poort 27018, zoals zo:

mongo --port 27018

U zult merken dat dit nu de gegevens op SERVER1 zijn, behalve dat u deze vanaf uw lokale computer benadert.

Gewoon MongoDB normaal draaien:

mongo (of mongo --port 27107 )

Wordt uw lokale machine.

Nu, aangezien je technisch gezien hebt (op je LOCALHOST, waar je de SSH-tunnel hebt uitgevoerd):

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

U kunt gewoon de db.copyDatabase() . gebruiken functie binnen MongoDB (LOCALHOST) om gegevens te kopiëren.

VAN LOCALHOST OP POORT 27017 (Uitvoeren op live zal UW GEGEVENS DROPPEN)

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

Je zou dit allemaal in een shellscript moeten kunnen verpakken dat al deze commando's voor je kan uitvoeren. Ik heb er zelf een, maar het heeft een paar extra stappen die het waarschijnlijk wat verwarrender zouden maken :)

Door dit te doen en door MongoDB's native db.copyDatabase() functie te gebruiken, voorkomt u dat u moet dumpen/zip/restore. Natuurlijk, als je nog steeds die weg wilt gaan, zou het niet zo moeilijk zijn om mongodump uit te voeren. , exporteer de gegevens, tar/gzip het en gebruik dan scp TARGETSERVER:/path/to/file /local/path/to/file om het naar beneden te halen en een mongorestore uit te voeren erop.

Lijkt me gewoon meer werk!

Bewerken - Hier is een SH- en JS-bestand dat samen een shellscript maakt waarmee u dit kunt uitvoeren. Voer deze uit op uw LOCALHOST , voer ze niet live uit, anders wordt de db.dropDatabase live uitgevoerd. Plaats deze twee bestanden in dezelfde map en vervang YOURSERVERNAME in pull-db.sh met de domein/ip/ssh alias, en dan in pull-db.js verander DBNAMEHERE in wat uw databasenaam ook is.

Ik maak normaal gesproken een map met de naam scripts in mijn projecten en met Textmate hoef ik alleen maar op ⌘+R . te drukken terwijl je pull-db.sh . hebt openen om te bewerken om het uit te voeren.

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

Ik heb wat extra code aan het shellscript toegevoegd om te laten zien wat het doet (sorta). De slaaptimers in het script zijn er alleen om de SSH-verbindingen de tijd te geven om verbinding te maken voordat de volgende regel wordt uitgevoerd. Kortom, dit is wat er gebeurt:

  1. De eerste regel van de code maakt de tunnel op uw machine en stuurt de ECHO, SLEEP en vervolgens EXIT naar de externe SSH-sessie.
  2. Het wacht dan 5 seconden, waardoor de SSH-sessie in stap 1 verbinding kan maken.
  3. Vervolgens pipen we het pull-db.js-bestand naar de lokale mongo-shell. (Stap #1 moet binnen 5 seconden worden uitgevoerd...)
  4. De pull-db.js zou nu in mongo moeten draaien, en de SSH-terminal in stap #1 heeft waarschijnlijk 10 seconden gedraaid nadat de verbinding is geopend, en de EXIT wordt naar zijn sessie gestuurd. De opdracht wordt gegeven, ECHTER, de SSH-sessie blijft daadwerkelijk open totdat de activiteit van stap #3 is voltooid.
  5. Zodra je pull-db.js-script klaar is met het ophalen van al je gegevens van de externe server, mag het EXIT-commando dat in stap 1 op de externe server is gegeven, eindelijk de verbinding sluiten, waarbij 27108 op je localhost wordt ontbonden.

U zou nu alle gegevens van uw externe database in uw localhost moeten hebben.



  1. Hoe debuggen van een Express-app te verwijderen?

  2. MongoSocketReadException:voortijdig einde van stream bereikt (na een periode van inactiviteit)

  3. maak snel een voorbeeld-hbase-tabel

  4. Redis getypte klant