Aller au contenu

Moteurs de stockage#

Présentation des moteurs de stockage#

Deux moteurs de stockage principaux : MMAPv1 et WiredTiger#

  • MMAPv1 : moteur de stockage par défaut avant MongoDB 3.0
  • WiredTiger : moteur de stockage par défaut depuis MongoDB 3.2

Importance du choix du moteur de stockage pour les performances et les fonctionnalités#

  • Impacts sur les temps de réponse des requêtes
  • Impacts sur les fonctionnalités supportées (transactions, compression des données)
  • Considérations pour les déploiements existants et les migrations

Vérifier le moteur de stockage utilisé#

Pour vérifier le moteur de stockage actuel :

use admin;
db.runCommand({ serverStatus: 1 });
// ou bien
db.serverStatus().storageEngine;

Exemple de sortie pour WiredTiger :

"storageEngine" : {
    "name" : "wiredTiger",
    "supportsCommittedReads" : true,
    "persistent" : true
}

Exemple de sortie pour MMAPv1 :

"storageEngine" : {
    "name" : "mmapv1",
    "supportsCommittedReads" : false,
    "persistent" : true
}

MMAPv1 : caractéristiques et cas d'utilisation#

MMAPv1 : premier moteur de stockage développé pour MongoDB#

  • Moteur de stockage par défaut avant MongoDB 3.0
  • Remplacé par WiredTiger à partir de MongoDB 3.2

Architecture basée sur les fichiers mmap#

  • Utilise la mémoire mappée sur des fichiers pour lire et écrire les données
  • Le système d'exploitation gère le cache et les entrées/sorties disque
  • Les fichiers de données ont l'extension .mmap

Verrouillage au niveau de la collection#

  • MMAPv1 gère les verrous de lecture et d'écriture au niveau de la collection
  • Accepte moins de concurrence que le verrouillage au niveau du document (WiredTiger)
  • Exemple : Si une opération d'écriture est en cours sur une collection, les autres opérations d'écriture doivent attendre la fin de la première opération

Compression des données : non disponible#

  • MMAPv1 ne prend pas en charge la compression des données stockées sur le disque
  • Les données sont stockées telles quelles, sans compression

Transactions : non supportées#

  • MMAPv1 ne prend pas en charge les transactions multi-documents
  • Les opérations atomiques sont supportées seulement au niveau du document

Cas d'utilisation : applications nécessitant une compatibilité avec les anciennes versions de MongoDB#

  • Exemple : Migration d'une base de données MongoDB 2.6 vers une version plus récente sans changer de moteur de stockage
  • Exemple : Applications ayant des contraintes de compatibilité avec des bibliothèques ou des pilotes spécifiques à MMAPv1

Exemple de commande pour démarrer MongoDB avec le moteur de stockage MMAPv1 :

mongod --dbpath /data/db --storageEngine mmapv1

WiredTiger : caractéristiques et cas d'utilisation#

Moteur de stockage par défaut depuis MongoDB 3.2#

  • Pour vérifier le moteur de stockage utilisé : db.serverStatus().storageEngine
  • Pour configurer WiredTiger au démarrage de MongoDB : mongod --storageEngine wiredTiger

Utilise des fichiers de données avec des extensions wt#

  • Les fichiers sont stockés dans le répertoire de données (par défaut : /data/db)
  • Exemple de fichier : collection-0--123456789.wt

Verrouillage au niveau du document#

  • Permet des opérations de lecture et d'écriture concurrentes sur différents documents
  • Améliore les performances en réduisant la contention entre les opérations

Compression des données : disponible (Snappy, zlib, zstd)#

  • Compression par défaut : Snappy (équilibré entre vitesse et taux de compression)
  • Configurer la compression pour une collection :
db.createCollection("ma_collection", {
    storageEngine: {
        wiredTiger: {
            configString: "block_compressor=zlib"
        }
    }
});

Transactions : supportées depuis MongoDB 4.0#

session = db.getMongo().startSession();
session.startTransaction();
try {
    session.getDatabase("test").getCollection("ma_collection").insertOne({x: 1});
    session.getDatabase("test").getCollection("ma_collection").updateOne({x: 1}, {$set: {y: 2}});
    session.commitTransaction();
} catch (error) {
    session.abortTransaction();
    print("Transaction échouée :", error);
} finally {
    session.endSession();
}

Cas d'utilisation#

  • Applications nécessitant de meilleures performances, une compression des données et des transactions
  • Applications à fort trafic avec des opérations de lecture et d'écriture concurrentes
  • Applications nécessitant de réduire l'espace disque utilisé grâce à la compression
  • Applications nécessitant d'assurer la cohérence des données à travers plusieurs opérations avec des transactions

Choisir le bon moteur de stockage#

Évaluer les besoins de l'application#

  • Identifier les besoins en termes de performances : lecture, écriture, mises à jour
  • Déterminer si l'application nécessite des transactions multi-documents
  • Évaluer le besoin de compression des données pour économiser de l'espace disque

Prendre en compte la compatibilité avec les versions précédentes de MongoDB#

  • MMAPv1 pour les applications utilisant des versions antérieures à MongoDB 3.0
  • WiredTiger pour les applications utilisant MongoDB 3.2 ou ultérieure

Comparer les performances des deux moteurs avec des charges de travail réalistes#

  • Créer des scénarios de test représentatifs des opérations de l'application
  • Exemple de commande pour comparer les performances en lecture : db.collection.find(query).explain("executionStats")
  • Comparer les temps d'exécution, les ressources utilisées et l'utilisation de la mémoire

Changer de moteur de stockage : utiliser mongodump et mongorestore avec l'option --storageEngine#

  • Sauvegarder les données avec mongodump : mongodump --out /path/to/backup
  • Arrêter le serveur MongoDB : sudo systemctl stop mongod
  • Modifier le fichier de configuration /etc/mongod.conf pour changer le moteur de stockage (par exemple, passer de MMAPv1 à WiredTiger)
storage:
  engine: wiredTiger
  • Redémarrer le serveur MongoDB : sudo systemctl start mongod
  • Restaurer les données avec mongorestore et l'option --storageEngine :
mongorestore --storageEngine wiredTiger /path/to/backup