MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Synchroniser MongoDB via ssh

Vous pouvez y parvenir avec SSH Tunneling, en configurant votre instance MongoDB distante pour qu'elle s'exécute sur l'un de vos ports locaux. Par défaut, MongoDB s'exécute sur 27017, donc dans l'exemple ci-dessous, j'ai choisi de mapper mon instance MongoDB distante sur mon port 27018 local.

Si vous essayez de copier une base de données de SERVER1 vers LOCALHOST, vous pouvez exécuter cette commande sur votre LOCALHOST :

ssh -L27018:localhost:27017 SERVER1

(Évidemment, remplacez SERVER1 par votre serveur actuel ou votre alias ssh)

Cela ouvre une connexion SSH à SERVER1, mais mappe également le port 27018 sur LOCALHOST au port distant 27017 sur SERVER1. Ne fermez pas cette connexion SSH et essayez maintenant de vous connecter à MongoDB sur votre machine hôte local avec le port 27018, comme ceci :

mongo --port 27018

Vous remarquerez qu'il s'agit maintenant des données sur SERVER1, sauf que vous y accédez depuis votre ordinateur local.

Exécutez simplement MongoDB normalement :

mongo (ou mongo --port 27107 )

Sera votre machine locale.

Maintenant, puisque vous avez techniquement (sur votre LOCALHOST, où vous avez exécuté le tunnel SSH) :

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

Vous pouvez simplement utiliser le db.copyDatabase() fonction à l'intérieur de MongoDB (LOCALHOST) pour copier les données.

DEPUIS LOCALHOST SUR LE PORT 27017 (L'exécution en direct ANNULERA VOS DONNÉES)

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

Vous devriez pouvoir résumer tout cela dans un script shell capable d'exécuter toutes ces commandes pour vous. J'en ai un moi-même, mais il comporte en fait quelques étapes supplémentaires qui le rendraient probablement un peu plus déroutant :)

Faire cela et utiliser la fonction native db.copyDatabase() de MongoDB vous évitera d'avoir à vider/zip/restaurer. Bien sûr, si vous voulez toujours suivre cette voie, il ne serait pas trop difficile d'exécuter mongodump , exportez les données, tar/gzipez-les, puis utilisez scp TARGETSERVER:/path/to/file /local/path/to/file pour le retirer et exécuter un mongorestore dessus.

Cela semble juste être plus de travail !

Modifier - Voici un fichier SH et JS qui vont ensemble pour créer un script shell avec lequel vous pouvez l'exécuter. Exécutez-les sur votre LOCALHOST , ne les exécutez pas en direct ou cela fera le db.dropDatabase en direct. Mettez ces deux fichiers dans le même dossier et remplacez YOURSERVERNAME dans pull-db.sh avec l'alias domaine/ip/ssh, puis dans pull-db.js remplacez DBNAMEHERE par le nom de votre base de données.

Je crée normalement un dossier appelé scripts dans mes projets, et en utilisant Textmate, je n'ai qu'à appuyer sur ⌘+R tout en ayant pull-db.sh ouvert à modifier afin de l'exécuter.

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

J'ai ajouté du code supplémentaire au script shell pour faire écho à ce qu'il fait (en quelque sorte). Les minuteurs de mise en veille dans le script servent uniquement à donner aux connexions SSH le temps de se connecter avant l'exécution de la ligne suivante. En gros, voici ce qui se passe :

  1. La première ligne du code crée le tunnel sur votre machine et envoie ECHO, SLEEP, puis EXIT à la session SSH distante.
  2. Il attend ensuite 5 secondes, ce qui permet à la session SSH de l'étape 1 de se connecter.
  3. Ensuite, nous dirigeons le fichier pull-db.js vers le shell mongo local. (L'étape 1 doit être effectuée dans les 5 secondes...)
  4. Le pull-db.js devrait maintenant s'exécuter en mongo, et le terminal SSH de l'étape 1 a probablement fonctionné pendant 10 secondes après l'ouverture de sa connexion, et la sortie est envoyée à sa session. La commande est émise, CEPENDANT, la session SSH restera ouverte jusqu'à ce que l'activité de l'étape 3 soit terminée.
  5. Dès que votre script pull-db.js a fini d'extraire toutes vos données du serveur distant, la commande EXIT émise à l'étape 1 sur le serveur distant est enfin autorisée à fermer la connexion, en déliant 27108 sur votre hôte local.

Vous devriez maintenant avoir toutes les données de votre base de données distante sur votre hôte local.