Мне было дано задание настроить инкрементные резервные копии для репликационного набора MongoDB, поскольку в качестве начальной точки я, конечно, гуглил его и ничего не мог найти в документах MongoDB, однако я нашел этот вопрос о переполнении стека, что побудило разработать собственное решение так как не нашел Тайру очень активной.
Я прочитал oplog
и понял, что было очень легко разработать что-то для воспроизведения журнала, но оказалось, что мне это не нужно, как это mongorestore
делает для меня.
Теперь у меня есть рабочее решение со скриптами bash, и это было довольно легко, поэтому я спрашиваю здесь, есть ли какая-то ошибка в моей логике, или, может быть, что-то, что укусит меня в будущем.
Ниже, как я это реализовал:
Полная процедура резервного копирования
- блокировка записи на вторичном элементе
db.fsyncLock()
- Моментальный снимок
Запишите последнюю позицию из оплога
db.oplog.rs.find().sort({$natural:-1}).limit(1).next().ts
Разблокировать пишет
db.fsyncUnlock()
Процедура инкрементного резервного копирования
- блокировка записи на вторичном элементе
Извлечь оплог из записанной позиции оплога при полном (или последнем инкрементном) резервном копировании:
mongodump --host <secondary> -d local -c oplog.rs -o /mnt/mongo-test_backup/1 --query '{ "ts" : { $gt : Timestamp(1437725201, 50) } }'
Запишите последнюю позицию оплога (так же, как и для полных резервных копий)
- Разблокировать пишет
Процедура полного резервного копирования
- остановить все случаи
mongod
- скопируйте снимок в каталог данных блока, который будет основным, но убедитесь, что исключили все,
local*
иmongod.lock
этот метод восстановления называется перенастройкой путем разбивания зеркала - Начальный начальный
- перенастроить репликацию
- Запустите вторичные серверы без каких-либо данных, дайте им выполнить первоначальную синхронизацию. Или скопируйте данные из нового первичного с новой
local
базой данных
Восстановить инкрементное резервное копирование
Когда мы создали инкрементное резервное копирование, оно хранилось так:
/mnt/mongo-test_backup/1/local/oplog.rs.bson
/mnt/mongo-test_backup/1/local/oplog.rs.metadata.json
Мы добавлены, oplog.rs.bson
но нам придется переименовать его, так что вот шаги:
- изменить каталог на резервную копию:
cd /mnt/mongo-test_backup/1/local
- удалить файл json
rm *.json
- переименовать файл bson
mv oplog.rs.bson oplog.bson
восстановить это:
mongorestore -h <primary> --port <port> --oplogReplay /mnt/mongo-test_backup/1/local
У меня все это написано в скрипте, я могу зафиксировать это на GitHub позже.
Вопрос в том, есть ли какой-либо недостаток в логике? Я немного подозрительна, так как процедура довольно проста, и все же я нигде не смог найти ее документированной.