2012-01-16 7 views
2

Existe-t-il un moyen d'accéder à l'algorithme de résolution des fragments dans mongo? Je sais environ db.printShardingStatus(), mais cela m'oblige à écrire ma propre logique pour seau la clé. J'espère que quelque chose comme:mongo sharding: déterminez quel fragment/hôte une clé va résoudre

db.collection.runCommand({ getShardsvr : "my-key" }); 
> {"ok" : 1 , "shardsvr" : "hostname"} 

Je devine que c'est ce que mongos fait quand il achemine.

Pour le contexte, je diffuse une très grande quantité de données dans mongo. Il existe des collecteurs de données utilisant EmMachine pour diffuser des données vers des machines de pré-traitement qui nettoient des données puis les insèrent dans un modèle local. Ce que je voudrais faire est pour chaque morceau de données, le collecteur suivra la stratégie de fragmentation et la transmettra à la machine de pré-processeur correspondante. Les déclencheurs accompliraient la même chose mais le mongo ne les a pas AFAIK.

Répondre

2

Donc la réponse courte est oui c'est possible, cependant je ne sais pas que vous trouverez la commande que vous cherchez.

MongoDB sharding est assez simpliste. Les bases de données de configuration contiennent des plages de clés et ces plages de clés pointent vers l'hôte correct. Les bases de données de configuration ne sont en fait que des bases de données régulières et vous pouvez vous y connecter directement à partir d'un shell ou d'un pilote. (ils fonctionnent généralement sur un port par défaut différent pour éviter une connexion accidentelle).

Ainsi, vous pouvez facilement rechercher l'hôte en regardant simplement les plages disponibles. La logique n'est pas plus complexe qu'une boucle for jusqu'à ce que votre clé soit à portée.

Pour plus de détails sur le contrôle manuel du sharding look here. Cela donnera un aperçu de ce qui se passe.

Veuillez noter que tous les conseils ci-dessus sont "annulation de la garantie". Le concept derrière mongos (routeur) et les DB de config est d'abstraire cette complexité. En faisant ce que vous faites, vous devrez "regarder sous le capot".

0

Une bonne façon de trouver sur quel fragment est une donnée est d'utiliser: explain() shell helper.

Il affichera sur quel fragment est votre clé.

+0

C'était la façon la plus simple. Merci! – phillee

3

Trouvé la manière la plus directe. Les informations de sharding sont stockées dans le fichier config db (étonnamment, il n'y a pas beaucoup de documentation à ce sujet). Pour récupérer des informations de morceau, utilisez:

mongos> use config 
switched to db config 
mongos> db.chunks.find() 

Side note

Je compris cela en imprimant la fonction printShardStatus:

> print(db.printShardingStatus) 
function (verbose) { 
    printShardingStatus(this.getSiblingDB("config"), verbose); 
} 
Questions connexes