2012-06-12 4 views
1

J'ai 4 serveurs dans un environnement de test que j'utilise pour tester la réplication et la distribution MongoDB: RepSetA contient RepSetA1 et RepSetA2. RepSetB contient RepSetB1 et RepSetB2. Tous les serveurs agissent comme des routeurs, RepSetA1 agit comme un seul serveur de configuration. J'ai des données "Player" (10 000 enregistrements, l'objet est constitué d'un champ "Id" et un champ "Name"), et je veux qu'il soit partagé (ou distribué) entre les jeux de réplicas, et cloné parmi les serveurs dans le même jeu de réplicas. Donc, juste pour un exemple simple: Player1-5000: Existe à la fois dans RepSetA1 et RepSetA2, mais pas dans RepSetB1 et RepSetB2. Player5000-10000: Existe à la fois dans RepSetB1 et RepSetB2, mais pas dans RepSetA1 et RepSetA2.MongoDB réplique les données dans toutes les partitions

Ce que je reçois à la place, c'est d'avoir tous les joueurs dans les 4 serveurs.

Si j'imprimer l'état sharding, je reçois le texte suivant:

mongos> db.printShardingStatus(); 

--- Sharding Status --- 
    sharding version: { "_id" : 1, "version" : 3 } 
    shards: 

     { "_id" : "RepSetA", "host" : "RepSetA/MongoRepSetA1:27018,MongoRepSetA2:27018" } 
     { "_id" : "RepSetB", "host" : "RepSetB/MongoRepSetB1:27018,MongoRepSetB2:27018" } 
    databases: 
     { "_id" : "admin", "partitioned" : false, "primary" : "config" } 
     { "_id" : "GamesDB", "partitioned" : true, "primary" : "RepSetA" } 
       GamesDB.Player chunks: 
           RepSetA 2 
         { "_id" : { $minKey : 1 } } -->> { "_id" : 0 } on : RepSetA { "t" : 1000, "i" : 1 } 
         { "_id" : 0 } -->> { "_id" : { $maxKey : 1 } } on : RepSetA { "t" : 1000, "i" : 2 } 
     { "_id" : "test", "partitioned" : false, "primary" : "RepSetB" } 
     { "_id" : "EOO", "partitioned" : false, "primary" : "RepSetB" } 

J'ai utilisé les commandes suivantes pour construire les tessons:

db.adminCommand({ addShard : "RepSetA/MongoRepSetA1:27018,MongoRepSetA2:27018" }) 
db.adminCommand({ addShard : "RepSetB/MongoRepSetB1:27018,MongoRepSetB2:27018" }) 
db.runCommand({ enablesharding : "GamesDB" }); 
db.runCommand({ shardcollection : "GamesDB.Player", key : { _id :1 } , unique : true}); 

Qu'est-ce que je fais mal?

+0

Comment avez-vous demandé à voir quels joueurs existent sur quel fragment? –

+0

en utilisant MongoVue GUI, et même essayé de se connecter au serveur spécifique et effectuer un "db.Player.find(). Limite (100);" – nirpi

Répondre

0

Si vous vous connectez via un processus mongos à vos nœuds, il semblerait que tous contiennent les données. De votre sortie, il ne semble pas que toutes les données soient disponibles sur tous les nœuds. RepSetA contient 2 blocs et RepSetB ne devrait en contenir aucun. Vous pouvez le vérifier en vous connectant directement à vos noeuds plutôt qu'à travers les mongos. Par ailleurs, si vous utilisez MongoDBs ObjectId en tant que votre _id (clé shard), considérez shard sur une autre clé car cela entraînera que toutes les insertions soient effectuées dans un nœud lorsque la clé change monoton.

+0

Je vois toujours les mêmes enregistrements dans RepSetA1 et RepSetB1 (qui se trouvent sur des ensembles de réplicas différents), si je les connecte directement en utilisant MongoVue ou Mongo.exe shell. – nirpi

+0

Comme gregor et moi l'avons souligné, les données sont correctement partagées et ne sont pas copiées sur tous les nœuds. Avez-vous vraiment été connecté à RepSetB et pas accidentellement à RepSetA? Quelle version utilisez-vous? La seule chose que je peux imaginer, ce qui peut causer ce phénomène est que mongo.exe et MongoGUI se connectent automatiquement à un mongos plutôt qu'à mongod. En tout cas je doute fortement, que c'est le cas. RepSetA et RepSetB pointent vers des IP/Serveurs différents? Peut-être que ceux qui pointent vers la même chose, il semble que vous avez RepSetA et RepSetB tout en ayant seulement RepSetA. – philnate

+0

J'ai essayé d'interroger les serveurs de RepSetA (MongoRepSetA1 & MongoRepSetA2) - qui contient 10 000 enregistrements insérés, et les mêmes 10 000 enregistrements apparaissent également dans les serveurs de RepSetB (MongoRepSetB1 & MongoRepSetB2). J'ai tout vérifié. J'utilise la dernière version de Mongo (mongodb-win32-x86_64-2.0.5). BTW, j'ai juste essayé de supprimer l'un des enregistrements de MongoRepSetA1 en utilisant le MongoVue, et il l'a également supprimé de tous les autres nœuds. – nirpi

0

C'est très bien. Cela ne montre pas que toutes les données sont sur tous les serveurs. La sortie montre que tous les morceaux (données) de GamesDB.Player sont sur tesson RepSetA

GamesDB.Player chunks: 
          RepSetA 2 
        { "_id" : { $minKey : 1 } } -->> { "_id" : 0 } on : RepSetA { "t" : 1000, "i" : 1 } 
        { "_id" : 0 } -->> { "_id" : { $maxKey : 1 } } on : RepSetA { "t" : 1000, "i" : 2 } 

Cela signifie que l'équilibreur n'a pas commencé à équilibrer vos morceaux. L'équilibreur ne fonctionne que lorsqu'il y a une différence de 8 morceaux. http://www.mongodb.org/display/DOCS/Sharding+Administration#ShardingAdministration-Balancing

Vous pouvez forcer l'équilibrage par morceaux fractionnement manuellement (si vous voulez) http://www.mongodb.org/display/DOCS/Splitting+Shard+Chunks

Ou vous pouvez réduire la taille du morceau si vous voulez voir l'équilibre plus tôt. http://www.mongodb.org/display/DOCS/Sharding+Administration#ShardingAdministration-ChunkSizeConsiderations

+0

Cela semble bien, mais je vois les mêmes enregistrements dans RepSetA1 et RepSetB1 (qui se trouvent sur des ensembles de réplicas différents), si je les connecte directement en utilisant MongoVue ou Mongo.exe shell. – nirpi

Questions connexes