On m'a confié la tâche de configurer des sauvegardes incrémentielles pour le jeu de réplicas MongoDB, comme point de départ, bien sûr, je l'ai googlé et je n'ai rien trouvé sur les documents MongoDB, j'ai cependant trouvé cette question sur Stack Overflow, ce qui m'a encouragé à développer ma propre solution car il n'a pas trouvé Tayra très actif.
J'ai lu oplog
et réalisé qu'il était très facile de développer quelque chose pour rejouer le journal, mais il s'est avéré que je n'avais pas à faire de mongorestore
même pour moi.
Maintenant, j'ai une solution de travail avec les scripts bash et c'était assez facile, c'est la raison pour laquelle je demande ici s'il y a un défaut dans ma logique, ou peut-être quelque chose qui me mordra à l'avenir.
Ci-dessous, comment j'ai mis en œuvre cela:
Procédure de sauvegarde complète
- verrouillage écrit sur un membre secondaire
db.fsyncLock()
- Prendre un instantané
Enregistrer la dernière position de l'oplog
db.oplog.rs.find().sort({$natural:-1}).limit(1).next().ts
Déverrouiller les écritures
db.fsyncUnlock()
Procédure de sauvegarde incrémentielle
- verrouillage écrit sur un membre secondaire
Vider l'oplog de la position d'oplog enregistrée sur la sauvegarde complète (ou la dernière incrémentielle):
mongodump --host <secondary> -d local -c oplog.rs -o /mnt/mongo-test_backup/1 --query '{ "ts" : { $gt : Timestamp(1437725201, 50) } }'
Enregistrer la dernière position d'oplog (de la même manière que pour les sauvegardes complètes)
- Déverrouiller les écritures
Procédure de restauration de sauvegarde complète
- arrêter toutes les instances de
mongod
- copier l'instantané dans le répertoire de données de la boîte qui sera le principal, mais assurez-vous de tout exclure
local*
etmongod.lock
cette technique de restauration est appelée reconfigurer en cassant le miroir - Démarrer primaire
- reconfigurer le jeu de réplicas
- démarrer les secondaires sans aucune donnée, laissez-les effectuer la synchronisation initiale. Ou copiez les données du nouveau primaire avec une nouvelle
local
base de données
Restaurer la sauvegarde incrémentielle
Lorsque nous avons créé une sauvegarde incrémentielle, il l'a stockée comme ceci:
/mnt/mongo-test_backup/1/local/oplog.rs.bson
/mnt/mongo-test_backup/1/local/oplog.rs.metadata.json
Nous sommes instérés oplog.rs.bson
mais nous devrons le renommer, voici donc les étapes:
- changez le répertoire en sauvegarde:
cd /mnt/mongo-test_backup/1/local
- supprimer le fichier json
rm *.json
- renommer le fichier bson
mv oplog.rs.bson oplog.bson
le restaurer:
mongorestore -h <primary> --port <port> --oplogReplay /mnt/mongo-test_backup/1/local
Je l'ai tout scripté, je peux le valider sur GitHub plus tard.
La question est de savoir s'il y a un défaut dans la logique? Je suis un peu méfiant car la procédure est assez simple et je ne l'ai toujours pas trouvée documentée.