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