sql >> Base de Datos >  >> NoSQL >> MongoDB

Sincronizar MongoDB a través de ssh

Puede lograr esto con SSH Tunneling, configurando su instancia remota de MongoDB para que se ejecute en uno de sus puertos locales. De manera predeterminada, MongoDB se ejecuta en 27017, por lo que, en el siguiente ejemplo, elegí asignar mi instancia remota de MongoDB a mi puerto local 27018.

Si intenta copiar una base de datos de SERVER1 a LOCALHOST, puede ejecutar este comando en su LOCALHOST:

ssh -L27018:localhost:27017 SERVER1

(Obviamente, reemplace SERVER1 con su servidor real o alias ssh)

Esto abre una conexión SSH al SERVIDOR1, pero también asigna el puerto 27018 en LOCALHOST al puerto remoto 27017 en el SERVIDOR1. No cierre esa conexión SSH y ahora intente conectarse a MongoDB en su máquina host local con el puerto 27018, así:

mongo --port 27018

Notará que estos son ahora los datos en el SERVIDOR1, excepto que está accediendo desde su máquina local.

Simplemente ejecutando MongoDB normalmente:

mongo (o mongo --port 27107 )

Será su máquina local.

Ahora, dado que técnicamente tiene (en su LOCALHOST, donde ejecutó el túnel SSH):

  • MongoDB (LOCALHOST) en 27017
  • MongoDB (SERVIDOR1) en 27018

Simplemente puede usar db.copyDatabase() función dentro de MongoDB (LOCALHOST) para copiar datos.

DESDE LOCALHOST EN EL PUERTO 27017 (ejecutar en vivo BORRARA SUS DATOS)

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

Debería poder envolver todo esto en un script de shell que pueda ejecutar todos estos comandos por usted. Yo mismo tengo uno, pero en realidad tiene algunos pasos adicionales que probablemente lo harían un poco más confuso :)

Hacer esto y usar la función db.copyDatabase() nativa de MongoDB evitará que tenga que volcar/comprimir/restaurar. Por supuesto, si aún desea seguir esa ruta, no sería demasiado difícil ejecutar mongodump , exporte los datos, tráelos con tar/gzip, luego use scp TARGETSERVER:/path/to/file /local/path/to/file para desplegarlo y ejecutar un mongorestore en él.

¡Parece más trabajo!

Editar - Aquí hay un archivo SH y JS que se combinan para crear un script de shell con el que puede ejecutarlo. Ejecutar estos en su LOCALHOST , no los ejecute en vivo o hará db.dropDatabase en vivo. Coloque estos dos archivos en la misma carpeta y reemplace NOMBREDESUSERVIDOR en pull-db.sh con el alias dominio/ip/ssh, y luego en pull-db.js cambie DBNAMEHERE a cualquiera que sea el nombre de su base de datos.

Normalmente creo una carpeta llamada scripts en mis proyectos, y usando Textmate, solo tengo que pulsar ⌘+R mientras tiene pull-db.sh abierto para editar con el fin de ejecutarlo.

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

Agregué un código adicional al script de shell para hacer eco de lo que está haciendo (más o menos). Los temporizadores de suspensión en el script son solo para dar tiempo a las conexiones SSH para conectarse antes de que se ejecute la siguiente línea. Básicamente, esto es lo que sucede:

  1. La primera línea del código crea el túnel en su máquina y envía ECHO, SLEEP y luego EXIT a la sesión SSH remota.
  2. Luego espera 5 segundos, lo que permite que se conecte la sesión SSH en el paso 1.
  3. Luego canalizamos el archivo pull-db.js al shell mongo local. (El paso n.º 1 debe realizarse en 5 segundos...)
  4. El pull-db.js debería estar ejecutándose en mongo ahora, y la terminal SSH en el paso n.º 1 probablemente se haya ejecutado durante 10 segundos después de que se abrió la conexión, y se envía EXIT a su sesión. Se emite el comando, SIN EMBARGO, la sesión SSH en realidad permanecerá abierta hasta que se complete la actividad del Paso 3.
  5. Tan pronto como su secuencia de comandos pull-db.js termine de extraer todos sus datos del servidor remoto, el comando EXIT emitido en el paso n.º 1 en el servidor remoto finalmente podrá cerrar la conexión, desvinculando 27108 en su servidor local.

Ahora debería tener todos los datos de su base de datos remota en su servidor local.