Поиск по сайту:

Как создать резервную копию, восстановить и перенести базу данных MongoDB в Ubuntu 14.04


Введение

MongoDB — один из самых популярных движков баз данных NoSQL. Он известен своей масштабируемостью, мощностью, надежностью и простотой в использовании. В этой статье мы покажем вам, как выполнять резервное копирование, восстановление и миграцию баз данных MongoDB.

Импорт и экспорт базы данных означает работу с данными в удобочитаемом формате, совместимом с другими программными продуктами. Напротив, операции резервного копирования и восстановления создают или используют специфичные для MongoDB двоичные данные, которые сохраняют не только согласованность и целостность ваших данных, но и их специфические атрибуты MongoDB. Таким образом, для миграции обычно предпочтительнее использовать резервное копирование и восстановление, если исходная и целевая системы совместимы.

Предпосылки

Прежде чем следовать этому руководству, убедитесь, что выполнены следующие предварительные условия:

  • Дроплет Ubuntu 14.04
  • Пользователь sudo без полномочий root. Подробности см. в разделе Первоначальная настройка сервера с Ubuntu 14.04.
  • MongoDB установлен и настроен с помощью статьи Как установить MongoDB в Ubuntu 14.04.
  • Пример базы данных MongoDB, импортированной с использованием инструкций из раздела «Импорт и экспорт базы данных MongoDB в Ubuntu 14.04».

Если не указано иное, все команды, требующие привилегий root в этом руководстве, должны выполняться от имени пользователя без полномочий root с привилегиями sudo.

Понимание основ

Прежде чем продолжить эту статью, необходимо некоторое базовое понимание этого вопроса. Если у вас есть опыт работы с популярными системами реляционных баз данных, такими как MySQL, вы можете найти некоторые сходства при работе с MongoDB.

Первое, что вы должны знать, это то, что MongoDB использует форматы json и bson (двоичный json) для хранения своей информации. Json — это удобочитаемый формат, который идеально подходит для экспорта и, в конечном итоге, импорта ваших данных. Вы можете дополнительно управлять своими экспортированными данными с помощью любого инструмента, поддерживающего json, включая простой текстовый редактор.

Пример json-документа выглядит так:

{"address":[
    {"building":"1007", "street":"Park Ave"},
    {"building":"1008", "street":"New Ave"},
]}

С Json очень удобно работать, но он поддерживает не все типы данных, доступные в bson. Это означает, что будет так называемая «потеря достоверности» информации, если вы используете json. Для резервного копирования и восстановления лучше использовать бинарный файл bson.

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

В-третьих, в MongoDB чтение или вставка больших объемов данных, например, для задач, описанных в этой статье, может быть ресурсоемким и потреблять много ресурсов ЦП, памяти и дискового пространства. Это очень важно, учитывая, что MongoDB часто используется для больших баз данных и больших данных. Самое простое решение этой проблемы — запустить экспорт и резервное копирование ночью или в непиковые часы.

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

Хотя вы можете использовать функции импорта и экспорта для резервного копирования и восстановления данных, существуют более эффективные способы обеспечения полной целостности ваших баз данных MongoDB. Для резервного копирования ваших данных вы должны использовать команду mongodump. Для восстановления используйте mongorestore. Давайте посмотрим, как они работают.

Резервное копирование базы данных MongoDB

Давайте сначала рассмотрим резервное копирование вашей базы данных MongoDB.

Важным аргументом mongodump является --db, который указывает имя базы данных, резервную копию которой вы хотите создать. Если вы не укажете имя базы данных, mongodump сделает резервную копию всех ваших баз данных. Вторым важным аргументом является --out, который указывает каталог, в который будут выгружены данные. Давайте возьмем пример с резервным копированием базы данных newdb и сохранением ее в каталоге /var/backups/mongobackups. В идеале у нас должна быть каждая из наших резервных копий в каталоге с текущей датой, такой как /var/backups/mongobackups/01-20-16 (20 января 2016 года). Во-первых, давайте создадим этот каталог /var/backups/mongobackups с помощью команды:

  1. sudo mkdir /var/backups/mongobackups

Тогда наша команда резервного копирования должна выглядеть так:

  1. sudo mongodump --db newdb --out /var/backups/mongobackups/`date +"%m-%d-%y"`

Успешно выполненная резервная копия будет иметь такие выходные данные, как:

2016-01-20T10:11:57.685-0500    writing newdb.restaurants to /var/backups/mongobackups/01-20-16/newdb/restaurants.bson
2016-01-20T10:11:57.907-0500    writing newdb.restaurants metadata to /var/backups/mongobackups/01-20-16/newdb/restaurants.metadata.json
2016-01-20T10:11:57.911-0500    done dumping newdb.restaurants (25359 documents)
2016-01-20T10:11:57.911-0500    writing newdb.system.indexes to /var/backups/mongobackups/01-20-16/newdb/system.indexes.bson

Обратите внимание, что в приведенном выше пути к каталогу мы использовали date +%m-%d-%y, который автоматически получает текущую дату. Это позволит нам хранить резервные копии в каталоге /var/backups/01-20-16/. Это особенно удобно, когда мы автоматизируем резервное копирование.

