Comment sauvegarder MongoDB à l’aide d’instantanés de gouttelettes

introduction

Les sauvegardes régulières de la base de données sont une étape cruciale de la protection contre les événements non intentionnels de perte de données. En général, il existe deux grandes catégories de sauvegardes: les sauvegardes au niveau du système de fichiers («physiques») et les sauvegardes logiques. Les sauvegardes au niveau du système de fichiers impliquent la capture instantanée des fichiers de données sous-jacents à un moment donné, permettant ainsi à la base de données de se restaurer de manière propre en utilisant l'état capturé dans les fichiers instantanés. Les sauvegardes logiques impliquent l’utilisation d’un outil (par exemple, mongodump oupg_dump) pour exporter les données de la base de données dans des fichiers de sauvegarde, qui sont ensuite restaurés à l'aide d'un outil de restauration correspondant (par ex. mongorestore oupsql <).

Dans ce guide, nous allons montrer comment effectuer une sauvegarde au niveau du système de fichiers d'une installation MongoDB en cours d'exécution à l'aide deDroplet Snapshots. De plus, nous expliquerons comment effectuer une restauration à partir de l'image instantanée.

Note: Comme détaillé dans les sauvegardes DigitalOceanguide, il y a un certain impact sur les performances lors de l'utilisation des instantanés Droplet, en particulier sur les bases de données très chargées. Vous devez d'abord tester cette procédure en utilisant une base de données hors production avec une charge simulée pour vérifier que cette méthode fonctionnera dans votre déploiement de production.

Conditions préalables

Avant de commencer avec ce guide, assurez-vous d’avoir suivi les étapes préalables suivantes:

Ce guide supposera que vous avez installé MongoDB 3.2+ et que vous utilisez le moteur de stockage WiredTiger par défaut avec la journalisation activée. De plus, pour utiliser ce guide, il est important que le répertoiredbpath (le répertoire contenant les fichiers de données, par défaut/var/lib/mongodb) soit mappé sur un seul volume. Si vous n’avez pas associé de volumes de stockage de blocs supplémentaires à votre Droplet, vous pouvez suivre ce guide.

Une fois que vous êtes connecté à votre Droplet et que MongoDB est opérationnel, vous êtes prêt à commencer.

[[step-1 -—- verify-your-mongodb-setup]] == Étape 1 - Vérifiez votre configuration MongoDB

Nous allons d’abord vérifier que la journalisation a été activée.

La journalisation est une fonctionnalité de MongoDB qui assure la durabilité en cas d’échec de la base de données en écrivant des opérations dans les fichiers journaux. Pour en savoir plus sur la journalisation MongoDB, consultez le fichierMongoDB Manual.

Si vous avez suivi le guide ci-dessus, la journalisation sera activée par défaut. Pour confirmer que c'est le cas, nous pouvons inspecter le fichier de configuration MongoDB.

Ouvrez/etc/mongod.conf en utilisant votre éditeur de texte préféré, tel que nano par exemple:

nano /etc/mongod.conf

Vous devriez voir le bloc suivant:

/etc/mongod.conf

# Where and how to store data.
storage:
  dbPath: /var/lib/mongodb
  journal:
    enabled: true
#  engine:
#  mmapv1:
#  wiredTiger:

Cela indique que la journalisation a été activée. Si vous utilisez MongoDB 3.2+, le moteur de stockage par défaut est WiredTiger (MMAPv1 était le moteur de stockage original de MongoDB).

Nous allons maintenant insérer des données factices pour tester la procédure de sauvegarde et de restauration.

[[step-2 -—- insert-test-data]] == Étape 2 - Insérer les données de test

Si vous avez commencé avec un serveur propre et que vous n’avez pas encore de données, nous pouvons insérer des exemples de données dans une collection facticerestaurantsà des fins de démonstration. Si vous avez déjà des collections et des documents stockés dans votre base de données, n'hésitez pas à passer cette étape.

Commencez par vous connecter à la base de données en cours d’exécution à l’aide du shell MongoDB:

mongo

Vous devriez voir l’invite de shell Mongo suivante:

