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

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

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

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

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

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

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

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

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

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

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

  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.

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

24 голоса | спросил Tiago 24 J000000Friday15 2015, 12:17:23

1 ответ


2

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

ответил JJussi 15 J0000006Europe/Moscow 2017, 08:28:23

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132