На данный момент у вас есть полная резервная копия базы данных newdb в каталоге /var/backups/mongobackups/01-20-16/newdb/. В этой резервной копии есть все, чтобы правильно восстановить newdb и сохранить ее так называемую «верность».

Как правило, резервное копирование следует делать регулярно, например, ежедневно, и желательно в то время, когда сервер наименее загружен. Таким образом, вы можете установить команду mongodump в качестве задания cron, чтобы она запускалась регулярно, например. каждый день в 03:03. Чтобы выполнить этот открытый crontab, редактор cron выглядит следующим образом:

  1. sudo crontab -e

Обратите внимание, что при запуске sudo crontab вы будете редактировать задания cron для пользователя root. Это рекомендуется, потому что если вы настроите cron для своего пользователя, они могут не выполняться должным образом, особенно если ваш профиль sudo требует проверки пароля.

В приглашение crontab вставьте следующую команду mongodump:

3 3 * * * mongodump --out /var/backups/mongobackups/`date +"%m-%d-%y"`

В приведенной выше команде мы намеренно опускаем аргумент --db, потому что обычно вы хотите иметь резервные копии всех своих баз данных.

В зависимости от размеров вашей базы данных MongoDB у вас может скоро закончиться место на диске из-за слишком большого количества резервных копий. Вот почему также рекомендуется регулярно очищать старые резервные копии или сжимать их. Например, чтобы удалить все резервные копии старше 7 дней, вы можете использовать следующую команду bash:

  1. find /var/backups/mongobackups/ -mtime +7 -exec rm -rf {} \;

Подобно предыдущей команде mongodump, эту также можно добавить как задание cron. Он должен запускаться непосредственно перед запуском следующего резервного копирования, например. в 03:01. Для этого снова откройте crontab:

  1. sudo crontab -e

После этого вставьте следующую строку:

3 1 * * * find /var/backups/mongobackups/ -mtime +7 -exec rm -rf {} \;

Выполнение всех задач на этом этапе обеспечит хорошее решение для резервного копирования ваших баз данных MongoDB.

Восстановление и миграция базы данных MongoDB

Восстановив базу данных MongoDB из предыдущей резервной копии (например, из предыдущего шага), вы сможете получить точную копию своей информации MongoDB, полученную в определенное время, включая все индексы и типы данных. Это особенно полезно, когда вы хотите перенести свои базы данных MongoDB. Для восстановления MongoDB мы будем использовать команду mongorestore, которая работает с двоичной резервной копией, созданной mongodump.

Давайте продолжим наши примеры с базой данных newdb и посмотрим, как мы можем восстановить ее из ранее созданной резервной копии. В качестве аргументов укажем сначала имя базы данных с аргументом --db. Затем с помощью --drop мы удостоверимся, что целевая база данных сначала будет удалена, чтобы резервная копия была восстановлена в чистой базе данных. В качестве последнего аргумента укажем каталог последней резервной копии /var/backups/mongobackups/01-20-16/newdb/. Таким образом, вся команда будет выглядеть так (замените дату резервной копии, которую вы хотите восстановить):

  1. sudo mongorestore --db newdb --drop /var/backups/mongobackups/01-20-16/newdb/

Успешное выполнение покажет следующий вывод:

2016-01-20T10:44:47.876-0500    building a list of collections to restore from /var/backups/mongobackups/01-20-16/newdb/ dir
2016-01-20T10:44:47.908-0500    reading metadata file from /var/backups/mongobackups/01-20-16/newdb/restaurants.metadata.json
2016-01-20T10:44:47.909-0500    restoring newdb.restaurants from file /var/backups/mongobackups/01-20-16/newdb/restaurants.bson
2016-01-20T10:44:48.591-0500    restoring indexes for collection newdb.restaurants from metadata
2016-01-20T10:44:48.592-0500    finished restoring newdb.restaurants (25359 documents)
2016-01-20T10:44:48.592-0500    done

В приведенном выше случае мы восстанавливаем данные на том же сервере, где была создана резервная копия. Если вы хотите перенести данные на другой сервер и использовать тот же метод, вы должны просто скопировать каталог резервной копии, который находится в /var/backups/mongobackups/01-20-16/newdb / в нашем случае на другой сервер.

Заключение

В этой статье вы познакомились с основами управления данными MongoDB с точки зрения резервного копирования, восстановления и миграции баз данных. Вы можете продолжить чтение статьи «Как настроить масштабируемую базу данных MongoDB», в которой объясняется репликация MongoDB.

Репликация не только полезна для масштабируемости, но также важна для текущих тем. Репликация позволяет вам продолжать бесперебойную работу службы MongoDB с подчиненного сервера MongoDB, пока вы восстанавливаете главный сервер после сбоя. Частью репликации также является журнал операций (oplog), в котором записываются все операции, изменяющие ваши данные. Вы можете использовать этот журнал так же, как вы использовали бы двоичный журнал в MySQL, для восстановления ваших данных после последнего резервного копирования. Напомним, что резервное копирование обычно происходит ночью, и если вы решите восстановить резервную копию вечером, вы потеряете все обновления с момента последнего резервного копирования.