web-dev-qa-db-fra.com

Sauvegardes incrémentielles Mongodb

On m'a donné 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 recherché sur Google et je n'ai rien trouvé sur les documents MongoDB, j'ai cependant trouvé cela question sur Stack Overflow, ce qui a encouragé à développer ma propre solution car je n'ai pas trouvé Tayra très active.

J'ai lu à propos de oplog et j'ai réalisé qu'il était très facile de développer quelque chose pour rejouer le journal, mais il s'avère que je n'avais pas à le faire car mongorestore le faisait 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

  1. verrouillage écrit sur un membre secondaire db.fsyncLock()
  2. Prendre un instantané
  3. Enregistrer la dernière position de l'oplog

    db.oplog.rs.find().sort({$natural:-1}).limit(1).next().ts
    
  4. Déverrouiller les écritures db.fsyncUnlock()

Procédure de sauvegarde incrémentielle

  1. verrouillage écrit sur un membre secondaire
  2. Vider l'oplog à partir 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) } }'
    
  3. Enregistrer la dernière position d'oplog (de la même manière que pour les sauvegardes complètes)

  4. Déverrouiller les écritures

Procédure de restauration de sauvegarde complète

  1. arrêter toutes les instances de mongod
  2. copier l'instantané dans le répertoire de données de la boîte qui sera le principal, mais assurez-vous d'exclure tous les local* et mongod.lock cette technique de restauration est appelée reconfigurer en cassant le miroir
  3. Démarrer primaire
  4. reconfigurer le jeu de réplicas
  5. démarrer les secondaires sans aucune donnée, laissez-les effectuer la synchronisation initiale. Ou copiez les données de la nouvelle base primaire avec une nouvelle base de données local

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 sur oplog.rs.bson Mais nous devrons le renommer, voici donc les étapes:

  1. changez le répertoire en sauvegarde: cd /mnt/mongo-test_backup/1/local
  2. supprimez le fichier json rm *.json
  3. renommer le fichier bson mv oplog.rs.bson oplog.bson
  4. 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 la trouve toujours pas documentée.

26
Tiago

Pour répondre à ta question. Non! Il n'y a aucun échec sur votre logique et cela devrait fonctionner sans problème. Cependant, si des instantanés LVM peuvent être utilisés, il est préférable de faire des sauvegardes.

3
JJussi