2013-09-04 3 views
1

J'ai une collection mongodb que je veux partitionner. Cette collection contient les messages des utilisateurs et un document de la collection a les propriétés suivantesMongodb choisissez la clé de partition

{ 
    _id : ObjectId, 
    conversationId: ObjectId, 
    created: DateTime   
} 

Toutes les requêtes seront effectuées en utilisant la converstionId propriété et trieuse par créé.

  • Sharding par _id évidemment ne fonctionnera pas parce que je dois interroger par IDEchange (plus _id est de type ObjectId qui ne sera pas échelle très bien à de nombreux inserts)

  • Sharding par conversationId serait un choix logique en termes de requête isolation mais je crains que ce ne sera pas très bien d'échelle beaucoup d'inserts (même si j'utilise un a hed touche shard sur conversationId ou si je change le type de la propriété de ObjectId en un autre type qui n'est pas incrémentiel comme GUID) car une conversation peut être beaucoup plus active que d'autres (ie: avoir beaucoup plus de message ajouté à les)

d'après ce que je vois dans la documentation mongo la clé de tesson est soit un champ indexé ou un champ composé indexé qui existe dans tous les documents de la collection. Cela signifie-t-il que je peux créer une clé de partition sur un index composé ?

Bottom line est que:

  • création d'une clé de tesson hachée de la _id propriété offrirait une bonne répartition des données

  • créant une clé de tesson sur IDEchange offrirait une bonne requête isolation

Donc une combinaison de ces deux choses serait génial, si cela pouvait être fait.

Des idées?

Merci

Répondre

3

Pour votre cas, aucun des champs semblent bons choix pour sharding. Par exemple, si vous mettez un fragment sur conversationId, il en résultera des points chauds, c'est-à-dire que la plupart de vos insertions arriveront au dernier fragment, car l'argument conversationId augmenterait de façon monotone au fil du temps. Même problème avec les deux autres champs. En outre, conversationId n'offrira pas un degré d'isolation élevé car l'ID de conversation augmenterait de façon monotone au fil du temps. (Puisque les nouvelles conversations seront mises à jour beaucoup plus fréquemment que les très anciennes)

Dans votre cas, une "clé de partition hachée" (version 2.À partir de 4) sur conversationId serait le choix intelligent comme on pourrait imaginer qu'il peut y avoir des tonnes de conversations en parallèle.

Référez lien suivant pour plus de détails sur la création de la clé de hachage tesson: [http://docs.mongodb.org/manual/tutorial/shard-collection-with-a-hashed-shard-key/]

+0

Merci pour votre commentaire. J'ai effectivement fait cela, mais à mi-chemin dans la copie des données dans la collection sharded je reçois 'E11000 index d'erreur clé en double' sur la propriété _id, ce qui est bizarre, car je ne trouve pas de doublons de cet ID dans ma collection initiale – Mihai

+0

pouvez vous s'il vous plaît envoyer le message d'erreur exact –

+0

Erreur lors de la copie collection (s) Safemode a détecté une erreur 'erreur lors de l'insertion de 1 documents dans le setI shard à la version 7 | 83 || 52285504705a8ge238d3627b :: causé par :: E11000 Message. $ _ Id_ dup key: {: ObjectId ('.....')} ' – Mihai

Questions connexes