web-dev-qa-db-fra.com

Comment choisir entre MMAPV1, WiredTiger ou In-Memory StorageEngine pour MongoDB?

Dans la documentation MongoDb 3.2, j'ai vu qu'ils prennent en charge 3 Storage Engine, MMAPV1, WiredTiger, In-Memory, il est très déroutant de choisir lequel.

J'ai la sensation de la description que WiredTiger est mieux que MMAPV1, mais dans d'autres sources, ils disent que MMAPV1 est meilleur pour les lectures lourdes ... et WiredTiger pour les écritures lourdes ...

Y a-t-il des contraintes quand choisir l'un plutôt que l'autre? Quelqu'un peut-il suggérer quelques bonnes pratiques par exemple

quand j'ai ce type d'application c'est généralement mieux ça, sinon choisissez une autre ...

17
Alexandru Olaru

Cela vient d'une expérience personnelle, mais veuillez consulter cette entrée de blog qui explique très bien les différents types de moteurs: Mongo Blog v

Wired Tiger vs MMAPv1

Comparaison des moteurs de stockage MongoDB WiredTiger et MMAPv1 Performances et efficacité supérieures entre 7x et 10x Performances d'écriture supérieures MongoDB 3.0 offre un contrôle d'accès concurrentiel plus granulaire au niveau du document, offrant un débit entre 7x et 10x supérieur pour la plupart des applications gourmandes en écriture, tout en maintenant une latence faible prévisible .

Pour moi, le choix était très simple, j'avais besoin de verrous au niveau du document, ce qui fait WiredTiger le choix idéal, nous n'avons pas la version Enterprise de mongo, donc dans le moteur de mémoire est indisponible. MMAPv1 Btree est une technique très basique pour mapper la mémoire sur le disque dur et pas très efficace.

Le moteur de stockage MMAP utilise un processus appelé "allocation d'enregistrement" pour récupérer de l'espace disque pour le stockage de documents. Tous les enregistrements sont situés de manière contiguë sur le disque et lorsqu'un document devient plus volumineux que l'enregistrement alloué, il doit allouer un nouvel enregistrement. Les nouvelles allocations nécessitent le déplacement d'un document et la mise à jour de tous les index qui se réfèrent au document, ce qui prend plus de temps que les mises à jour sur place et conduit à la fragmentation du stockage. En outre, MMAPv1 dans ses itérations actuelles conduit généralement à une utilisation élevée de l'espace sur votre système de fichiers en raison de la surallocation de l'espace d'enregistrement et du manque de prise en charge de la compression. Comme mentionné précédemment, le schéma de verrouillage d'un moteur de stockage est l'un des facteurs les plus importants dans les performances globales de la base de données. MMAPv1 dispose d'un verrouillage au niveau de la collection, ce qui signifie qu'une seule opération d'insertion, de mise à jour ou de suppression peut utiliser une collection à la fois. Ce type de schéma de verrouillage crée un scénario très courant dans les charges de travail simultanées, où les opérations de mise à jour/suppression/insertion attendent toujours la fin des opérations devant elles. En outre, ces opérations se déroulent souvent plus rapidement qu'elles ne peuvent être effectuées en série par le moteur de stockage. Pour mettre les choses en perspective, imaginez un supermarché géant le dimanche après-midi qui n'a qu'une seule ligne de paiement ouverte: beaucoup de clients, mais un faible débit!

Tout le monde a des exigences différentes, mais dans la plupart des cas, WiredTiger serait le choix idéal car il fait des opérations atomiques au niveau du document et non au niveau de la collection a un grand avantage, vous ne pouvez tout simplement pas battre cela.

Plus de lectures et pas beaucoup d'écritures

Si la lecture est votre principale préoccupation, voici une façon d'y remédier.

Vous pouvez modifier le pilote Mongo Lire les modes de préférence de la manière suivante:

  1. Configurer le jeu de réplicas, disons 1 maître et 3 secondaires.
  2. Réglez le problème d'écriture sur majorité cela ralentirait l'écriture (compromis).
  3. Définissez la préférence de lecture sur secondaire.

Cette configuration fonctionnera très bien lorsque vous avez beaucoup de lectures, mais en tant que compromis, l'écriture serait plus lente. Cependant, le débit des données lues serait excellent.

