2013-04-15 9 views
2

Dans la doc [1], il a été dit queQuelle est la pratique courante pour gérer l'échec d'écriture Cassandra?

if using a write consistency level of QUORUM with a replication factor 
of 3, Cassandra will send the write to 2 replicas. If the write fails on 
one of the replicas but succeeds on the other, Cassandra will report a 
write failure to the client. 

suppose que oui seulement 2 répliques reçoivent la mise à jour, l'écriture a échoué. Mais en raison de la cohérence éventuelle, tous les nœuds recevront finalement la mise à jour.

Alors, dois-je réessayer? Ou juste laisser comme ça?

Une stratégie?

[1] http://www.datastax.com/docs/1.0/dml/about_writes

Répondre

3

Ces documents ne sont pas tout à fait correct. Quel que soit le niveau de cohérence (CL), les écritures sont envoyées à toutes les répliques disponibles. Si les répliques ne sont pas disponibles, Cassandra n'enverra pas de requête aux noeuds descendants. S'il n'y a pas assez de disponibles dès le départ pour satisfaire le CL, une exception UnavailableException est lancée et aucune écriture n'est tentée sur un nœud. Toutefois, l'écriture peut toujours aboutir sur certains nœuds et une erreur peut être renvoyée au client. Dans l'exemple de [1], si une réplique est en panne avant que l'écriture ait été tentée, ce qui est écrit est vrai.

Supposons donc que seules 2 répliques reçoivent la mise à jour, l'écriture a échoué. Mais en raison de la cohérence éventuelle, tous les nœuds recevront la mise à jour enfin.

Faites attention cependant: une écriture échouée ne vous dit pas combien de nœuds l'écriture a été faite. Il pourrait ne pas en être ainsi, l'écriture peut ne pas se propager par la suite.

Alors, dois-je réessayer? Ou juste laisser comme ça?

En général, vous devriez réessayer, car il peut ne pas être écrit du tout. Vous devriez seulement considérer votre écriture comme écrite quand vous avez eu un retour réussi de l'écriture.

Si vous utilisez des compteurs, vous devez faire attention aux tentatives. Parce que vous ne savez pas si l'écriture a été faite ou non, vous pourriez obtenir des comptes en double. Pour les compteurs, vous ne voulez probablement pas réessayer (car le plus souvent l'écriture aura été faite sur au moins un nœud, au moins pour des niveaux de cohérence plus élevés).

0

Réessayer ne changera pas beaucoup. Le problème est que vous ne pouvez pas savoir si les données ont persisté, car Cassandra jette toujours la même exception.

Vous avez quelques options:

  • permettent des conseils et essayer de nouveau demande avec cl = tout - réponse positive signifierait que au moins indice a été créé. Donc, vous savez que les données sont là mais pas encore accessibles.
  • Désactiver les indicateurs et réessayer avec un - réponse réussie signifierait qu'au moins un nœud pourrait recevoir des données. En cas d'erreur, exécutez delete.
  • utilisation Astyanax et leur stratégie de nouvelle tentative
  • de mise à jour Cassandra 1.2 et l'utilisation WAL
Questions connexes