Meilleures pratiques pour gérer et réduire l'utilisation de l'espace disque de MongoDB

Optimisez l'utilisation de votre disque MongoDB avec ce guide complet des meilleures pratiques. Découvrez des stratégies efficaces pour compacter les collections et les index, identifier et supprimer les index inutiles, et tirer parti des fonctionnalités de compression de WiredTiger. Apprenez à implémenter l'archivage des données, à gérer la taille de l'oplog et à surveiller proactivement l'espace disque pour prévenir les pannes système et améliorer les performances. Cet article fournit des informations exploitables et des exemples pratiques pour maintenir vos déploiements MongoDB légers et efficaces.

37 vues

Meilleures pratiques pour gérer et réduire l'utilisation de l'espace disque de MongoDB

MongoDB, une base de données NoSQL orientée document populaire, est réputée pour sa flexibilité et son évolutivité. Cependant, sans une gestion proactive, l'utilisation de l'espace disque peut croître rapidement, entraînant une dégradation des performances, des pannes de système et une augmentation des coûts d'infrastructure. Comprendre comment MongoDB consomme l'espace disque et mettre en œuvre des stratégies de gestion efficaces sont cruciaux pour maintenir un environnement de base de données sain et performant.

Cet article explore des stratégies complètes pour gérer et réduire l'espace disque de MongoDB. Nous examinerons des techniques pratiques telles que la compaction des collections, l'optimisation et la gestion des index volumineux, la configuration des paramètres du moteur de stockage pour l'efficacité, et la mise en œuvre de politiques de cycle de vie des données. En suivant ces meilleures pratiques, vous pouvez prévenir une croissance inutile du disque, assurer des opérations stables et prolonger la durée de vie de vos déploiements MongoDB.

Comprendre la consommation d'espace disque de MongoDB

MongoDB utilise l'espace disque pour plusieurs composants :

  • Fichiers de données : Stockent les documents BSON réels au sein des collections.
  • Fichiers d'index : Stockent les index B-tree créés pour prendre en charge une exécution efficace des requêtes.
  • Fichiers de journal (WiredTiger) : Enregistrent les opérations d'écriture avant qu'elles ne soient appliquées aux fichiers de données, assurant la durabilité des données. Ceux-ci sont pré-alloués.
  • Oplog (Journal Opérationnel) : Une collection plafonnée spéciale dans les ensembles de répliques qui enregistre toutes les opérations d'écriture. Essentiel pour la réplication.
  • Données de diagnostic : Journaux, fichiers de processus mongod et autres informations liées au système.

Avec le temps, en raison des mises à jour, des suppressions et de la croissance des documents (rembourrage), les collections et les index peuvent devenir fragmentés ou contenir de l'espace alloué inutilisé, entraînant une utilisation inefficace du disque. Cet « espace blanc » n'est pas immédiatement récupéré par le système d'exploitation, même si la base de données n'en a plus besoin pour les données actives.

Stratégies pour réduire l'espace disque de MongoDB

1. Compacter les collections et les index

Les opérations de compaction aident à récupérer l'espace disque inutilisé en réécrivant les fichiers de données et d'index de manière plus efficace. Ceci peut être particulièrement utile après des suppressions ou des mises à jour de données importantes.

Compacter les collections

Avec le moteur de stockage WiredTiger (par défaut depuis MongoDB 3.2), compact récupère principalement l'espace libre des documents supprimés et défragmente les collections. Il ne reconstruit pas le fichier de données de la collection à partir de zéro comme le faisait l'opération compact de MMAPv1.

db.runCommand({ compact: "myCollection" })

Considérations pour compact :

  • Les opérations compact peuvent être gourmandes en ressources (CPU, E/S) et prendre beaucoup de temps, surtout pour les grandes collections. Il est souvent préférable de les exécuter pendant les fenêtres de maintenance ou sur les membres secondaires d'un ensemble de répliques.
  • Elle nécessite un espace disque libre égal à la taille de la collection en cours de compaction, car elle reconstruit les données dans un nouvel emplacement avant l'échange.
  • Pour les clusters sharding, exécutez compact sur chaque shard indépendamment.

Reconstruire les index

Les index peuvent également devenir fragmentés. La reconstruction d'un index peut récupérer de l'espace et potentiellement améliorer les performances des requêtes.

db.myCollection.reIndex()

Considérations pour reIndex() :

  • reIndex() est une opération en ligne depuis MongoDB 4.2 (nécessite suffisamment d'espace disque pour le nouvel index). Pour les versions antérieures à 4.2, il prend un verrou d'écriture sur la base de données (et non seulement sur la collection), bloquant toutes les autres opérations. Il est recommandé d'exécuter reIndex() d'abord sur les membres secondaires, puis de faire passer le primaire pour l'exécuter sur le nouveau primaire.
  • Similaire à compact, reIndex() nécessite un espace disque supplémentaire pendant l'opération.

repairDatabase (Opération hors ligne)

En cas de fragmentation sévère ou de corruption des données, repairDatabase peut reconstruire tous les fichiers de données. Il s'agit d'une opération hors ligne et nécessite l'arrêt de l'instance mongod.

mongod --repair

Avertissement : repairDatabase doit être utilisé en dernier recours pour la récupération d'espace car c'est une opération destructive si elle n'est pas gérée avec soin et peut prendre beaucoup de temps. Ayez toujours une sauvegarde.

2. Optimiser les index

Les index sont cruciaux pour les performances mais peuvent consommer une quantité importante d'espace disque. Les index inutilisés ou redondants ne sont que de la surcharge pure.

Identifier et supprimer les index inutiles

Examinez régulièrement vos index pour vous assurer qu'ils sont toujours nécessaires.

  1. Lister tous les index pour une collection :
    javascript db.myCollection.getIndexes()
  2. Surveiller l'utilisation des index : Activez le profilage de la base de données (db.setProfilingLevel(1)) ou utilisez db.collection.stats() pour voir l'utilisation des index. Les outils de surveillance cloud fournissent souvent des informations sur l'utilisation des index.
  3. Identifier les index dupliqués ou redondants : Par exemple, un index sur { a: 1, b: 1 } rend un index sur { a: 1 } redondant pour les requêtes qui peuvent utiliser l'index composé. Un index sur { a: 1, b: 1 } est également couvert par un index sur { a: 1, b: 1, c: 1 } pour les requêtes qui n'impliquent que a et b.

Une fois identifié, supprimez l'index inutilisé :

db.myCollection.dropIndex("indexName")

Conseil : Testez toujours l'impact de la suppression d'un index dans un environnement de staging avant de l'appliquer à la production.

Utiliser les index partiels

Les index partiels n'indexent que les documents d'une collection qui satisfont une expression de filtre spécifiée. Cela réduit le nombre de documents indexés, économise de l'espace disque et améliore les performances d'écriture.

db.orders.createIndex(
   { customerId: 1, orderDate: -1 },
   { partialFilterExpression: { status: "active" } }
)

Cet index n'inclurait que les documents où status est "active", réduisant considérablement sa taille si la plupart des commandes sont "