MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Fragments MongoDB et charges d'agrégation déséquilibrées

Le cadre d'agrégation est un rouage essentiel de l'infrastructure MongoDB. Il vous aide à analyser, résumer et agréger les données stockées dans MongoDB. Reportez-vous à cet article de blog pour plus de détails sur le cadre d'agrégation dans MongoDB 2.6.

Dans la version 2.6, MongoDB a apporté une modification subtile mais significative à la manière dont les pipelines d'agrégation sous-jacents s'exécutent dans un environnement fragmenté. Lorsque vous travaillez avec des collections partitionnées, MongoDB divise le pipeline en deux étapes. La première étape ou la phase "$match" s'exécute sur chaque partition et sélectionne les documents pertinents. Si le planificateur de requêtes détermine qu'une partition n'est pas pertinente en fonction des clés de partition, cette phase n'est pas exécutée sur cette partition.

Les étapes suivantes s'exécutent uniquement sur le fragment « principal » de la collection. Ce fragment fusionne les données des autres fragments et exécute le reste du pipeline. Cela se traduit par une charge considérablement plus importante sur le fragment principal de la collection en cours d'agrégation. Voici un exemple de l'un de nos clients exécutant trois segments et utilisant principalement des requêtes d'agrégation :

Comme vous le voyez, la charge sur le premier fragment est systématiquement 3 à 4 fois supérieure à l'autre raison. Ceci est un exemple extrême puisque cela dans le cas où les deuxième et troisième fragments ont été ajoutés plus tard, donc le fragment principal pour toutes les collections est le premier fragment. Donc, essentiellement, les étapes suivantes de toutes nos tâches d'agrégation ne s'exécutent que sur Shard1. Si vous examinez les journaux sur le fragment principal, vous verrez un certain nombre de commandes de "fusion" récupérant les données des autres fragments.

Avant la version 2.6, les étapes suivantes du pipeline d'agrégation s'exécutaient sur vos serveurs MongoDB et non sur la partition principale.

Alors, comment gérez-vous cette répartition inégale de la charge ? Vous avez plusieurs options :

  1. Si vous exécutez des agrégations sur plusieurs collections, assurez-vous que les "fragments principaux" des collections sont répartis uniformément sur vos partitions.
  2. Si vous avez une charge d'agrégation élevée sur une seule collection, vous devrez peut-être utiliser des machines légèrement plus grandes pour votre partition principale.

Comme toujours, si vous avez des questions ou des commentaires, veuillez nous envoyer un e-mail à [email protected].