- Home »

Как делать резервное копирование, восстановление и миграцию MongoDB на Ubuntu 24
Работа с MongoDB на продакшене — это не только хранение данных, но и постоянная забота о том, чтобы они не потерялись. Каждый админ или разработчик сталкивается с необходимостью делать бэкапы, восстанавливать данные после сбоев или мигрировать базы между серверами. Особенно актуально это стало с Ubuntu 24, где MongoDB работает несколько по-другому из-за новых systemd-правил и измененной файловой системы.
Сегодня разберем, как правильно делать резервное копирование MongoDB, восстанавливать данные и переносить базы между серверами. Покажу практические команды, расскажу о подводных камнях и дам готовые скрипты для автоматизации. Если вы думаете, что достаточно просто скопировать файлы базы данных — то вы сильно заблуждаетесь.
Как работает резервное копирование в MongoDB
MongoDB использует два основных подхода для создания резервных копий: логические и физические бэкапы. Логические создаются с помощью утилит mongodump/mongorestore, а физические — это копирование файлов данных напрямую.
Основное отличие заключается в том, что логические бэкапы создают BSON-документы, которые потом можно восстановить на любой версии MongoDB (с некоторыми ограничениями). Физические бэкапы — это снимок файлов данных, который работает только с той же версией MongoDB.
В Ubuntu 24 MongoDB по умолчанию хранит данные в /var/lib/mongodb
, а логи в /var/log/mongodb
. Это важно знать для настройки автоматических бэкапов.
Установка и подготовка инструментов
Для начала убедимся, что у нас есть все необходимые инструменты. В Ubuntu 24 MongoDB Database Tools нужно устанавливать отдельно:
sudo apt update
sudo apt install mongodb-database-tools
# Проверяем версию
mongodump --version
mongorestore --version
Также создадим пользователя для бэкапов с нужными правами:
mongosh
use admin
db.createUser({
user: "backupuser",
pwd: "strong_password_here",
roles: [
{ role: "backup", db: "admin" },
{ role: "restore", db: "admin" }
]
})
Создание резервных копий с помощью mongodump
Самый простой способ создать бэкап всех баз данных:
# Бэкап всех баз данных
mongodump --username backupuser --password strong_password_here --authenticationDatabase admin --out /backup/mongodb/$(date +%Y%m%d_%H%M%S)
# Бэкап конкретной базы данных
mongodump --username backupuser --password strong_password_here --authenticationDatabase admin --db myapp --out /backup/mongodb/myapp_$(date +%Y%m%d_%H%M%S)
# Бэкап конкретной коллекции
mongodump --username backupuser --password strong_password_here --authenticationDatabase admin --db myapp --collection users --out /backup/mongodb/users_$(date +%Y%m%d_%H%M%S)
Для сжатия бэкапов используйте флаг --gzip
:
mongodump --username backupuser --password strong_password_here --authenticationDatabase admin --gzip --out /backup/mongodb/compressed_$(date +%Y%m%d_%H%M%S)
Восстановление данных с помощью mongorestore
Восстановление из бэкапа так же просто, как и создание:
# Восстановление всех баз данных
mongorestore --username backupuser --password strong_password_here --authenticationDatabase admin /backup/mongodb/20241201_143000
# Восстановление в другую базу данных
mongorestore --username backupuser --password strong_password_here --authenticationDatabase admin --db myapp_restored /backup/mongodb/myapp_20241201_143000/myapp
# Восстановление сжатого бэкапа
mongorestore --username backupuser --password strong_password_here --authenticationDatabase admin --gzip /backup/mongodb/compressed_20241201_143000
Полезные опции для восстановления:
--drop
— удаляет коллекции перед восстановлением--dryRun
— показывает, что будет сделано, но не выполняет операции--stopOnError
— останавливается при первой ошибке--maintainInsertionOrder
— сохраняет порядок вставки документов
Миграция между серверами
Для миграции данных между серверами можно использовать несколько подходов. Самый простой — создать бэкап на одном сервере и восстановить на другом:
# На исходном сервере
mongodump --username backupuser --password strong_password_here --authenticationDatabase admin --gzip --out /tmp/migration_backup
# Копируем на целевой сервер
rsync -avz /tmp/migration_backup/ user@target-server:/tmp/migration_backup/
# На целевом сервере
mongorestore --username backupuser --password strong_password_here --authenticationDatabase admin --gzip /tmp/migration_backup
Для больших баз данных можно использовать прямое копирование:
# Прямая миграция без промежуточных файлов
mongodump --username backupuser --password strong_password_here --authenticationDatabase admin --gzip --archive | ssh user@target-server "mongorestore --username backupuser --password strong_password_here --authenticationDatabase admin --gzip --archive"
Автоматизация резервного копирования
Создадим скрипт для автоматического резервного копирования:
#!/bin/bash
# /usr/local/bin/mongodb-backup.sh
BACKUP_DIR="/backup/mongodb"
MONGO_USER="backupuser"
MONGO_PASSWORD="strong_password_here"
RETENTION_DAYS=7
# Создаем директорию с текущей датой
BACKUP_PATH="$BACKUP_DIR/$(date +%Y%m%d_%H%M%S)"
mkdir -p $BACKUP_PATH
# Создаем бэкап
mongodump --username $MONGO_USER --password $MONGO_PASSWORD --authenticationDatabase admin --gzip --out $BACKUP_PATH
# Проверяем успешность операции
if [ $? -eq 0 ]; then
echo "Backup successful: $BACKUP_PATH"
# Удаляем старые бэкапы
find $BACKUP_DIR -type d -mtime +$RETENTION_DAYS -exec rm -rf {} \;
# Опционально: отправляем уведомление
echo "MongoDB backup completed successfully" | mail -s "Backup Success" admin@example.com
else
echo "Backup failed"
echo "MongoDB backup failed" | mail -s "Backup Failed" admin@example.com
exit 1
fi
Делаем скрипт исполняемым и добавляем в crontab:
chmod +x /usr/local/bin/mongodb-backup.sh
# Добавляем в crontab (каждый день в 2:00)
crontab -e
# Добавляем строку:
# 0 2 * * * /usr/local/bin/mongodb-backup.sh
Сравнение методов резервного копирования
Метод | Преимущества | Недостатки | Когда использовать |
---|---|---|---|
mongodump/mongorestore | Независимость от версии, селективность, сжатие | Медленнее для больших баз, требует больше ресурсов | Регулярные бэкапы, миграция между версиями |
Файловое копирование | Быстрое, минимальная нагрузка | Требует остановки сервиса, привязка к версии | Холодный бэкап, клонирование серверов |
Репликация | Актуальность данных, отказоустойчивость | Сложность настройки, дополнительные ресурсы | Продакшн-окружение, высокая доступность |
Работа с большими базами данных
Для больших баз данных (более 100 ГБ) стандартный mongodump может занимать слишком много времени. В таких случаях используйте:
# Параллельное создание бэкапов коллекций
mongodump --username backupuser --password strong_password_here --authenticationDatabase admin --numParallelCollections 4 --out /backup/mongodb/parallel_$(date +%Y%m%d_%H%M%S)
# Использование oplog для консистентности
mongodump --username backupuser --password strong_password_here --authenticationDatabase admin --oplog --out /backup/mongodb/oplog_$(date +%Y%m%d_%H%M%S)
Для восстановления oplog-бэкапов:
mongorestore --username backupuser --password strong_password_here --authenticationDatabase admin --oplogReplay /backup/mongodb/oplog_20241201_143000
Мониторинг и проверка целостности
Важно не только создавать бэкапы, но и проверять их целостность. Создадим скрипт для валидации:
#!/bin/bash
# /usr/local/bin/validate-backup.sh
BACKUP_PATH=$1
TEMP_DB="backup_validation_$(date +%s)"
if [ -z "$BACKUP_PATH" ]; then
echo "Usage: $0 /path/to/backup"
exit 1
fi
# Восстанавливаем во временную базу
mongorestore --username backupuser --password strong_password_here --authenticationDatabase admin --db $TEMP_DB $BACKUP_PATH
if [ $? -eq 0 ]; then
echo "Backup validation successful"
# Удаляем временную базу
mongosh --username backupuser --password strong_password_here --authenticationDatabase admin --eval "db.getSiblingDB('$TEMP_DB').dropDatabase()"
exit 0
else
echo "Backup validation failed"
exit 1
fi
Особенности работы с MongoDB в Docker
Если MongoDB работает в Docker-контейнере, команды немного изменяются:
# Создание бэкапа из Docker-контейнера
docker exec mongodb-container mongodump --username backupuser --password strong_password_here --authenticationDatabase admin --out /backup
# Копирование бэкапа из контейнера
docker cp mongodb-container:/backup /host/backup/
# Восстановление в Docker-контейнер
docker cp /host/backup/ mongodb-container:/backup/
docker exec mongodb-container mongorestore --username backupuser --password strong_password_here --authenticationDatabase admin /backup
Интеграция с облачными хранилищами
Для надежности бэкапы стоит хранить в облачных хранилищах. Пример интеграции с AWS S3:
#!/bin/bash
# Расширенный скрипт бэкапа с отправкой в S3
BACKUP_DIR="/backup/mongodb"
BACKUP_PATH="$BACKUP_DIR/$(date +%Y%m%d_%H%M%S)"
S3_BUCKET="my-mongodb-backups"
# Создаем бэкап
mongodump --username backupuser --password strong_password_here --authenticationDatabase admin --gzip --out $BACKUP_PATH
# Архивируем
tar -czf $BACKUP_PATH.tar.gz -C $BACKUP_DIR $(basename $BACKUP_PATH)
# Отправляем в S3
aws s3 cp $BACKUP_PATH.tar.gz s3://$S3_BUCKET/mongodb/
# Удаляем локальные файлы
rm -rf $BACKUP_PATH $BACKUP_PATH.tar.gz
Альтернативные решения и инструменты
Помимо стандартных утилит MongoDB, существуют альтернативные решения:
- Percona Backup for MongoDB — расширенные возможности бэкапирования
- MongoDB Ops Manager — корпоративное решение для управления MongoDB
- pg_dump аналоги — сторонние утилиты с дополнительными возможностями
- Filesystem snapshots — использование LVM или ZFS снимков
Для тестирования и разработки на VPS или выделенных серверах часто достаточно простых решений, но для продакшена стоит рассмотреть более сложные варианты.
Производительность и оптимизация
Несколько советов по оптимизации процесса резервного копирования:
- Используйте
--readPreference secondary
для чтения с реплик - Планируйте бэкапы на период минимальной нагрузки
- Сжимайте данные на лету с помощью
--gzip
- Используйте параллельное копирование для ускорения
- Мониторьте дисковое пространство и I/O нагрузку
Заключение и рекомендации
Резервное копирование MongoDB — это критически важная часть администрирования базы данных. В Ubuntu 24 процесс стал более стабильным благодаря улучшенной интеграции с systemd, но требует внимательного подхода к настройке.
Для небольших проектов достаточно простых скриптов с mongodump/mongorestore и cron. Для корпоративных решений стоит рассмотреть специализированные инструменты и облачные хранилища.
Помните о трех основных правилах:
- Регулярно создавайте бэкапы
- Проверяйте возможность восстановления
- Храните копии в нескольких местах
Автоматизация процесса не только экономит время, но и снижает вероятность человеческих ошибок. Потратьте время на настройку мониторинга и уведомлений — это окупится при первой же критической ситуации.
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.