2016-10-24 1 views
0

Nous sommes actuellement confrontés à une situation où nous ne pouvons pas éviter de faire une collecte complète . Nous avons déjà optimisé la requête et la structure de données, mais nous aimerions aller plus loin et tirer pleinement parti de la fragmentation et de la réplication.Améliorer les performances de la requête mongodb full-scan: réplication ou sharding?

Configuration

- mongodb version 3.2 
- monogo-java-driver 3.2 
- storageEngine: wiredTiger 
- compression level: snappy 
- database size : 6GB 

La structure des documents:

individus collection

{ 
    "_id": 1, 
    "name": "randomName1", 
    "info": {...} 
}, 
{ 
    "_id": 2, 
    "name": "randomName2", 
    "info": {...} 
}, 
[...] 
{ 
    "_id": 15000, 
    "name": "randomName15000", 
    "info": {...} 
} 

valeurs collection

{ 
    "_id": ObjectId("5804d7a41da35c2e06467911"), 
    "pos": NumberLong("2090845886852"), 
    "val": 
     [0, 0, 1, 0, 1, ... 0, 1] 
}, 
{ 
    "_id": ObjectId("5804d7a41da35c2e06467912"), 
    "pos": NumberLong("2090845886857"), 
    "val": 
     [1, 1, 1, 0, 1, ... 0, 0] 
} 

Le tableau "val" contient un élément pour chaque individu (donc la longueur du tableau est de jusqu'à 15000). L'identifiant de l'individu est son index correspondant dans le tableau "val".

Recherche

La requête est de trouver des documents de valeurs collection où la somme de val [individual._id] est au-dessus d'un seuil spécifique pour une liste de idividuals. Nous ne pouvons pas simplement pré-calculer la somme du tableau puisque la liste des individus voulaient changer durant l'exécution (nous pouvons vouloir obtenir le résultat pour seulement les 2000 premiers individus par exemple). Cette requête utilise le cadre d'agrégation.

Ce que nous faisons actuellement:

Nous avons partagé la requête dans 100-500 sous-requêtes et de les exécuter 5 par 5 en parallèle.

La première sous-requête serait la même requête pour les documents où pos> 0 et pos < 50000, le second pour les documents où pos> et pos 50000 < 100000 ect ...

Nous aimerions pouvoir pour exécuter plus de sous-requêtes dans le même temps, mais nous sommes confrontés à une perte de performance lors de l'exécution de plus de 5 sur une seule instance de mongod.

La question est: devrions-nous aller pour la réplication ou pour sharding (ou les deux) dans afin d'exécuter le nombre maximum de sous-requêtes dans le même temps? Comment pouvons-nous configurer mongodb pour répartir au mieux les sous-requêtes entre les répliques/fragments?

edit: supposons que la requête soit déjà complètement optimisée!

Répondre

1

La réplication est quelque chose utilisé pour la redondance et la haute disponibilité des données, donc si vous essayez d'améliorer les performances d'une requête, je pense que nous pouvons exclure cette option immédiatement.

Sharding peut être une option, mais je pense que la prochaine étape pour vous serait de poster votre explication pour la requête et voir si quelqu'un peut faire des suggestions pour améliorer les performances. Il est possible qu'il y ait un réglage que vous auriez pu faire que vous ayez raté, ou peut-être que vous verriez des gains de performances en améliorant la RAM ou le processeur du serveur MongoDB actuel. En bref, je suggère de poster votre explication avant d'aller à tous les efforts de sharding.

+0

Merci pour la réponse! Peut-être que je vais poster l'expliquer dans une autre question, mais pour le moment supposons que la requête est déjà suffisamment optimisée, que devons-nous faire? – felix