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

Sincronizza MongoDB tramite ssh

Puoi farlo con SSH Tunneling, configurando la tua istanza MongoDB remota per l'esecuzione su una delle tue porte locali. Per impostazione predefinita, MongoDB viene eseguito su 27017, quindi nell'esempio seguente ho scelto di mappare la mia istanza MongoDB remota sulla mia porta 27018 locale.

Se stai provando a copiare un database da SERVER1 a LOCALHOST, puoi eseguire questo comando sul tuo LOCALHOST:

ssh -L27018:localhost:27017 SERVER1

(Ovviamente sostituisci SERVER1 con il tuo vero server o alias ssh)

Questo apre una connessione SSH a SERVER1, ma mappa anche la porta 27018 su LOCALHOST alla porta remota 27017 su SERVER1. Non chiudere quella connessione SSH e ora prova a connetterti a MongoDB sul tuo computer localhost con la porta 27018, in questo modo:

mongo --port 27018

Noterai che questi sono ora i dati su SERVER1, tranne per il fatto che stai accedendo dal tuo computer locale.

Eseguendo normalmente MongoDB:

mongo (o mongo --port 27107 )

Sarà la tua macchina locale.

Ora, dal momento che tecnicamente hai (sul tuo LOCALHOST, dove hai eseguito il tunnel SSH):

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

Puoi semplicemente usare db.copyDatabase() funzione all'interno di MongoDB (LOCALHOST) per copiare i dati.

DA LOCALHOST SUL PORT 27017 (l'esecuzione in diretta farà cadere i tuoi dati)

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

Dovresti essere in grado di racchiudere tutto in uno script di shell in grado di eseguire tutti questi comandi per te. Ne ho uno anch'io, ma in realtà ha alcuni passaggi in più che probabilmente renderebbero un po' più confuso :)

In questo modo e l'utilizzo della funzione nativa db.copyDatabase() di MongoDB ti eviterà di dover eseguire il dump/zip/restore. Ovviamente, se vuoi continuare su quella strada, non sarebbe troppo difficile eseguire mongodump , esporta i dati, esegui il tar/gzip, quindi usa scp TARGETSERVER:/path/to/file /local/path/to/file per tirarlo giù ed eseguire un mongorestore su di esso.

Sembra solo più lavoro!

Modifica - Ecco un file SH e JS che vanno insieme per creare uno script di shell con cui puoi eseguirlo. Esegui questi sul tuo LOCALHOST , non eseguirli dal vivo o eseguirà il db.dropDatabase dal vivo. Metti questi due file nella stessa cartella e sostituisci YOURSERVERNAME in pull-db.sh con l'alias dominio/ip/ssh, quindi in pull-db.js cambia DBNAMEHERE in qualunque sia il nome del tuo database.

Normalmente creo una cartella chiamata scripts nei miei progetti, e usando Textmate, devo solo premere ⌘+R pur avendo pull-db.sh apri per modificare per eseguirlo.

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

Ho aggiunto del codice extra allo script della shell per fare eco a ciò che sta facendo (sorta). I timer di spegnimento nello script servono solo a dare alle connessioni SSH il tempo di connettersi prima che venga eseguita la riga successiva. Fondamentalmente, ecco cosa succede:

  1. La prima riga del codice crea il tunnel sulla tua macchina e invia ECHO, SLEEP, quindi EXIT alla sessione SSH remota.
  2. Attende quindi 5 secondi, il che consente alla sessione SSH del passaggio 1 di connettersi.
  3. Quindi eseguiamo il pipe del file pull-db.js nella mongo shell locale. (Il passaggio n. 1 dovrebbe essere eseguito entro 5 secondi...)
  4. Il pull-db.js ora dovrebbe essere in esecuzione in mongo e il terminale SSH nel passaggio n. 1 è stato probabilmente eseguito per 10 secondi dopo l'apertura della connessione e l'EXIT è stato inviato alla sua sessione. Il comando viene emesso, TUTTAVIA, la sessione SSH rimarrà effettivamente aperta fino al completamento dell'attività dal passaggio n. 3.
  5. Non appena il tuo script pull-db.js finisce di estrarre tutti i tuoi dati dal server remoto, il comando EXIT emesso nel passaggio n. 1 sul server remoto può finalmente chiudere la connessione, annullando l'associazione 27108 sul tuo localhost.

Ora dovresti avere tutti i dati dal tuo database remoto nel tuo localhost.