Un nombre trop élevé de bases de données et de collections dans votre instance MongoDB peut dégrader les performances de la base de données et provoquer d'autres problèmes.
Les termes base de données et table, utilisés dans les bases de données traditionnelles, correspondent respectivement aux concepts de base de données et de collection dans MongoDB.
Dans MongoDB, le moteur de stockage WiredTiger crée un fichier sur disque pour chaque collection. Chaque index génère également un nouveau fichier sur disque. Pour chaque ressource ouverte, telle qu'un objet du système de fichiers, le moteur WiredTiger maintient une structure de données dhandle. Cette structure stocke des informations telles que les détails des points de contrôle (checkpoints), les compteurs de références de session, les pointeurs vers les structures arborescentes B+ en mémoire et les données statistiques.
Par conséquent, plus une instance MongoDB contient de bases de données et de collections, plus le moteur WiredTiger doit maintenir ouverts d'objets du système de fichiers. Cela augmente le nombre de structures de données dhandle en mémoire. Lorsqu'un grand nombre de ces structures dhandle sont conservées en mémoire, des conflits de verrouillage peuvent survenir, ce qui dégrade les performances de l'instance.
Problèmes potentiels
-
**Ralentissement des requêtes et augmentation de la latence des demandes en raison de
handleLockou deschemaLock.**Un nombre excessif de bases de données et de collections peut entraîner des requêtes lentes, générant des journaux similaires à l'exemple suivant :
2024-03-07T15:59:16.856+0800 I COMMAND [conn4175155] command db.collections command: count { count: "xxxxxx", query: { A: 1, B: 1 }, $readPreference: { mode: "secondaryPreferred" }, $db: "db" } planSummary: COLLSCAN keysExamined:0 keysExaminedBySizeInBytes:0 docsExamined:1 docsExaminedBySizeInBytes:208 numYields:1 queryHash:916BD9E3 planCacheKey:916BD9E3 reslen:185 locks:{ ReplicationStateTransition: { acquireCount: { w: 2 } }, Global: { acquireCount: { r: 2 } }, Database: { acquireCount: { r: 2 } }, Collection: { acquireCount: { r: 2 } }, Mutex: { acquireCount: { r: 1 } } } storage:{ data: { bytesRead: 304, timeReadingMicros: 4 }, timeWaitingMicros: { handleLock: 40, schemaLock: 134101710 } } protocol:op_query 134268msLe journal de requête lente ci-dessus montre qu'une opération de comptage simple sur une collection ne contenant qu'un seul document a pris beaucoup de temps à s'exécuter. La partie
timeWaitingMicros: { handleLock: 40, schemaLock: 134101710 } } protocol:op_query 134268msdu journal indique que la demande de lecture a passé trop de temps à attendre l'acquisition des verroushandleLocketschemaLockdu moteur de stockage sous-jacent, en raison du grand nombre de collections. Erreurs de manque de mémoire (OOM) lors de la phase de synchronisation initiale lors de l'ajout d'un nouveau nœud.
Augmentation du temps de démarrage de l'instance.
Allongement du temps de synchronisation des données.
Durée plus longue pour la sauvegarde et la restauration des données.
Taux d'échec accru des sauvegardes physiques.
Temps de récupération après incident plus long.
Un grand nombre de bases de données et de collections ne provoque pas nécessairement de problèmes. L'impact réel dépend de facteurs tels que le modèle de données de l'application et la charge de travail. Prenons par exemple deux scénarios où des bases de données de même spécification comportent chacune 10 000 collections et 100 000 fichiers au total. Les défis auxquels elles font face sont complètement différents :
Système de comptabilité : les modèles d'accès sont très concentrés. La plupart des collections servent au stockage de données froides et seul un petit sous-ensemble récent de collections est fréquemment consulté.
Système de gestion multi-locataire : les locataires sont isolés via des collections distinctes et presque toutes les collections sont activement consultées ou utilisées.
Méthodes d'optimisation
Supprimer les collections inutiles
Identifiez les collections de la base de données pouvant être supprimées, telles que celles qui ont expiré ou qui ne sont plus utilisées. Utilisez la commande dropCollection pour les supprimer. Pour plus d'informations, reportez-vous à dropCollection().
Avant d'effectuer toute opération de suppression, assurez-vous de disposer d'une sauvegarde complète disponible.
Utilisez les commandes suivantes pour consulter les informations relatives aux bases de données et aux collections :
-
Exécutez la commande suivante pour afficher le nombre de collections dans une base de données.
db.getSiblingDB(<dbName>).getCollectionNames().length -
Exécutez la commande suivante pour afficher les informations détaillées d'une base de données, y compris le nombre de collections, d'index et de documents, ainsi que la taille totale des données.
// View statistics for a specific database. db.getSiblingDB(<dbName>).stats() -
Exécutez la commande suivante pour afficher les informations détaillées d'une collection spécifique.
// View statistics for a specific collection. db.getSiblingDB(<dbName>).<collectionName>.stats()
Supprimer les index inutiles
La réduction du nombre d'index diminue également le nombre de fichiers sur disque et les structures dhandle correspondantes maintenues par le moteur de stockage WiredTiger, ce qui permet d'atténuer ce problème.
Respectez les principes de base suivants pour l'optimisation des index :
-
Évitez les index inutilisés
Si une requête n'accède jamais à un champ spécifique, tout index sur ce champ ne sera pas utilisé. Ces index sont considérés comme inutilisés et peuvent être supprimés.
-
Suivez les règles de préfixe d'index
Par exemple, si vous disposez à la fois des index
{a:1}et{a:1,b:1}, le premier index constitue un préfixe redondant du second et peut être supprimé. -
Prenez en compte l'ordre des champs d'index pour les requêtes d'égalité
Pour les correspondances d'égalité, l'ordre des champs dans un index composite n'a pas d'importance. Par exemple, pour les requêtes sur les champs a et b, les index
{a:1,b:1}et{b:1,a:1}sont fonctionnellement équivalents. Vous pouvez supprimer celui qui est le moins fréquemment utilisé. -
Appliquez la règle ESR pour les requêtes de plage
Pour construire un index composite optimal pour vos requêtes, organisez les champs dans l'ordre
Equality, Sort, Range(Égalité, Tri, Plage). Pour plus d'informations, reportez-vous à The ESR (Equality, Sort, Range) Rule. -
Examinez les index avec un faible taux d'utilisation
Un index avec un faible taux d'utilisation chevauche souvent un index plus efficace. Analysez tous les modèles de requête pertinents pour déterminer si vous pouvez le supprimer en toute sécurité.
Vous pouvez utiliser l'étape d'agrégation $indexStats de MongoDB pour afficher les statistiques de tous les index d'une collection. Assurez-vous de disposer des autorisations nécessaires avant d'exécuter la commande suivante.
// View index statistics for a specific collection.
db.getSiblingDB(<dbName>).<collectionName>.aggregate({"$indexStats":{}})
La commande renvoie une sortie similaire à l'exemple suivant.
{
"name" : "item_1_quantity_1",
"key" : { "item" : 1, "quantity" : 1 },
"host" : "examplehost.local:27018",
"accesses" : {
"ops" : NumberLong(1),
"since" : ISODate("2020-02-10T21:11:23.059Z")
}
}
Le tableau suivant décrit les paramètres des informations renvoyées.
|
Paramètre |
Description |
|
name |
Nom de l'index. |
|
key |
Détails de la clé d'index. |
|
accesses.ops |
Nombre d'opérations ayant utilisé cet index, ce qui équivaut au nombre d'utilisations de l'index. |
|
accesses.since |
Heure à partir de laquelle la collecte des statistiques a commencé. Ce champ et le champ |
Si vous constatez qu'un index présente un très faible taux d'utilisation, par exemple si accesses.ops est égal à 1, il s'agit probablement d'un index redondant ou inutilisé que vous pouvez envisager de supprimer. Si votre instance MongoDB est en version 4.4 ou ultérieure, vous pouvez utiliser la commande hideIndex pour masquer l'index avant de le supprimer. Cela vous permet de confirmer l'absence d'impact négatif sur votre application pendant une certaine période, réduisant ainsi le risque lié à la suppression de l'index.
Exemple
Supposons que vous disposiez d'une collection de joueurs de jeu avec la règle suivante : « Chaque fois qu'un joueur collecte 20 coins, ils sont convertis en 1 star ». Un document de la collection se présente comme suit :
// players collection
{
"_id": "ObjectId(123)",
"first_name": "John",
"last_name": "Doe",
"coins": 11,
"stars": 2
}
La collection comporte actuellement les cinq index suivants, couvrant tous les champs :
_id(index par défaut){ last_name: 1 }{ last_name: 1, first_name: 1 }{ coins: -1 }{ stars: -1 }
La logique d'optimisation des index est la suivante :
Les requêtes de l'application n'accèdent pas au champ
coins, donc{ coins: -1 }est un index inutilisé.Selon la règle de préfixe d'index mentionnée précédemment, l'index
{ last_name: 1, first_name: 1 }couvre l'index{ last_name: 1 }. Par conséquent, vous pouvez supprimer l'index{ last_name: 1 }.En utilisant la commande
$indexStats, vous observez que le taux d'utilisation de{ stars: -1 }est faible. Cependant, à la fin d'une manche de jeu, l'application doit trier les joueurs par nombre destarsdans l'ordre décroissant pour un classement. Par conséquent, bien qu'il soit peu utilisé, l'index{ stars: -1 }doit être conservé pour éviter une analyse complète de la collection.
Après optimisation, trois index restent dans la collection :
_id{ last_name: 1, first_name: 1 }{ stars: -1 }
Les avantages de cette optimisation incluent :
Réduction de l'espace de stockage.
Amélioration des performances en écriture.
Si vous avez d'autres questions sur l'optimisation des index, veuillez soumettre un ticket pour contacter le support technique Alibaba Cloud.
Consolider les données de plusieurs collections
Consolidez les données de plusieurs collections dans une seule collection afin de réduire le nombre total de collections.
Par exemple, une base de données nommée temperatures stocke les données de température provenant de capteurs. Un capteur fonctionne de 10 h 00 à 22 h 00, en lisant et en stockant les données de température toutes les demi-heures. Il stocke les données de température de chaque jour dans une collection distincte nommée d'après la date.
Les extraits suivants montrent des données partielles de deux collections, temperatures.march-09-2020 et temperatures.march-10-2020.
-
Collection
temperatures.march-09-2020{ "_id": 1, "timestamp": "2020-03-09T010:00:00Z", "temperature": 29 } { "_id": 2, "timestamp": "2020-03-09T010:30:00Z", "temperature": 30 } ... { "_id": 25, "timestamp": "2020-03-09T022:00:00Z", "temperature": 26 } -
Collection
temperatures.march-10-2020{ "_id": 1, "timestamp": "2020-03-10T010:00:00Z", "temperature": 30 } { "_id": 2, "timestamp": "2020-03-10T010:30:00Z", "temperature": 32 } ... { "_id": 25, "timestamp": "2020-03-10T022:00:00Z", "temperature": 28 }
Au fil du temps, le nombre de collections dans la base de données augmente. Étant donné que MongoDB n'impose pas de limite stricte au nombre de collections et que ce modèle ne dispose pas d'une politique claire de cycle de vie des données, le nombre de collections et leurs index correspondants augmentent indéfiniment.
Outre le problème du nombre toujours croissant de collections, ce modèle de données rend difficile l'exécution de requêtes s'étendant sur plusieurs jours. Pour interroger des données sur plusieurs jours afin d'analyser les tendances de température à long terme, vous devrez utiliser des requêtes $lookup, qui sont moins performantes que les requêtes au sein d'une seule collection.
Un meilleur modèle de données consiste à stocker toutes les lectures de température dans une seule collection, les données de chaque jour étant stockées dans un seul document. Cette approche est un exemple du modèle Bucket (Bucket Pattern). L'exemple suivant montre le modèle optimisé.
// temperatures.readings
{
"_id": ISODate("2020-03-09"),
"readings": [
{
"timestamp": "2020-03-09T010:00:00Z",
"temperature": 29
},
{
"timestamp": "2020-03-09T010:30:00Z",
"temperature": 30
},
...
{
"timestamp": "2020-03-09T022:00:00Z",
"temperature": 26
}
]
}
{
"_id": ISODate("2020-03-10"),
"readings": [
{
"timestamp": "2020-03-10T010:00:00Z",
"temperature": 30
},
{
"timestamp": "2020-03-10T010:30:00Z",
"temperature": 32
},
...
{
"timestamp": "2020-03-10T022:00:00Z",
"temperature": 28
}
]
}
Le modèle optimisé consomme beaucoup moins de ressources que le modèle original. Vous n'avez plus besoin de créer des index basés sur l'heure de la journée et l'index _id par défaut de la collection facilite les requêtes par date. Cela résout également le problème du nombre illimité de collections.
Pour les données de séries temporelles, vous pouvez également envisager d'utiliser des collections de séries temporelles pour résoudre ce problème.
La fonctionnalité de collection de séries temporelles est prise en charge uniquement dans les versions MongoDB 5.0 et ultérieures.
Diviser l'instance
Si vous ne pouvez pas réduire le nombre total de bases de données et de collections au sein d'une seule instance MongoDB, envisagez une division logique de l'instance de base de données, accompagnée des modifications correspondantes dans votre application.
Vous pouvez aborder cette situation selon deux scénarios :
|
Scénario |
Solution de division |
Points à considérer |
|
Les collections sont réparties sur plusieurs bases de données |
Si la logique métier entre les bases de données n'est pas étroitement liée (par exemple, plusieurs applications ou services partagent une seule instance de base de données), utilisez DTS (Data Transmission Service) pour migrer certaines bases de données vers une nouvelle instance de jeu de réplicas ou de cluster fragmenté ApsaraDB for MongoDB. Avant la fin de la migration, vous devez également diviser la logique applicative et les méthodes d'accès en conséquence. Si la logique métier entre les bases de données est étroitement liée, reportez-vous à la solution de division pour le scénario à base de données unique. |
|
|
Les collections sont concentrées dans une seule base de données |
Votre équipe métier doit d'abord déterminer si toutes les collections peuvent être divisées selon une dimension spécifique, telle que la région, la ville, la priorité ou tout autre attribut métier significatif. Ensuite, utilisez DTS pour migrer certaines collections vers une ou plusieurs nouvelles instances MongoDB, divisant ainsi une instance en N instances. Avant la fin de la migration, vous devez diviser la logique applicative et les méthodes d'accès en conséquence. |
|
Exemple
Une plateforme de gestion multi-locataire utilise une base de données MongoDB. Dans le modèle de données initial, chaque locataire disposait d'une collection distincte. Avec la croissance de l'activité, le nombre de locataires a dépassé cent mille et la taille totale de la base de données a atteint le niveau du téraoctet. L'instance a fréquemment connu des accès lents à la base de données et une latence élevée.
L'équipe métier a décidé de diviser les locataires par région géographique, en séparant les locataires nationaux en Chine du Nord, du Nord-Est, de l'Est, du Centre, du Sud, du Sud-Ouest et du Nord-Ouest. Ils ont créé de nouvelles instances MongoDB dans les zones de disponibilité correspondantes pour chaque région et ont effectué plusieurs cycles de migration à l'aide de DTS. Pour répondre aux besoins de l'entreprise en matière d'analyse agrégée, ils ont également mis en place une synchronisation des instances MongoDB vers un entrepôt de données.
La division a considérablement réduit le nombre de bases de données et de collections dans chaque instance MongoDB, et l'équipe a ajusté les spécifications de l'instance en conséquence. En adoptant un principe d'accès à la région la plus proche, l'application a réduit la latence des demandes au niveau de la milliseconde, améliorant ainsi considérablement l'expérience produit. La maintenance ultérieure des instances est également devenue beaucoup plus simple.
Migrer vers un cluster fragmenté avec des tags de shard
Si toutes vos collections se trouvent dans une seule base de données et que vous souhaitez les gérer comme une seule instance logique, envisagez de migrer vos données vers une architecture de cluster fragmenté et d'utiliser des tags de shard pour la gestion. La méthode de gestion par tags de shard est légèrement plus complexe et nécessite des étapes opérationnelles supplémentaires (utilisation de sh.addShardTag et de sh.addTagRange). Cependant, une seule instance MongoDB gère toujours toutes les collections, ce qui nécessite des modifications minimales dans votre application. Vous devez simplement remplacer la chaîne de connexion par celle de la nouvelle instance de cluster fragmenté.
Par exemple, si votre instance comporte 100 000 collections actives, vous pouvez acheter une nouvelle instance de cluster fragmenté à 10 shards. Suivez le processus ci-dessous pour configurer l'instance et migrer les données, ce qui donnera 10 000 collections actives par shard. La procédure est la suivante :
Achetez une nouvelle instance de cluster fragmenté. Cet exemple utilise une instance à 2 shards. Pour obtenir des instructions sur la création d'un cluster fragmenté, reportez-vous à Créer une instance de cluster fragmenté.
Connectez-vous au nœud mongos de l'instance de cluster fragmenté. Pour plus d'informations, reportez-vous à Se connecter à une instance de cluster fragmenté ApsaraDB for MongoDB à l'aide du shell mongo.
-
Exécutez les commandes suivantes pour ajouter un tag de shard à chaque shard.
sh.addShardTag("d-xxxxxxxxx1", "shard_tag1") sh.addShardTag("d-xxxxxxxxx2", "shard_tag2")RemarqueAvant d'exécuter ces commandes, assurez-vous que le compte que vous utilisez dispose des autorisations requises.
DMS (Data Management) ne prend pas actuellement en charge la commande
sh.addShardTag. Nous vous recommandons de vous connecter à l'instance avec le shell mongo ou mongosh pour exécuter ces commandes.
-
Préconfigurez les règles de distribution de plage basées sur les tags pour toutes les collections fragmentées.
use <dbName> sh.enableSharding("<dbName>") sh.addTagRange("<dbName>.test", {"_id":MinKey}, {"_id":MaxKey}, "shard_tag1") sh.addTagRange("<dbName>.test1", {"_id":MinKey}, {"_id":MaxKey}, "shard_tag2")Cet exemple utilise
_idcomme clé de fragmentation. Choisissez une clé de fragmentation adaptée à votre charge de travail et assurez-vous que toutes les opérations de requête incluent le champ de clé de fragmentation. La clé de fragmentation doit être cohérente avec le champ utilisé à l'étape suivante. Vous devez également utiliser les limites[MinKey,MaxKey]pour garantir que toutes les données d'une seule collection résident sur un seul shard. -
Exécutez l'opération shardCollection pour toutes les collections à migrer.
sh.shardCollection("<dbName>.test", {"_id":1}) sh.shardCollection("<dbName>.test1", {"_id":1}) -
Exécutez la commande
sh.status()pour confirmer que les règles sont effectives.zhongli.test shard key: { "_id" : 1 } unique: false balancing: true chunks: d-xxx 1 { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : d-xxx Timestamp(1, 0) tag: shard_tag1 { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } zhongli.test1 shard key: { "_id" : 1 } unique: false balancing: true chunks: d-xxx 1 { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : d-xxx Timestamp(1, 0) tag: shard_tag2 { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } -
Migrer des données d'une instance de jeu de réplicas vers une instance de cluster fragmenté.
RemarqueÉtant donné que vous avez déjà pré-fragmenté les collections sur l'instance de destination, toutes les informations sur les bases de données et les collections existent déjà. Par conséquent, vous devez définir le Processing Mode of Conflicting Tables sur Ignore Errors and Proceed dans votre tâche DTS.
Après avoir vérifié la cohérence des données, configurez vos applications pour accéder à la nouvelle instance de cluster fragmenté.
Si vous devez ajouter davantage de shards à l'instance, vous devez répéter l'étape 3 pour ajouter des tags à tous les nouveaux shards.
Si de nouvelles collections sont continuellement ajoutées à la base de données, vous devez répéter les étapes 4 et 5 pour celles-ci. Si vous n'effectuez pas ces étapes, les nouvelles collections seront créées uniquement sur le shard principal, ce qui augmentera le nombre de collections sur ce shard et pourrait entraîner à nouveau une instabilité des performances.
Migrer vers un cluster fragmenté avec des zones
Cette méthode est similaire à l'utilisation des tags de shard, mais elle utilise la fonctionnalité Zones de MongoDB. Elle nécessite des étapes opérationnelles supplémentaires, notamment sh.addShardToZone() et sh.updateZoneKeyRange().
La procédure est la suivante :
Achetez une nouvelle instance de cluster fragmenté. Cet exemple utilise une instance à 2 shards. Pour obtenir des instructions sur la création d'un cluster fragmenté, reportez-vous à Créer une instance de cluster fragmenté.
Connectez-vous au nœud mongos de l'instance de cluster fragmenté. Pour plus d'informations, reportez-vous à Se connecter à une instance de cluster fragmenté ApsaraDB for MongoDB à l'aide du shell mongo.
-
Exécutez les commandes suivantes pour assigner chaque shard à une zone.
sh.addShardToZone("d-xxxxxxxxx1", "ZoneA") sh.addShardToZone("d-xxxxxxxxx2", "ZoneB")RemarqueAvant d'exécuter ces commandes, assurez-vous que le compte que vous utilisez dispose des autorisations requises.
DMS ne prend pas actuellement en charge la commande
sh.addShardToZone. Nous vous recommandons de vous connecter à l'instance avec le shell mongo ou mongosh pour exécuter ces commandes.
-
Préconfigurez les règles de distribution de plage basées sur les zones pour toutes les collections.
use <dbName> sh.enableSharding("<dbName>") sh.updateZoneKeyRange("<dbName>.test", { "_id": MinKey }, { "_id": MaxKey }, "ZoneA") sh.updateZoneKeyRange("<dbName>.test1", { "_id": MinKey }, { "_id": MaxKey }, "ZoneB")Cet exemple utilise
_idcomme clé de fragmentation. Choisissez une clé de fragmentation adaptée à votre charge de travail et assurez-vous que toutes les opérations de requête incluent le champ de clé de fragmentation. La clé de fragmentation doit être cohérente avec le champ utilisé à l'étape suivante. Vous devez également utiliser les limites[MinKey,MaxKey]pour garantir que toutes les données d'une seule collection résident sur un seul shard. -
Exécutez l'opération shardCollection pour toutes les collections à migrer.
sh.shardCollection("<dbName>.test", { "_id": 1 }) sh.shardCollection("<dbName>.test1", { "_id": 1 }) -
Exécutez la commande
sh.status()pour afficher la distribution du sharding et confirmer que la configuration de zone est effective. La sortie d'exemple est la suivante :{ "_id" : "shardDistributionDB", "primary" : "d-xxx24", "partitioned" : false, "version" : { "uuid" : UUID("1dc635xxx"), "lastMod" : 1 } } shardDistributionDB.test shard key: { "_id" : "hashed" } unique: false balancing: true chunks: d-2ze9797089ef3704 1 { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : d-xxx04 Timestamp(1, 0) tag: ZoneA { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } shardDistributionDB.test1 shard key: { "_id" : "hashed" } unique: false balancing: true chunks: d-2zed2e752c35af24 1 { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : d-xxx24 Timestamp(1, 0) tag: ZoneB { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } -
Migrer des données d'une instance de jeu de réplicas vers une instance de cluster fragmenté.
RemarqueÉtant donné que vous avez déjà pré-fragmenté les collections sur l'instance de destination, toutes les informations sur les bases de données et les collections existent déjà. Par conséquent, vous devez définir le Processing Mode of Conflicting Tables sur Ignore Errors and Proceed dans votre tâche DTS.
Après avoir vérifié la cohérence des données, configurez vos applications pour accéder à la nouvelle instance de cluster fragmenté.
Si vous devez ajouter davantage de shards à l'instance, vous devez répéter l'étape 3 pour assigner des zones à tous les nouveaux shards.
Si de nouvelles collections sont continuellement ajoutées à la base de données, vous devez répéter les étapes 4 et 5 pour celles-ci. Si vous n'effectuez pas ces étapes, les nouvelles collections seront créées uniquement sur le shard principal, ce qui augmentera le nombre de collections sur ce shard et pourrait entraîner à nouveau une instabilité des performances.
Avis de risque
Nous déconseillons fortement d'utiliser la commande dropDatabase pour supprimer directement une base de données contenant un grand nombre de collections.
Après l'exécution de la commande dropDatabase, le moteur WiredTiger effectue une opération de nettoyage asynchrone, en supprimant séquentiellement les métadonnées et les fichiers physiques de toutes les collections marquées pour suppression. Cette opération peut interférer avec la réplication sur les nœuds secondaires, entraînant une augmentation de la latence de réplication. Cela peut à son tour déclencher le mécanisme de contrôle de flux ou affecter toutes les opérations d'écriture utilisant {writeConcern:majority}.
Envisagez les approches suivantes pour atténuer ce risque :
Supprimez les collections par lots avec un intervalle raisonnable entre chaque lot. Une fois toutes les collections supprimées, exécutez la commande finale
dropDatabase.Utilisez DTS ou d'autres outils de migration pour déplacer les bases de données et les collections que vous souhaitez conserver vers une nouvelle instance. Une fois la migration et le basculement terminés, supprimez l'ancienne instance.
Dans tous les cas, vous devez configurer des alertes appropriées concernant la latence de réplication pour votre instance. Si votre instance rencontre ce problème, soumettre un ticket pour obtenir une assistance technique.
Résumé
En règle générale, essayez de maintenir le nombre total de collections au sein d'un seul jeu de réplicas inférieur à 10 000. Ce nombre doit être plus faible si les collections individuelles comportent un grand nombre d'index (par exemple, plus de 15).
Si les exigences de votre application nécessitent un grand nombre de collections, comme dans un système multi-locataire utilisant l'isolement basé sur les collections, envisagez de diviser votre logique applicative et d'utiliser des instances de cluster fragmenté.
Si votre base de données est déjà affectée par un trop grand nombre de collections et que vous ne savez pas comment modifier le modèle de données de votre application, vous pouvez soumettre un ticket pour contacter le support technique.