Dostałem zadanie tworzenia przyrostowych kopii zapasowych dla repliki MongoDB, jako punkt początkowy, oczywiście, przejrzałem go i nie mogłem znaleźć niczego w dokumentach MongoDB, znalazłem jednak to pytanie na Stack Overflow, które zachęciło do opracowania własnego rozwiązania ponieważ nie uważał Tayry za bardzo aktywną.
Przeczytałem o tym oplog
i zdałem sobie sprawę, że bardzo łatwo było opracować coś, aby odtworzyć dziennik, ale okazuje się, że nie musiałem, jak mongorestore
to dla mnie.
Teraz mam działające rozwiązanie ze skryptami bash i było to dość łatwe, dlatego pytam tutaj, czy w mojej logice jest jakaś wada, a może coś, co mnie ugryzie w przyszłości.
Poniżej, jak to zaimplementowałem:
Pełna procedura tworzenia kopii zapasowej
- lock zapisuje na drugorzędnym elemencie
db.fsyncLock()
- Zrób zdjęcie
Zapisz ostatnią pozycję z oplogu
db.oplog.rs.find().sort({$natural:-1}).limit(1).next().ts
Odblokuj pisze
db.fsyncUnlock()
Procedura przyrostowej kopii zapasowej
- lock zapisuje na drugorzędnym elemencie
Zrzuć oplog z zarejestrowanej pozycji oplog na pełnej (lub najnowszej przyrostowej) kopii zapasowej:
mongodump --host <secondary> -d local -c oplog.rs -o /mnt/mongo-test_backup/1 --query '{ "ts" : { $gt : Timestamp(1437725201, 50) } }'
Zapisz najnowszą pozycję oplogu (w taki sam sposób, jak w przypadku pełnych kopii zapasowych)
- Odblokuj pisze
Procedura przywracania pełnej kopii zapasowej
- zatrzymaj wszystkie wystąpienia
mongod
- skopiuj migawkę do katalogu danych skrzynki, która będzie podstawowa, ale pamiętaj, aby wykluczyć wszystko,
local*
amongod.lock
ta technika przywracania nazywana jest rekonfiguracją przez rozbicie lustra - Zacznij podstawową
- rekonfiguruj replicaset
- uruchom pomocnicze bez żadnych danych, pozwól im wykonać początkową synchronizację. Lub skopiuj dane z nowej podstawowej z nową
local
bazą danych
Przywróć przyrostową kopię zapasową
Kiedy utworzyliśmy przyrostową kopię zapasową, zapisaliśmy ją w następujący sposób:
/mnt/mongo-test_backup/1/local/oplog.rs.bson
/mnt/mongo-test_backup/1/local/oplog.rs.metadata.json
Jesteśmy wpisani, oplog.rs.bson
ale będziemy musieli zmienić nazwę, więc oto kroki:
- zmień katalog na kopię zapasową:
cd /mnt/mongo-test_backup/1/local
- usuń plik json
rm *.json
- zmień nazwę pliku bson
mv oplog.rs.bson oplog.bson
przywróć to:
mongorestore -h <primary> --port <port> --oplogReplay /mnt/mongo-test_backup/1/local
Mam wszystko skrypty, mogę później zatwierdzić to w GitHub.
Pytanie brzmi, czy w logice jest jakaś wada? Jestem trochę podejrzliwy, ponieważ procedura jest dość prosta i nadal nie mogłem jej nigdzie udokumentować.