Подтвердить что ты не робот

Синхронизация MongoDB через ssh

В отличие от Mysql, я нашел довольно сложной попытку синхронизировать файлы MongoDB -
Они не могут быть отправлены обратно, поскольку они не отправляют данные в stdout
(Если я правильно понимаю).

Итак, я пытаюсь найти другой способ, который не включает два вызова ssh.
Что нужно сделать, так это:

  • Войдите в ssh-сервер
  • Экспорт всех файлов MongoDB
  • Сжатие их в gzip
  • Отправьте их на локальный компьютер
  • Извлечение и импорт

Ключевая вещь здесь, однако, не оставляет следов -

Я не хочу, чтобы сжатые файлы оставались на удаленной машине,
который обычно требует меня для другого входа ssh.
Итак, что-то вроде "переместить файлы в архив" - идеальное решение,
если это можно было бы позже отправить обратно на локальную машину без проблем.

Я понимаю, что у MongoDB есть способ подключения к учетным данным сервера с использованием mongodump, но порт закрыт atm, поэтому мне нужен SSH-метод. Любые другие идеи приветствуются, BTW.

Изменить - 11.06.14

Поскольку эти вопросы кажутся несколько популярными, я хотел бы поделиться с ним script, который возник из ответов на эти вопросы, и других ресурсов за последний год (кредит - это кредит).
script в основном управляет синхронизацией с/на удаленный сервер, для любого типа db (возможно, postgres, mysql и mongo на данный момент).
В нем есть несколько предположений, таких как пользователь root, у которого нет пароля для db, но это может быть изменено в зависимости от необходимости.

script можно найти здесь: https://github.com/iwfmp/zsh/blob/master/scripts/db/db-sync

4b9b3361

Ответ 1

Вы можете выполнить это с помощью SSH Tunneling, настроив удаленный экземпляр MongoDB для запуска на одном из ваших локальных портов. По умолчанию MongoDB работает на 27017, поэтому в приведенном ниже примере я решил сопоставить мой удаленный экземпляр MongoDB с моим локальным портом 27018.

Если при попытке скопировать базу данных из SERVER1 в LOCALHOST, вы можете запустить эту команду на своем LOCALHOST:

ssh -L27018:localhost:27017 SERVER1

(Очевидно, замените SERVER1 вашим фактическим псевдонимом сервера или ssh)

Это открывает SSH-соединение с SERVER1, но также отображает порт 27018 на LOCALHOST на удаленный порт 27017 на сервере SERVER1. Не закрывайте это SSH-соединение и теперь пытайтесь подключиться к MongoDB на вашей локальной машине с портом 27018, например:

mongo --port 27018

Вы заметите, что теперь это данные на SERVER1, за исключением того, что вы обращаетесь к нему с вашего локального компьютера.

Как обычно работает MongoDB:

mongo (или mongo --port 27107)

Будет ваша локальная машина.

Теперь, поскольку у вас есть технически (на вашем LOCALHOST, где вы запустили туннель SSH):

  • MongoDB (LOCALHOST) на 27017
  • MongoDB (SERVER1) на 27018

Вы можете просто использовать функцию db.copyDatabase() внутри MongoDB (LOCALHOST) для копирования данных.

FROM LOCALHOST ON PORT 27017 (Выполнение в прямом эфире приведет к снижению ваших данных)

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

Вы должны иметь возможность обернуть все это в оболочку script, которая может выполнять все эти команды для вас. У меня есть один, но на самом деле у него есть несколько дополнительных шагов, которые, вероятно, сделают его более запутанным:)

Выполнение этого и использование функции MongoDB native db.copyDatabase() не позволит вам выполнить команду dump/zip/restore. Конечно, если вы все еще хотите пойти по этому маршруту, было бы не слишком сложно запустить mongodump, экспортировать данные, tar/gzip, а затем использовать scp TARGETSERVER:/path/to/file /local/path/to/file, чтобы вытащить его и запустить mongorestore on он.

Просто кажется, что больше работы!

Изменить. Здесь SH и JS файлы, которые собираются вместе, чтобы создать оболочку script, вы можете запустить это с помощью. Запустите их на своем LOCALHOST, не запускайте их в прямом эфире или не создадите базу данных db.dropDatabase в режиме реального времени. Поместите эти два файла в одну и ту же папку и замените YOURSERVERNAME в pull-db.sh псевдонимом domain/ip/ssh, а затем в pull-db.js измените имя DBNAMEHERE на любое имя вашей базы данных.

Обычно я создаю в своих проектах папку с именем scripts и используя Textmate, мне просто нужно нажать ⌘+R, а pull-db.sh открыть для редактирования, чтобы выполнить его.

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

выдвижные db.js

use DBNAMEHERE;
db.dropDatabase();
use DBNAMEHERE;
db.copyDatabase("DBNAMEHERE","DBNAMEHERE","localhost:27018");

Я добавил дополнительный код в оболочку script, чтобы повторить, что он делает (sorta). Таймеры сна в script предназначены для того, чтобы время соединения SSH было подключено до того, как будет запущена следующая строка. В принципе, вот что происходит:

  • Первая строка кода создает туннель на вашем компьютере и отправляет ECHO, SLEEP, а затем EXIT на удаленный сеанс SSH.
  • Затем он ждет 5 секунд, что позволяет подключиться к сеансу SSH на шаге 1.
  • Затем мы передаем файл pull-db.js в локальную оболочку mongo. (Шаг №1 должен быть выполнен в течение 5 секунд...)
  • Теперь pull-db.js должен быть запущен в mongo, а терминал SSH на шаге 1, вероятно, запускается в течение 10 секунд после его открытия, и EXIT отправляется на сеанс. Команда выдается, ОДНАКО, сеанс SSH на самом деле останется открытым до завершения действия с шага №3.
  • Как только ваш pull-db.js script завершает извлечение всех ваших данных с удаленного сервера, команда EXIT, выпущенная на шаге # 1 на удаленном сервере, наконец, может закрыть соединение, отвязав 27108 на вашем локальный.

Теперь вы должны иметь все данные из вашей удаленной базы данных в своем локальном хосте.

Ответ 2

Чтобы завершить Jesta отличный ответ, если вы хотите сделать обратное (копирование из локальной базы данных в удаленную базу данных), вам нужно связать порт с другим путем, используя команду -R вместо команды -L:

ssh -R27018: localhost: 27017 YOURSERVERNAME

и теперь, будучи зарегистрированным на сервере REMOTE, вы можете скопировать db из локальной базы данных:

Монго

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

Ответ 3

Мне не нравится, когда одна база данных подключается к другой - IMHO нарушает разделение сред и затрудняет автоматизацию таких скриптов.

Мое решение - использовать дамп/восстановление mongo, которые используют "каталоги дампа" и использовать tar для потоковой передачи файлов. Тривиальная реализация (для копирования с одного пульта дистанционного управления на другой) может выглядеть так:

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

Примечания:

  • что как mongodump, так и mongorestore имеет очень подробный вывод, но mongodump будет работать с потоком tar, а также, по-видимому, mongodump фактически откажется работать, если вы запускаете без псевдотерминала и без вывода перенаправление.
  • mongodump имеет возможность сбрасывать на stdout, но я не мог понять, какой формат он использует, и я не понял, как получить mongorestore, чтобы загрузить это.