MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Sincronize o MongoDB via ssh


Você pode fazer isso com SSH Tunneling, configurando sua instância remota do MongoDB para ser executada em uma de suas portas locais. Por padrão, o MongoDB é executado em 27017, portanto, no exemplo abaixo, escolhi mapear minha instância remota do MongoDB para minha porta 27018 local.

Se estiver tentando copiar um banco de dados de SERVER1 para LOCALHOST, você pode executar este comando em seu LOCALHOST:

ssh -L27018:localhost:27017 SERVER1

(Obviamente substitua SERVER1 pelo seu servidor real ou alias ssh)

Isso abre uma conexão SSH com o SERVER1, mas também mapeia a porta 27018 em LOCALHOST para a porta remota 27017 no SERVER1. Não feche essa conexão SSH e agora tente se conectar ao MongoDB em sua máquina localhost com a porta 27018, assim:

mongo --port 27018

Você notará que agora são os dados no SERVER1, exceto que você os está acessando de sua máquina local.

Apenas executando o MongoDB normalmente:

mongo (ou mongo --port 27107 )

Será sua máquina local.

Agora, já que você tecnicamente tem (no seu LOCALHOST, onde você executou o túnel SSH):
  • MongoDB (LOCALHOST) em 27017
  • MongoDB (SERVER1) em 27018

Você pode simplesmente usar o db.copyDatabase() função dentro do MongoDB (LOCALHOST) para copiar dados.

DE LOCALHOST NA PORTA 27017 (Executando ao vivo irá DERROTAR SEUS DADOS)
// 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");

Você deve ser capaz de envolver tudo isso em um script de shell que possa executar todos esses comandos para você. Eu mesmo tenho um, mas na verdade tem alguns passos extras que provavelmente o tornariam um pouco mais confuso :)

Fazer isso e usar a função nativa db.copyDatabase() do MongoDB evitará que você precise fazer dump/zip/restore. Claro, se você ainda quiser seguir esse caminho, não seria muito difícil executar o mongodump , exporte os dados, tar/gzip-los, então use scp TARGETSERVER:/path/to/file /local/path/to/file para puxá-lo para baixo e executar um mongorestore nele.

Parece que dá mais trabalho!

Editar - Aqui está um arquivo SH e JS que vão juntos para fazer um script de shell com o qual você pode executar isso. Execute-os em seu LOCALHOST , não os execute ao vivo ou ele fará o db.dropDatabase ao vivo. Coloque esses dois arquivos na mesma pasta e substitua YOURSERVERNAME em pull-db.sh com o alias domain/ip/ssh e, em seguida, em pull-db.js altere DBNAMEHERE para qualquer que seja o nome do seu banco de dados.

Eu normalmente crio uma pasta chamada scripts em meus projetos, e usando Textmate, eu só tenho que clicar em ⌘+R ao ter pull-db.sh aberto para editar a fim de executá-lo.

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

Eu adicionei algum código extra ao script de shell para ecoar o que ele está fazendo (mais ou menos). Os temporizadores de suspensão no script são apenas para dar tempo às conexões SSH para se conectarem antes que a próxima linha seja executada. Basicamente, aqui está o que acontece:
  1. A primeira linha do código cria o túnel em sua máquina e envia ECHO, SLEEP e EXIT para a sessão SSH remota.
  2. Aguarda 5 segundos, o que permite que a sessão SSH na etapa 1 se conecte.
  3. Em seguida, canalizamos o arquivo pull-db.js para o shell mongo local. (O passo 1 deve ser feito em 5 segundos...)
  4. O pull-db.js deve estar sendo executado no mongo agora, e o terminal SSH na Etapa 1 provavelmente foi executado por 10 segundos após a conexão ser aberta, e o EXIT é enviado para sua sessão. O comando é emitido, no entanto, a sessão SSH permanecerá aberta até que a atividade da Etapa 3 seja concluída.
  5. Assim que seu script pull-db.js terminar de extrair todos os seus dados do servidor remoto, o comando EXIT emitido na Etapa 1 no servidor remoto finalmente terá permissão para fechar a conexão, desvinculando 27108 em seu localhost.

Agora você deve ter todos os dados de seu banco de dados remoto em seu localhost.