Бэкап, восстановление и перемещение данных MongoDB в Ubuntu 14.04

MongoDB – одна из самых популярных систем управления базами данных NoSQL. Она производительна, надёжна, проста в использовании и масштабировании. Данное руководство научит создавать и восстанавливать резервные копии данных и перемещать данные в MongoDB.

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

Требования

  • Сервер Ubuntu 14.04.
  • Не-root пользователь с правами sudo; все команды нужно выполнять в сессии этого пользователя (если не указано иное). О правах sudo можно прочесть здесь.
  • Предварительно установленная система MongoDB; инструкции по установке – по этой ссылке.
  • Предварительно импортированный образец базы данных MongoDB; все необходимые инструкции можно найти здесь.

Базовые понятия

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

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

Документ json имеет такой вид:

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

С форматом json очень удобно работать, однако он не поддерживает всех типов данных, поддерживаемых bson. Это значит, что при передаче данных может произойти потеря точности. Потому для создания и восстановления бэкапа рекомендуется использовать формат bson.

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

Чтение или внесение больших объёмов данных в MongoDB может быть очень затратным и потребить большую часть CPU, памяти и дискового пространства. Учитывая, что MongoDB часто используется для работы с Big Data, это критическая проблема. Самое простое её решение – выполнять экспорт и бэкап данных во время низкого трафика (например, ночью).

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

Конечно, переместить данные можно путём импорта или экспорта. Но чтобы обеспечить целостность данных, рекомендуется перемещать БД путём создания и восстановления резервных копий.

Для создания бэкапа используется команда mongodump, для восстановления – mongorestore.

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

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

sudo mkdir /var/backups/mongobackups

Теперь запустите команду для создания бэкапа:

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”. Она автоматически устанавливает текущую дату. Это позволяет поместить копию в соответствующий каталог; эта функция особенно удобна при автоматическом резервном копировании.

Итак, у вас есть полная резервная копия БД newdb в каталоге /var/backups/mongobackups/01-20-16/newdb/. Эта копия позволяет полностью восстановить базу данных newdb, сохранив точность данных.

Как правило, резервные копии нужно создавать регулярно (например, на ежедневной основе); предпочтительно это делать во время низкой нагрузки на сервер. Для этого можно автоматизировать бэкап, поместив команду mongodump в cron. Откройте кронтаб:

sudo crontab -e

Команда sudo crontab откроет для редактирования кронтаб пользователя root. Рекомендуется использовать именно этот кронтаб, поскольку таблицы других пользователей могут работать некорректно (например, демон cron может потребовать пароль). К примеру, чтобы демон создавал копию каждый день в 03:03 AM, нужно добавить в кронтаб:

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

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

Стоит отметить, что ежедневное резервное копирование относительно быстро потребляет дисковое пространство (в зависимости от объёма БД MongoDB). Потому рекомендуется регулярно удалять или сжимать старые копии. К примеру, чтобы удалить все копии старше 7 дней, можно использовать команду:

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

Эту команду можно также добавить в cron. Она должна запускаться незадолго до начала резервного копирования, например, в 03.01. Откройте кронтаб:

sudo crontab -e

Вставьте в таблицу следующую строку:

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

Восстановление и перемещение данных MongoDB

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

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

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

В данном случае бэкап был создан и восстановлен на одном и том же сервере. Чтобы переместить БД на другой сервер, просто скопируйте каталог резервной копии на новый сервер и восстановите БД.

Заключение

Данное руководство охватывает основы управления резервными копиями MongoDB.

Чтобы узнать о репликации данных, читайте статью «Настройка масштабируемой базы данных MongoDB».

Репликация данных полезна не только при масшабировании, она также может пригодиться в повседневной работе. Репликация данных позволяет поддерживать работу приложения в случае сбоя сервера MongoDB; это делается за счёт ведомых (или slave) серверов MongoDB. В процессе репликации задействованы логи operations (или oplog), которые хранят все операции, изменившие данные. Эти файлы можно использовать для восстановления данных.

Имейте в виду: резервное копирование, как правило, выполняется в ночное время; если вы решите восстановить резервную копию в вечернее время, вы потеряете все обновления данных с момента последнего резервного копирования.

Tags: , ,

Добавить комментарий