Мне было дано задание настроить инкрементные резервные копии для репликационного набора 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 позже.
Вопрос в том, есть ли какой-либо недостаток в логике? Я немного подозрительна, так как процедура довольно проста, и все же я нигде не смог найти ее документированной.