2010-09-10 1 views
5

Je rencontre des problèmes avec ce qui semble être une simple configuration de partitionnement dans mongo.Le bourrage de mongos ne parvient pas à diviser la grande collection entre les fragments

J'ai deux tessons, une seule instance de mongos, et un serveur de configuration unique mis en place comme ceci:

Machine A - 10.0.44.16 - serveur de configuration, Mongos
machine B - 10.0.44.10 - tesson 1
machine C - 10.0.44.11 - tesson 2

J'ai une collection appelée « semences » qui a une clé de tesson « de SeedType » qui est un champ qui est présent sur tous les documents de la collection, et contient l'un des quatre valeurs (jetez un oeil à l'état de sharding ci-dessous). Deux des valeurs ont significativement plus d'entrées que les deux autres (deux d'entre eux ont 784 000 enregistrements chacun, et deux en ont environ 5 000).

Le comportement que je m'attends à voir est que les enregistrements de la collection 'Seeds' avec InventoryPOS finiront sur un fragment, et ceux avec InventoryOnHand finiront sur l'autre.

Cependant, il semble que tous les enregistrements des deux plus grandes clés de fragment se retrouvent sur la partition primaire.

Voici mon sharding texte d'état (autres collections supprimées pour plus de clarté):

--- Sharding Status --- 
    sharding version: { "_id" : 1, "version" : 3 } 
    shards: 
     { "_id" : "shard0000", "host" : "10.44.0.11:27019" } 
     { "_id" : "shard0001", "host" : "10.44.0.10:27017" } 
    databases: 
     { "_id" : "admin", "partitioned" : false, "primary" : "config" } 
     { "_id" : "TimMulti", "partitioned" : true, "primary" : "shard0001" } 
       TimMulti.Seeds chunks: 
         { "SeedType" : { $minKey : 1 } } -->> { "SeedType" : "PBI.AnalyticsServer.KPI" } on : shard0000 { "t" : 2000, "i" : 0 } 
         { "SeedType" : "PBI.AnalyticsServer.KPI" } -->> { "SeedType" : "PBI.Retail.InventoryOnHand" } on : shard0001 { "t" : 2000, "i" : 7 } 
         { "SeedType" : "PBI.Retail.InventoryOnHand" } -->> { "SeedType" : "PBI.Retail.InventoryPOS" } on : shard0001 { "t" : 2000, "i" : 8 } 
         { "SeedType" : "PBI.Retail.InventoryPOS" } -->> { "SeedType" : "PBI.Retail.SKU" } on : shard0001 { "t" : 2000, "i" : 9 } 
         { "SeedType" : "PBI.Retail.SKU" } -->> { "SeedType" : { $maxKey : 1 } } on : shard0001 { "t" : 2000, "i" : 10 }

Est-ce que je fais quelque chose de mal?

question semi-indépendant:

Quelle est la meilleure façon de transférer atomiquement un objet d'une collection à l'autre sans bloquer l'ensemble du service mongo?

Merci à l'avance, -Tim

Répondre

6

Sharding est vraiment pas destiné à être utilisé de cette façon. Vous devriez choisir une clé de partition avec une certaine variation (ou faire une clé de partition composée) afin que MongoDB puisse faire des morceaux de taille raisonnable. Un des points de sharding est que votre application n'a pas besoin de savoir où sont vos données.

Si vous voulez partitionner manuellement, vous devez le faire: démarrez les serveurs MongoDB non liés et acheminez les choses vous-même du côté client. Enfin, si vous êtes vraiment dédié à cette configuration, vous pouvez migrer le morceau vous-même (il existe une commande moveChunk).

L'équilibreur déplace les blocs en fonction de leur taille en mémoire (exécutez serverStatus et consultez le champ "mappé"). Cela peut prendre un certain temps, MongoDB ne veut pas que vos données volent partout dans la production, donc c'est assez conservateur.

Réponse semi-indépendante: vous ne pouvez pas le faire de façon atomique avec sharding (eval n'est pas atomique sur plusieurs serveurs). Vous devrez faire une findOne, insérer, supprimer.

Questions connexes