Мені було дано завдання встановити додаткові резервні копії для реплікації MongoDB, як початкову точку, звичайно, я погуглив її і нічого не міг знайти в документах MongoDB, проте я знайшов це питання в Stack Overflow, що спонукало розробити власне рішення як не знайшов Тайру дуже активною.
Я прочитав про oplog
і зрозумів, що дуже легко розробити щось для відтворення журналу, але виявилося, що мені не довелося так mongorestore
робити.
Зараз у мене є робоче рішення зі скриптами bash, і це було досить просто, тому я питаю тут, чи є якийсь недолік у моїй логіці чи, можливо, щось, що мене вкусить у майбутньому.
Нижче, як я це реалізував:
Повна процедура резервного копіювання
- Блокування записується на другорядний член
db.fsyncLock()
- Зробіть знімок
Записати останню позицію з oplog
db.oplog.rs.find().sort({$natural:-1}).limit(1).next().ts
Unlock пише
db.fsyncUnlock()
Поступова процедура резервного копіювання
- Блокування записується на другорядний член
Дамп-опил із записаного положення oplog на повній (або останній додатковій) резервній копії:
mongodump --host <secondary> -d local -c oplog.rs -o /mnt/mongo-test_backup/1 --query '{ "ts" : { $gt : Timestamp(1437725201, 50) } }'
Запишіть останню позицію oplog (так само, як і для повних резервних копій)
- Unlock пише
Повна процедура відновлення резервного копіювання
- зупинити всі інстанції
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 пізніше.
Питання в тому, чи є якась вада в логіці? Я трохи підозрілий, оскільки процедура є досить прямою, і я все одно не міг знайти її документально ніде.