Przyrostowe kopie zapasowe Mongodb

26

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 oplogi zdałem sobie sprawę, że bardzo łatwo było opracować coś, aby odtworzyć dziennik, ale okazuje się, że nie musiałem, jak mongorestoreto 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

  1. lock zapisuje na drugorzędnym elemencie db.fsyncLock()
  2. Zrób zdjęcie
  3. Zapisz ostatnią pozycję z oplogu

    db.oplog.rs.find().sort({$natural:-1}).limit(1).next().ts
  4. Odblokuj pisze db.fsyncUnlock()

Procedura przyrostowej kopii zapasowej

  1. lock zapisuje na drugorzędnym elemencie
  2. 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) } }'
  3. Zapisz najnowszą pozycję oplogu (w taki sam sposób, jak w przypadku pełnych kopii zapasowych)

  4. Odblokuj pisze

Procedura przywracania pełnej kopii zapasowej

  1. zatrzymaj wszystkie wystąpienia mongod
  2. skopiuj migawkę do katalogu danych skrzynki, która będzie podstawowa, ale pamiętaj, aby wykluczyć wszystko, local*a mongod.lock ta technika przywracania nazywana jest rekonfiguracją przez rozbicie lustra
  3. Zacznij podstawową
  4. rekonfiguruj replicaset
  5. uruchom pomocnicze bez żadnych danych, pozwól im wykonać początkową synchronizację. Lub skopiuj dane z nowej podstawowej z nową localbazą 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.bsonale będziemy musieli zmienić nazwę, więc oto kroki:

  1. zmień katalog na kopię zapasową: cd /mnt/mongo-test_backup/1/local
  2. usuń plik json rm *.json
  3. zmień nazwę pliku bson mv oplog.rs.bson oplog.bson
  4. 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ć.

Tiago
źródło
2
Jakiej wersji Mongo używasz? Jeśli używasz wiredtiger, problem stanowi pierwszy element, do którego odwołuje się funkcja db.fsyncLock (). MongoDB Inc twierdzi: „W przypadku WiredTiger polecenie fsync z opcją blokady nie gwarantuje, że pliki danych się nie zmienią. W związku z tym nie należy używać tych metod, aby zapewnić spójność podczas tworzenia kopii zapasowych”. link
SDillon,
1
@SDillon korzystający z wersji 3.0.4, ale nie korzystający z WiredTiger, przynajmniej jeszcze nie. Postanawiam go użyć, zamiast zamka pisze, będziemy musieli zatrzymać mongod razem. To słuszne dzięki
Tiago,
Znalazłem następujące narzędzie do tworzenia przyrostowej kopii zapasowej github.com/EqualExperts/Tayra. Mam nadzieję, że to pomoże
Ahmad Abuhasna
1
„Zmieniono w wersji 3.2: polecenie fsync z opcją blokady może zapewnić, że pliki danych nie ulegną zmianie dla instancji MongoDB przy użyciu mechanizmów magazynowania MMAPv1 lub WiredTiger, zapewniając w ten sposób spójność podczas tworzenia kopii zapasowych.”
bezpieczeństwo
Normalnym (i absolutnie najłatwiejszym) sposobem tworzenia przyrostowych kopii zapasowych jest użycie LVM i migawek. docs.mongodb.com/manual/tutorial/…
JJussi

Odpowiedzi:

3

Odpowiedzieć na Twoje pytanie. Nie! Logika nie zawiedzie i powinna działać bez problemów. Jeśli jednak można użyć migawek LVM, lepiej wykonać kopie zapasowe.

JJussi
źródło
Jak wykonywać przyrostowe kopie zapasowe migawki LVM? Dzięki!
TanisDLJ
Migawki LVM są z natury przyrostowe. Migawka to chwile w czasie i rejestrowane są tylko zmiany.
JJussi
Po prostu migawka zrobiona tak, jest przyrostowa. Ale jeśli zarchiwizujesz migawkę, jest to pełna kopia zapasowa. Nie można archiwizować różnych przyrostowych kopii zapasowych, takich jak na przykład duplikacja. I nie można po prostu zacząć tworzyć migawek co 30 minut dla przyrostowych kopii zapasowych, ponieważ mogłoby to naprawdę pogorszyć wydajność.
TanisDLJ