8 votes

Problème de réplication des données Cassandra

J'ai un cluster cassandra à 2 nœuds avec un facteur de réplication de 2 et AutoBootStrap=true. Tout se passe bien au démarrage et les deux nœuds se voient l'un l'autre. Appelons ces nœuds A et B.

  1. Ajouter un ensemble de clés et de colonnes (appelons cet ensemble K1) à Cassandra via le nœud A.
  2. Connecter au nœud A et lire l'ensemble K1. Même chose pour le nœud B. Succès - Bon
  3. Tuer le processus Cassandra sur le nœud B.
  4. Ajouter la série K2 jusqu'à A.
  5. Connecter au nœud A et lire l'ensemble K2. Bon
  6. Redémarrer le processus Cassandra sur le nœud B.
  7. Essayez de lire toutes les touches à partir de B... mettez K1 présent, mettez K2 MANQUANT. (Même après 30 minutes)
  8. Ajouter K3 à A/B.
  9. Lire toutes les touches de A - renvoie l'ensemble K1, K2, K3
  10. Lire toutes les touches de B - retourne l'ensemble K1, K3.

B ne synchronise jamais l'ensemble K2... (Cela fait plus de 12 heures) Pourquoi le noeud B ne voit-il pas l'ensemble K2... quelqu'un a-t-il une idée ?


Informations complémentaires :

Ok... voilà le problème. Le niveau de cohérence de la lecture était fixé à 1 par défaut.

Ainsi, lorsque nous demandons au nœud B l'ensemble K2 et qu'il ne l'a pas (alors qu'il est censé l'avoir en raison du facteur de réplication = 2), il renvoie immédiatement une erreur "Not found" (introuvable).

Cependant, si nous utilisons la cohérence en lecture comme QUORUM ou ALL, alors B est obligé de demander à A, qui renvoie alors la bonne valeur et B synchronise cette clé (l'enregistre localement).

Cela entraîne un autre problème : lorsque le nœud B est mis en service, il ne synchronise pas toutes les données du nœud A, même après une longue période. Maintenant, si le nœud A tombe en panne, comment pouvons-nous accéder à ces données non synchronisées ? (Je viens de tester que ce n'est pas possible)

Je suppose qu'il doit y avoir un moyen de forcer la synchronisation des données. Je vois l'INFO dans la sortie du terminal qui indique qu'un transfert de 15 lignes de A à B a eu lieu lorsque B est apparu, mais B n'a pas ces lignes localement (parce que nous ne pouvons toujours pas les lire à partir de B avec le niveau de cohérence UN). Que se passe-t-il ici ?

6voto

jbellis Points 16235

Il y a 3 façons pour Cassandra de synchroniser les mises à jour qui ont eu lieu pendant qu'un nœud était en panne :

  1. hinted handoff. exige que le détecteur de panne sur A reconnaisse que B est en panne avant que vous n'écriviez K2. Voir http://wiki.apache.org/cassandra/HintedHandoff
  2. nécessite que B soit en place lorsque K2 est demandé pour que la réparation ait lieu. Voir http://wiki.apache.org/cassandra/ReadRepair
  3. Réparation anti-entropie. nécessite une invocation manuelle ("nodetool repair"). voir http://wiki.apache.org/cassandra/AntiEntropy

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X