MongoDB shell version: 3.2.19
connecting to: test
Server has startup warnings:
2018-02-16T02:40:13.071+0000 I CONTROL  [initandlisten]
2018-02-16T02:40:13.071+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2018-02-16T02:40:13.071+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-02-16T02:40:13.071+0000 I CONTROL  [initandlisten]
2018-02-16T02:40:13.071+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2018-02-16T02:40:13.071+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-02-16T02:40:13.071+0000 I CONTROL  [initandlisten]
>

La base de données par défaut utilisée par le shell est la base de donnéestest.

Listons les collections présentes dans la base de donnéestest:

show collections

Comme nous n’avons encore rien inséré dans la base de données, il n’existe aucune collection et nous sommes ramenés à l’invite sans sortie.

Insérons un document dans une collection facticerestaurants, que nous créerons en même temps:

db.restaurants.insert({'name': 'Sammy's Pizzeria'})

Vous devriez voir la sortie suivante:

WriteResult({ "nInserted" : 1 })

Cela indique que l'opération d'insertion a réussi. La collectionrestaurants n’existant pas auparavant, elle a été créée en même temps.

Reprenons la liste des collections:

show collections

Nous voyons maintenant notre nouvelle collectionrestaurants:

restaurants

Maintenant que nous avons stocké des exemples de données dans la base de données, nous sommes prêts à les sauvegarder.

[[step-3 -—- snapshot-the-mongodb-droplet]] == Étape 3 - Instantané du droplet MongoDB

Pour effectuer la sauvegarde, nous allons profiter de DigitalOceanDroplet Snapshots. Les instantanés de gouttelettes nous permettent de créer une image du gouttelette au moment où l'instantané a été initié. Cette image peut ensuite être restaurée dans un nouveau Droplet, où d'autres opérations de récupération peuvent avoir lieu.

Étant donné que nous utilisons MongoDB 3.2+ (avec WiredTiger et la journalisation activés), nous n’avons pas besoin de suspendre les écritures sur le système de fichiers pendant l’instantané. Une fois l'image restaurée et la base de données démarrée, MongoDB se restaurera à partir d'un point de contrôle, puis réexécutera les opérations à partir des fichiers journaux jusqu'à ce que l'instantané se produise. Si vous souhaitez explorer davantage la journalisation, consultez lesMongoDB Manual),

Pour commencer le processus de capture instantanée,log in to your DigitalOcean account, accédez à votre Droplet MongoDB et cliquez sur le lienSnapshots dans la barre latérale.

Vous devriez voir l'invite suivante:

Take Snapshot

Note: Bien qu'il soit recommandé d'éteindre votre Droplet avant de prendre un instantané, dans les déploiements de production, cela n'est pas toujours possible. La fonction de journalisation de MongoDB permet des instantanés cohérents et valides, même lorsque la base de données et Droplet sont en cours d'exécution.

Donnez à votre instantané un nom descriptif et cliquez sur le boutonTake Live Snapshot pour commencer le processus de capture instantanée.

Vous devriez voir l'indicateur de progression de capture instantanée suivant:

Snapshot Progress

Une fois le cliché terminé, vous pourrez créer un nouveau droplet à partir de l'image ou restaurer le droplet en cours d'exécution dans l'état capturé dans votre image de cliché.

Nous sommes maintenant prêts à effectuer une restauration et une validation de la procédure de sauvegarde.

[[step-4 -—- restore-the-mongodb-droplet]] == Étape 4 - Restaurer le droplet MongoDB

Nous allons maintenant créer un nouveau Droplet qui sera restauré à partir de l'image que nous venons de créer. Les données disponibles dans notre base de données MongoDB seront les mêmes que celles disponibles au moment où l'instantané a été pris.

Revenez àSnapshots à l'aide de la barre latérale et localisez votre instantané Droplet terminé.

Completed Snapshot

Cliquez surMore et sélectionnezCreate Droplet.

Vous serez redirigé vers le menu deCreate Droplet, où vous pourrez créer un nouveau Droplet à partir de votre instantané.

Choisissez l'image correspondant à la photo que vous avez prise précédemment. Dans ce cas, nous utiliserons l'imagemongo-backup-test.

Choose Image

Terminez la configuration de votre Droplet de restauration et cliquez surCreate. Une fois que votre restauration Droplet est opérationnelle, connectez-vous dessus.

Si vous avez configuré MongoDB pour qu'il démarre au démarrage de Droplet, celui-ci devrait maintenant être en cours d'exécution. Vous pouvez vérifier cela en utilisantsystemctl:

sudo systemctl status mongod

Vous devriez voir la sortie suivante:

Output● mongod.service - High-performance, schema-free document-oriented database
   Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2018-02-14 21:14:40 UTC; 4min 53s ago
     Docs: https://docs.mongodb.org/manual
 Main PID: 1302 (mongod)
    Tasks: 19
   Memory: 87.2M
      CPU: 1.802s
   CGroup: /system.slice/mongod.service
           └─1302 /usr/bin/mongod --quiet --config /etc/mongod.conf

Indiquer que tout va bien et que MongoDB a démarré correctement.

Si MongoDB n'est pas en cours d'exécution, nous devons d'abord supprimer le fichier de verrouillage, puis démarrer le service:

rm /var/lib/mongodb/mongod.lock
sudo systemctl start mongod

Vérifiez que MongoDB a démarré correctement en utilisantsystemctl status.

Une fois que MongoDB est opérationnel, il commence à se nettoyer et à restaurer son état au moment précis où l'instantané s'est produit. Cela peut prendre plusieurs minutes et le shellmongo peut ne pas être disponible tant que cela n'est pas terminé.

Une fois le serveur disponible, nous pouvons nous connecter en utilisant la commandemongo:

mongo

Vous allez maintenant recevoir l’invite du shell mongo:

OutputMongoDB shell version: 3.2.19
connecting to: test
Server has startup warnings:
2018-02-14T21:14:41.923+0000 I CONTROL  [initandlisten]
2018-02-14T21:14:41.923+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2018-02-14T21:14:41.923+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-02-14T21:14:41.923+0000 I CONTROL  [initandlisten]
2018-02-14T21:14:41.923+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2018-02-14T21:14:41.923+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-02-14T21:14:41.923+0000 I CONTROL  [initandlisten]
>

Si vous avez atteint ce stade, félicitations! Vous avez correctement sauvegardé et restauré votre base de données MongoDB.

Par mesure de précaution supplémentaire, nous pouvons vérifier l’intégrité de nos collections.

[[step-5 -—- check-data-integrity]] == Étape 5 - Vérifier l'intégrité des données

Avant d’utiliser ces données de sauvegarde en production, il est utile de rechercher dans les collections restaurées des objets BSON non valides.

Note: La commandevalidate peut être lente sur de très grandes collections. De plus, toutes les lectures et écritures seront bloquées sur la collection jusqu'au retour de la commandevalidate.

Dans cet exemple, nous avons une collection appeléerestaurants sur laquelle nous voulons exécuter la commandevalidate.

Depuis le shell mongo, exécutez la commande validate:

db.restaurants.validate({full:true})

Vous devriez voir une sortie similaire à celle-ci:

{
    "ns" : "test.restaurants",
    "nrecords" : 1,
    "nIndexes" : 1,
    "keysPerIndex" : {
        "test.restaurants.$_id_" : 1
    },
    "indexDetails" : {
        "test.restaurants.$_id_" : {
            "valid" : true
        }
    },
    "valid" : true,
    "errors" : [ ],
    "ok" : 1
}

Si vous voyezvalid: true, tous les aspects de votre collection sont valides et vous pouvez utiliser en toute sécurité les données de cette collection en production.

Conclusion

Dans ce didacticiel, nous avons appris à effectuer une sauvegarde physique au niveau du système de fichiers d’un serveur de base de données MongoDB en cours d’exécution.

Pour en savoir plus sur les différentes méthodes de sauvegarde d'une base de données MongoDB, consultez leMongoDB manual.

Cette technique de sauvegarde particulière a été rendue possible grâce à la fonctionnalité très pratique d’instantanés des gouttelettes de DigitalOcean. Pour en savoir plus sur les instantanés de gouttelettes, consultez lesSnapshot docs.

En outre, vous pouvez planifier la réalisation automatique de ces instantanés à l'aide de la fonction Sauvegardes. Pour en savoir plus sur les sauvegardes Droplet, consultez lesBackups Introduction.

Related