Jeżeli zarządzasz aplikacjami opartymi na bazie MongoDB, pewnie zauważyłeś, że wraz ze wzrostem ilości przechowywanych danych i ich coraz intensywniejszym użyciem, pojawia się potrzeba tworzenia kopii zapasowych. W tym artykule podzielę się moim doświadczeniem i wskazówkami, jak zautomatyzować proces tworzenia kopii zapasowych bazy MongoDB.
Moja konfiguracja i sposób działania
Korzystam z serwera dedykowanego, na którym zainstalowany jest pakiet MongoDB. Regularne zrzuty bazy danych generowane są za pomocą skryptu shell, a za ich cykliczne wywoływanie odpowiada crontab.
Po utworzeniu zrzutu, pliki są kompresowane. Następnie sprawdzana jest ich data i usuwane są te, które są starsze niż 60 dni. Dodatkowo, skrypt shell z wykorzystaniem aplikacji rclone przesyła pliki z folderu na zewnętrzną lokalizację (Google Drive) raz w tygodniu. Po wykonaniu wszystkich tych działań, otrzymuję maila z informacją o przebiegu procesu tworzenia kopii.
Preferuję eksport do formatu JSON, ponieważ łatwiej jest później zaimportować taką bazę poprzez MongoDB Compass, a także jest to format bardziej przejrzysty niż cały zrzut w formacie BSON.
Jak to zrobić: Przykładowy skrypt i przydatne komendy
W oficjalnej dokumentacji MongoDB znajdziesz wiele przydatnych komend, które pozwalają na tworzenie zrzutów bazy do odpowiednich plików. Te komendy możesz zaimplementować w swoich aplikacjach (NodeJS, PHP). Pamiętaj, aby odblokować port wychodzący 27017, jeśli chcesz połączyć się z bazą znajdującą się na innym serwerze.
- Mongoexport (dostępny od wersji MongoDB 3.6+) [dokumentacja]
mongoexport --uri="mongodb://mongodb0.example.com:27017/reporting" --collection=events --out=events.json [additional options]
- Mongodump [dokumentacja]
mongodump --uri="mongodb+srv://..." --gzip --archive=... --db=test --excludeCollection=users --excludeCollection=salaries
Z wykorzystaniem powyższych komend możesz pobrać zrzut bazy danych. Mongodump wykonuje zrzut w formacie BSON i umożliwia automatyczną kompresję. Z kolei Mongoexport pozwala na eksport kolekcji do pliku JSON. Niestety ta funkcja została wprowadzona dopiero od wersji 3.6.
Przykładowy skrypt Shell
#!/bin/bash
# Connection to the database, select collection with -c parameter, file format with --type, and output directory (-o)
mongoexport --uri="mongodb+srv://..." -c kolekcja --type=json -o /home/.../kopia/zrzutkolekcja_$(date +%Y-%m-%d).json
# Compress the collection to zip - in my case, the whole folder with all dumped .json collections is compressed
zip /home/.../kopia/kopia_$(date +%Y-%m-%d).zip /home/.../kopia/zrzutkolekcja_*
# After compression, json files are no longer needed, so I delete them
rm -f /home/.../kopia/zrzutkolekcja*
# Mongodump - another way to dump a database, has the --archive parameter, which allows for automatic backup of the file
mongodump --uri="mongodb+srv://..." --gzip --archive=/home/.../kopia/kopiabson_$(date +%Y-%m-%d).gz
# If the compressed files in the 'kopia' folder are older than 60 days (mtime parameter), they are found and then deleted
find /home/.../kopia/ -name "*.gz" -type f -mtime +60 -exec rm -f {} \;
find /home/.../kopia/ -name "*.zip" -type f -mtime +60 -exec rm -f {} \;
Jeżeli posiadasz odpowiednią konfigurację serwerową, każde wywołanie skryptu spowoduje wysłanie wiadomości na adres e-mail z informacją o przebiegu procesu.