Mongodb инкрементные резервные копии


26

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

Я прочитал oplogи понял, что было очень легко разработать что-то для воспроизведения журнала, но оказалось, что мне это не нужно, как это mongorestoreделает для меня.

Теперь у меня есть рабочее решение со скриптами bash, и это было довольно легко, поэтому я спрашиваю здесь, есть ли какая-то ошибка в моей логике, или, может быть, что-то, что укусит меня в будущем.

Ниже, как я это реализовал:

Полная процедура резервного копирования

  1. блокировка записи на вторичном элементе db.fsyncLock()
  2. Моментальный снимок
  3. Запишите последнюю позицию из оплога

    db.oplog.rs.find().sort({$natural:-1}).limit(1).next().ts
  4. Разблокировать пишет db.fsyncUnlock()

Процедура инкрементного резервного копирования

  1. блокировка записи на вторичном элементе
  2. Извлечь оплог из записанной позиции оплога при полном (или последнем инкрементном) резервном копировании:

    mongodump --host <secondary> -d local -c oplog.rs -o /mnt/mongo-test_backup/1 
        --query '{ "ts" : { $gt :  Timestamp(1437725201, 50) } }'
    
  3. Запишите последнюю позицию оплога (так же, как и для полных резервных копий)

  4. Разблокировать пишет

Процедура полного резервного копирования

  1. остановить все случаи mongod
  2. скопируйте снимок в каталог данных блока, который будет основным, но убедитесь, что исключили все, local*и mongod.lock этот метод восстановления называется перенастройкой путем разбивания зеркала
  3. Начальный начальный
  4. перенастроить репликацию
  5. Запустите вторичные серверы без каких-либо данных, дайте им выполнить первоначальную синхронизацию. Или скопируйте данные из нового первичного с новой localбазой данных

Восстановить инкрементное резервное копирование

Когда мы создали инкрементное резервное копирование, оно хранилось так:

/mnt/mongo-test_backup/1/local/oplog.rs.bson
/mnt/mongo-test_backup/1/local/oplog.rs.metadata.json

Мы добавлены, oplog.rs.bsonно нам придется переименовать его, так что вот шаги:

  1. изменить каталог на резервную копию: cd /mnt/mongo-test_backup/1/local
  2. удалить файл json rm *.json
  3. переименовать файл bson mv oplog.rs.bson oplog.bson
  4. восстановить это:

    mongorestore -h <primary> --port <port> --oplogReplay /mnt/mongo-test_backup/1/local

У меня все это написано в скрипте, я могу зафиксировать это на GitHub позже.

Вопрос в том, есть ли какой-либо недостаток в логике? Я немного подозрительна, так как процедура довольно проста, и все же я нигде не смог найти ее документированной.


2
Какую версию Mongo вы используете? Если вы используете wiredtiger, то первый элемент, на который вы ссылаетесь с помощью db.fsyncLock (), является проблемой. MongoDB Inc утверждает, что «с WiredTiger команда fsync с опцией блокировки не может гарантировать, что файлы данных не изменятся. В результате не используйте эти методы для обеспечения согласованности в целях создания резервных копий». ссылка
SDillon

1
@SDillon использует 3.0.4, но не использует WiredTiger, по крайней мере пока. Если мы решим использовать его, вместо того, чтобы блокировать запись, нам придется остановить mongod все вместе. Это справедливо, спасибо
Тиаго

Я нашел следующий инструмент для инкрементного резервного копирования github.com/EqualExperts/Tayra надеюсь, что это поможет
Ахмад Абухасна

1
«Изменено в версии 3.2: команда fsync с опцией блокировки может гарантировать, что файлы данных не изменятся для экземпляров MongoDB, использующих механизмы хранения MMAPv1 или WiredTiger, что обеспечивает согласованность в целях создания резервных копий».
безопасность

Нормальным (и абсолютно простым) способом создания инкрементных резервных копий является использование LVM и моментальных снимков. docs.mongodb.com/manual/tutorial/…
JJussi

Ответы:


3

Ответить на ваш вопрос. Нет! В вашей логике нет сбоев, и она должна работать без проблем. Однако, если можно использовать снимки LVM, это лучший способ сделать резервные копии.


Как вы делаете инкрементное резервное копирование снимка LVM? Благодарность!
TanisDLJ

Снимки LVM являются инкрементными по своей природе. Снимок - это моменты времени и записаны только изменения.
JJussi

Просто снимок сделан да, это постепенно. Но если вы архивируете снимок, то это полная резервная копия. Вы не можете архивировать различные инкрементные резервные копии, как, например, дублирование. И вы не можете просто начать создавать снимки каждые 30 минут для инкрементных резервных копий, так как это очень сильно ухудшит производительность.
TanisDLJ
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.