Sauvegardes incrémentielles Mongodb

26

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 oploget 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 mongorestoremê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

  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 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 de tout exclure 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 du nouveau primaire avec une nouvelle localbase 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.bsonmais nous devrons le renommer, voici donc les étapes:

  1. changez le répertoire en sauvegarde: cd /mnt/mongo-test_backup/1/local
  2. supprimer 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 l'ai toujours pas trouvée documentée.

Tiago
la source
2
Quelle version de Mongo utilisez-vous? Si vous utilisez wiredtiger, le premier élément référencé avec db.fsyncLock () est un problème. MongoDB Inc affirme "Avec WiredTiger, la commande fsync avec l'option de verrouillage ne peut garantir que les fichiers de données ne changent pas. Par conséquent, n'utilisez pas ces méthodes pour garantir la cohérence aux fins de la création de sauvegardes." link
SDillon
1
@SDillon utilisant 3.0.4 mais n'utilisant pas WiredTiger, du moins pas encore. Si nous décidons de l'utiliser, au lieu d'écrire des verrous, nous devrons arrêter mongod tous ensemble. C'est un bon point merci
Tiago
J'ai trouvé l'outil suivant pour la sauvegarde incrémentielle github.com/EqualExperts/Tayra j'espère que cela vous aidera
Ahmad Abuhasna
1
"Modifié dans la version 3.2: la commande fsync avec l'option de verrouillage peut garantir que les fichiers de données ne changent pas pour les instances MongoDB à l'aide du moteur de stockage MMAPv1 ou WiredTiger, offrant ainsi une cohérence aux fins de la création de sauvegardes."
sécurité
La façon normale (et la plus simple) d'effectuer des sauvegardes incrémentielles consiste à utiliser LVM et des instantanés. docs.mongodb.com/manual/tutorial/…
JJussi

Réponses:

3

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.

JJussi
la source
Comment effectuez-vous des sauvegardes incrémentielles d'un instantané LVM? Merci!
TanisDLJ
Les instantanés LVM sont incrémentiels par nature. Les instantanés sont des moments dans le temps et seuls les changements sont enregistrés.
JJussi
Juste un instantané pris oui, c'est incrémental. Mais si vous archivez l'instantané, il s'agit d'une sauvegarde complète. Vous ne pouvez pas archiver différentes sauvegardes incrémentielles comme la duplicité, par exemple. Et vous ne pouvez pas simplement commencer à créer des instantanés toutes les 30 minutes pour les sauvegardes incrémentielles, car cela affecterait les performances vraiment mauvaises.
TanisDLJ