Synchroniser MongoDB Via ssh

Contrairement à Mysql, j'ai trouvé assez difficile d'essayer de synchroniser les fichiers MongoDB -
Ils ne peuvent pas être redirigés, car ils n'envoient pas les données à stdout
(Si je comprends bien).

Donc, j'essaie de trouver un autre moyen, cela n'implique pas deux appels ssh.
Ce qui doit être fait est ceci:

  • connectez-vous au serveur ssh
  • exporter tous les fichiers MongoDB
  • compressez-les en gzip
  • renvoyez - les à la machine locale
  • extrait et importer

La chose clé ici, cependant, ne laisse aucune trace derrière -
Je ne veux pas que les fichiers compressés restent dans la machine distante,
ce qui nécessiterait généralement une autre connexion ssh.
Donc, quelque chose du type "déplacer des fichiers dans une archive" est la solution idéale,
si cela pouvait être redirigé plus tard vers la machine locale de manière transparente.

Je me rends compte que MongoDB a une méthode pour se connecter à un serveur d'informations d'identification en utilisant mongodump, mais le port est fermé atm, donc j'ai besoin le SSH méthode. Toute autre idée serait la bienvenue, BTW.

Modifier - 11.06.14

Comme ces questions semblent être un peu populaires, Je voudrais partager un script qui a évolué à partir des réponses de ces questions, et d'autres ressources au cours de la dernière année (le crédit est là où le crédit est dû).
Le script gère essentiellement une synchronisation de / vers un serveur distant, pour l'un ou l'autre type de base de données possible (probablement. postgres, mysql et mongo pour le moment).
Il a quelques hypothèses, comme la racine utilisateur n'ayant pas de mot de passe pour la base de données, mais qui peut être modifié en fonction des besoins.

Le script peut être trouvé ici: https://github.com/iwfmp/zsh/blob/master/scripts/db/db-sync

24
demandé sur CrimsonKing 2013-05-18 04:34:44

3 réponses

Vous pouvez y parvenir avec le Tunneling SSH, 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

(remplacez évidemment SERVER1 par votre serveur réel ou alias ssh)

Ce 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 localhost avec le port 27018, comme ceci:

mongo --port 27018

Vous remarquerez que ce sont maintenant les données sur SERVER1, sauf que vous y accédez depuis votre machine locale.

Juste en cours D'exécution MongoDB normalement:

mongo (ou mongo --port 27107)

Sera votre machine locale.

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

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

Vous pouvez simplement utiliser la fonction db.copyDatabase() dans MongoDB (LOCALHOST) pour copier des données.

De LOCALHOST sur le PORT 27017 (L'exécution sur live va déposer 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 être capable d'envelopper tout cela dans un script shell qui peut exécuter tout cela commandes pour vous. J'en ai moi-même un, mais il a en fait quelques étapes supplémentaires qui le rendraient probablement un peu plus déroutant:)

Faire cela, et en utilisant la base de données native de MongoDB.la fonction copyDatabase() vous empêchera d'avoir à vider/zip/restore. Bien sûr, si vous voulez continuer à aller dans cette voie, il ne serait pas trop difficile à exécuter mongodump, exporter les données, tar/gzip, puis l'utiliser scp TARGETSERVER:/path/to/file /local/path/to/file, le tirer vers le bas et d'exécuter un mongorestore sur elle.

Semble Juste comme 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 la base de données.dropDatabase sur live. Mettez ces deux fichiers dans le même dossier, et remplacez YOURSERVERNAME dans pull-db.sh avec l'alias domain/ip/ssh, puis dans pull-db.js changez DBNAMEHERE pour quel que soit le nom de votre base de données.

Je crée normalement un dossier appelé scripts dans mes projets, et en utilisant Textmate, j'ai juste pour frapper ⌘+R, tout en ayant pull-db.sh ouvrir pour 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 minuteries de veille dans le script sont juste pour donner aux connexions SSH le temps de se connecter avant que la ligne suivante ne soit exécutée. Fondamentalement, voici ce qui se passe:

  1. la première ligne du code crée le tunnel sur votre machine et envoie ECHO, SLEEP, puis quittez la session SSH distante.
  2. il attend ensuite 5 secondes, ce qui permet à la session SSH à l'étape 1 de se connecter.
  3. ensuite, nous dirigeons le pull-db.fichier js dans le shell mongo local. (Étape # 1 devrait être fait dans les 5 sec...)
  4. le pull-db.js devrait être en cours d'exécution dans mongo maintenant, et le terminal SSH à L'Étape # 1 a probablement fonctionné pendant 10 secondes après l'ouverture de la connexion, et la sortie est envoyée à sa session. La commande est émise, cependant, la session SSH en fait, restez ouvert jusqu'à ce que l'activité de L'Étape #3 soit terminée.
  5. dès Que votre pull-db.le script js termine de tirer toutes vos données du serveur distant, la commande EXIT émise à L'Étape # 1 sur le serveur distant est finalement autorisée à fermer la connexion, découplant 27108 sur votre localhost.

Vous devriez maintenant avoir toutes les données de votre base de données distante dans votre localhost.

50
répondu Jesta 2017-04-26 11:20:40

Pour compléter Jesta excellente réponse, si vous voulez faire l'inverse (copie de la base de données locale à la base de données distante), vous devez lier le port dans l'autre sens, avec la commande-R au lieu de la commande-L:

Ssh-R27018: localhost: 27017 YOURSERVERNAME

Et maintenant, étant connecté au serveur distant, vous pouvez copier la base de données de la base de données locale:

Mongo

> db.copyDatabase('test','test','localhost:27018')

2
répondu JulienFr 2013-12-08 12:13:06

Je n'aime pas vraiment qu'une base de données se connecte à une autre-à mon humble avis, cela brise la séparation des environnements et rend compliqué l'automatisation de tels scripts.

Ma solution est d'utiliser le Mongo dump / restore qui utilise des "répertoires dump" et d'utiliser tar pour diffuser les fichiers. Une implémentation triviale (pour copier d'une télécommande à une autre distante) peut ressembler à ceci:

ssh remote1 'mongodump > /dev/null && tar -zc dump && rm -rf dump' | \
  ssh remote2 'tar -zx && mongorestore dump && rm -rf dump'

Notes:

  1. que les deux mongodump et mongorestore ont une sortie très verbeuse, mais que mongodump est est-ce que les deux vont jouer avec le streaming tar et aussi apparemment mongodump refusera de fonctionner si vous exécutez sans pseudo-terminal et sans redirection de sortie.
  2. mongodump a une option pour vider vers stdout, mais je n'ai pas pu comprendre quel type de format il utilise et je n'ai pas compris comment charger mongorestore.
1
répondu Guss 2014-10-17 17:51:11