2011-01-17 4 views
1

Je continuais d'insérer des données dans mongodb autosharded. (pas de mise à jour, seulement d'insertion)nosql mongodb réplicaset autosharding, perte de données lors de l'exécution d'une expérience

Configuration expérimentale 2 fragments, chaque fragment a 2 nœuds.

dans shard1 -> node1 (primaire), node2 dans shard2 -> node3 (primaire), node4

dans un tesson j'ai apporté noeud secondaire (node2) vers le bas -> encore les données se sont correctement insérées maintenant J'ai ramené le primaire (node1) vers le bas -> le fragment complet est en baisse maintenant

Étonnamment, l'ensemble de la configuration de mongo ne prenait aucune écriture.

Il y a une autre tournure dans l'histoire. Maintenant, j'ai apporté le node2, car c'est le seul nœud disponible, il est devenu primaire et a commencé à accepter des données.

Après environ 10 minutes, j'ai amené le noeud 1 également.

Mais quand j'ai vérifié les données que je l'ai inséré dans node1 (quand node2 est vers le bas) a été perdu :(.

s1    s2 
    (n1,n2)  (n3,n4) 
    ---------  --------- 
1. (up,up)  (up, up) -> data was getting inserted 
2. (up,down)  (up, up) -> data was getting inserted properly (but got lost :() 
3. (down, down) (up, up) -> no data inserts were happening 
4. (down, up) (up, up) -> started taking data again 
5. (up, up)  (up, up) -> n1 picked data from n2, but couldn't give the data to n2 

dans la dernière étape, quand j'ai apporté n1 en place, il a obtenu les nouveaux records de n2, mais le n1 obtenu lors de l'étape 2 ci-dessus ont été complètement perdu :(.

Est-ce comportement attendu de mongo?

Quelqu'un s'il vous plaît aidez-moi, je peux courir plus d'expériences si nécessaire :).

Merci d'avance, Vivekananda Tadala

Répondre

3

Si vous abattez un membre dans un jeu de réplicas à deux membres, l'autre cessera d'accepter les écritures. Voir ce explanation pourquoi vous avez besoin de trois membres et utilisez toujours le mode sans échec quand vous jouez.

La réplication dans MongoDB est unidirectionnelle: un esclave copie les données d'un esclave plus récent ou du maître. Vous ne pouvez pas avoir (encore) deux nœuds copiant des données les uns des autres. Vous pouvez être intéressé par ensuring write replication en attendant.

L'insertion dans des fragments sur un fragment tombé ne fonctionnera pas, mais vous pouvez insérer des fragments dans des fragments situés sur l'autre fragment. Vous pouvez utiliser db.printShardingStatus() pour voir quels morceaux sont où.

+0

merci pour la réponse, il a effacé beaucoup de mes doutes, mais y at-il un moyen d'obtenir les données sur le maître mort et le pousser au nouveau maître? pouvons-nous faire quelque chose avec l'oplog? –

+0

Oui ... au moins en théorie. Chaque fois qu'une restauration se produit, les données doivent être écrites dans un fichier .bson dans le répertoire de données. Vous pouvez utiliser mongorestore pour l'appliquer au maître actuel. Cependant, nous (développeurs de MongoDB) parlions aujourd'hui de la façon dont nous n'étions pas sûrs s'il écrivait réellement dans le fichier de restauration, donc il pourrait y avoir un bug là. Mais s'il y en a, ce sera corrigé par 1.8.0. – kristina

+0

Fausse alarme, ce n'est pas cassé. Les données seront stockées dans un répertoire/rollback, voir http://www.snailinaturtleneck.com/blog/2011/01/19/how-to-use-replica-set-rollbacks/. – kristina

Questions connexes