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

Автор выбрал Фонд помощи в борьбе с COVID-19 для получения пожертвования в рамках программы Пиши за пожертвования.

Введение

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

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

Предварительные условия

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

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

Шаг 1 — Использование JSON и BSON в MongoDB

Перед тем, как продолжить дальше с этой статьей, необходимо иметь базовое понимание предмета. Если у вас есть опыт работы с другими системами баз данных NoSQL, такими как Redis, вы можете обнаружить некоторые сходства при работе с MongoDB.

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

Пример документа в формате .json выглядит следующим образом:

Example of JSON Format
{"address":[
    {"building":"1007", "street":"Park Ave"},
    {"building":"1008", "street":"New Ave"},
]}

JSON удобен для работы, но он не поддерживает все типы данных, доступные в BSON. Это означает, что произойдет так называемая “потеря достоверности” информации, если вы будете использовать JSON. Для резервного копирования и восстановления лучше использовать бинарный BSON.

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

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

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

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

Шаг 2 — Использование mongodump для резервного копирования базы данных MongoDB

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

Важным аргументом для mongodump является --db, который указывает имя базы данных, которую вы хотите сохранить. Если вы не указываете имя базы данных, mongodump сохраняет все ваши базы данных. Вторым важным аргументом является --out, который определяет каталог, в который будут выгружены данные. Например, давайте сделаем резервную копию базы данных newdb и сохраним её в каталоге /var/backups/mongobackups. Идеально было бы иметь каждую из наших резервных копий в каталоге с текущей датой, например, /var/backups/mongobackups/10-29-20.

Сначала создайте этот каталог /var/backups/mongobackups:

  1. sudo mkdir /var/backups/mongobackups

Затем выполните mongodump:

  1. sudo mongodump --db newdb --out /var/backups/mongobackups/$(date +'%m-%d-%y')

Вы увидите вывод подобный этому:

Output
2020-10-29T19:22:36.886+0000 writing newdb.restaurants to 2020-10-29T19:22:36.969+0000 done dumping newdb.restaurants (25359 documents)

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

На этом этапе у вас есть полная резервная копия базы данных newdb в каталоге /var/backups/mongobackups/10-29-20/newdb/. В этой резервной копии содержится все необходимое для восстановления базы данных newdb и сохранения её так называемой “фидельности”.

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

Чтобы выполнить это, откройте crontab, редактор cron:

  1. sudo crontab -e

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

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

crontab
  1. 3 3 * * * mongodump --out /var/backups/mongobackups/$(date +'\%m-\%d-\%y')

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

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

Например, чтобы удалить все резервные копии старше семи дней, вы можете использовать следующую команду bash:

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

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

  1. sudo crontab -e

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

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

Сохраните и закройте файл.

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

Шаг 3 — Использование mongorestore для восстановления и миграции базы данных MongoDB

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

Продолжим наши примеры с базой данных newdb и посмотрим, как мы можем восстановить ее из ранее взятой резервной копии. Сначала мы укажем имя базы данных с аргументом --nsInclude. Мы будем использовать newdb.* для восстановления всех коллекций. Чтобы восстановить отдельную коллекцию, такую как restaurants, используйте вместо этого newdb.restaurants.

Затем, используя --drop, мы убедимся, что целевая база данных сначала удаляется, чтобы резервная копия была восстановлена в чистую базу данных. В качестве последнего аргумента мы укажем каталог последнего резервного копирования, который будет выглядеть примерно так: /var/backups/mongobackups/10-29-20/newdb/.

Как только у вас есть резервная копия с отметкой времени, вы можете восстановить ее с помощью этой команды (обновив дату, чтобы совпадала с вашей):

  1. sudo mongorestore --db newdb --drop /var/backups/mongobackups/10-29-20/newdb/

Вы увидите вывод подобный этому:

Output
2020-10-29T19:25:45.825+0000 the --db and --collection args should only be used when restoring from a BSON file. Other uses are deprecated and will not exist in the future; use --nsInclude instead 2020-10-29T19:25:45.826+0000 building a list of collections to restore from /var/backups/mongobackups/10-29-20/newdb dir 2020-10-29T19:25:45.829+0000 reading metadata for newdb.restaurants from /var/backups/mongobackups/10-29-20/newdb/restaurants.metadata.json 2020-10-29T19:25:45.834+0000 restoring newdb.restaurants from /var/backups/mongobackups/10-29-20/newdb/restaurants.bson 2020-10-29T19:25:46.130+0000 no indexes to restore 2020-10-29T19:25:46.130+0000 finished restoring newdb.restaurants (25359 documents) 2020-10-29T19:25:46.130+0000 done

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

Вывод

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

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

Source:
https://www.digitalocean.com/community/tutorials/how-to-back-up-restore-and-migrate-a-mongodb-database-on-ubuntu-20-04