J'espère que cela vous aidera si vous avez des questions supplémentaires, ajoutez-les en tant que commentaire et j'essaierai d'y répondre dans cette réponse.

Vous pouvez également vérifier MMAPv1 vs WiredTiger revoir et remarquer comment il a changé d'avis de MMAPv1 à WiredTiger. Le vendeur verrouille les performances que vous ne pouvez pas battre.

Pour les nouveaux projets, j'utilise WiredTiger maintenant. Étant donné qu'une migration d'un stockage WiredTiger compressé vers un stockage WiredTiger non compressé est plutôt facile, j'ai tendance à commencer par la compression pour améliorer l'utilisation du processeur ("en avoir plus pour son argent"). Si la compression a un impact notable sur les performances ou l'UX, je migre vers WiredTiger non compressé.

Profileur de base de données MongoDB

Le meilleur moyen de déterminer les besoins de votre base de données consiste à configurer le cluster de test et à exécuter l'application sur celui-ci avec MongoDB profiler Comme la plupart des profileurs de base de données, le profileur MongoDB peut être configuré pour écrire uniquement des informations de profil sur les requêtes qui ont pris plus de temps qu'un seuil donné. Donc, une fois que vous connaissez les requêtes lentes, vous pouvez déterminer s'il lit vs écrit ou cpu vs ram et allez à partir de là.

35
Tim

Vous devez utiliser un jeu de réplicas composé de moteurs de stockage en mémoire et WiredTiger . Et vous devez partitionner votre MongoDB de manière à ce que les données les plus fréquentes soient accessibles par le moteur de stockage en mémoire et le reste utilise le moteur de stockage WiredTiger.

Après avoir acquis WiredTiger en 2014, MongoDB a présenté ce moteur de stockage comme moteur de stockage par défaut de la version 3.2 . Par la suite, ils ont eux-mêmes commencé à encourager les utilisateurs à utiliser WiredTiger en raison des avantages suivants par rapport à MMAPV1:

  • WiredTiger utilise la concurrence au niveau du document tandis que MMAPV1 utilise le verrouillage au niveau de la collection. Cela signifie que plusieurs utilisateurs peuvent écrire simultanément dans une collection à l'aide de WiredTiger mais pas à l'aide de MMAPV1.
  • Étant donné que WiredTiger gère sa propre mémoire, il peut utiliser la compression alors que MMPAV1 ne dispose pas d'une telle fonctionnalité.
  • WiredTiger n'autorise aucune mise à jour sur place. Ainsi, il récupère finalement l'espace qui n'est plus utilisé.

Les seuls avantages du MMPAV1 par rapport à WiredTiger que j'ai trouvé jusqu'à présent sont:

  • WiredTiger n'est pas disponible sur la plate-forme Solaris alors que MMPAV1 l'est.
  • Même lors de la mise à jour d'un gros document avec un seul élément, WiredTiger réécrit tout le document, ce qui le ralentit.

Ainsi, vous pouvez toujours laisser MMPAV1 en dehors tout en choisissant votre moteur de stockage. Venons-en maintenant au moteur de stockage en mémoire. À partir de MongoDB Enterprise version 3.2.6, le moteur de stockage en mémoire fait partie de la disponibilité générale (GA) dans les versions 64 bits.

Il présente les avantages suivants par rapport aux moteurs de stockage:

  • Semblable à WiredTiger, le moteur de stockage en mémoire permet également la simultanéité au niveau du document.
  • Le moteur de stockage en mémoire est beaucoup plus rapide que les autres.

    En évitant les E/S disque, le moteur de stockage en mémoire permet une latence plus prévisible des opérations de base de données.

Mais ce moteur de stockage présente également quelques inconvénients:

  • Le moteur de stockage en mémoire ne conserve pas les données après l'arrêt du processus.

  • Si votre jeu de données est beaucoup trop volumineux, alors le moteur en mémoire n'est pas une bonne option.

    Le moteur de stockage en mémoire nécessite que toutes ses données (y compris oplog si mongod fait partie du jeu de réplicas, etc.) tiennent dans l'option de ligne de commande --inMemorySizeGB spécifiée ou dans le paramètre storage.inMemory.engineConfig.inMemorySizeGB.

Consultez par exemple le manuel MongoDB Deployment Architectures en utilisant le moteur de stockage en mémoire.

9
Arka Ghosh