J'ai un cluster Cassandra avec trois nœuds, dont deux sont en place. Ils sont tous dans le même DC. Lorsque mon application Java va écrire sur le cluster, j'obtiens une erreur dans mon application qui semble être provoquée par un problème avec Cassandra:
Causé par: com.datastax.driver.core.exceptions.UnavailableException: le nombre de répliques disponibles est insuffisant pour la requête de cohérence UN (1 requis mais seulement 0 actif) à l'adresse com.datastax.driver.core.exceptions.UnavailableException.copy (UnavailableException.Java:79)
La partie qui n'a pas de sens est cette déclaration "1 requis mais seulement 0 vivant". Il y a deux nœuds vers le haut, ce qui signifie qu'un doit être "en vie" pour la réplication.
Ou est-ce que je comprends mal le message d'erreur?
Merci.
Vous obtiendrez probablement cette erreur car le facteur de réplication de l'espace de clés auquel appartient la table à laquelle vous interrogez a un facteur de réplication de 1, est-ce correct?
Si la partition que vous lisez/mettez à jour ne dispose pas de suffisamment de répliques disponibles (nœuds avec ces données) pour atteindre le niveau de cohérence, vous obtiendrez cette erreur.
Si vous voulez pouvoir gérer plus d’un nœud indisponible, vous pouvez examiner modifier votre espace de clés pour définir un facteur de réplication supérieur, de préférence trois dans ce cas, puis exécuter une réparation nodetool sur chaque nœud pour obtenir toutes vos données sur tous les nœuds. Avec ce changement, vous pourrez survivre à la perte de 2 nœuds à lire avec un niveau de cohérence de un.
Ce calculateur de paramètres de Cassandra est une bonne référence pour comprendre les considérations du nombre de nœuds, du facteur de réplication et des niveaux de cohérence.
Je frappe ceci aujourd'hui parce que le champ de centre de données est sensible à la casse. Si votre dc est 'somedc01' cela ne fonctionnera pas:
replication =
{
'class': 'NetworkTopologyStrategy',
'SOMEDC01': '3' # <-- BOOM!
}
AND durable_writes = true;
Quoi qu'il en soit, ce n'est pas si intuitif, espérons que cela aide.
dans mon cas, le message 0 était disponible, mais cassandra était actif et cqlsh fonctionnait correctement, le problème était lié à l'accès depuis Java: la requête visait une table complète et certains enregistrements n'étaient pas accessibles (tous les nœuds les contenant étaient fermés). À partir de cqlsh, sélectionnez * dans la table, affiche uniquement les enregistrements accessibles. La solution consiste donc à récupérer les nœuds vers le bas et peut-être à modifier les facteurs de réplication avec:
ALTER KEYSPACE ....
nodetool repair -all
puis statut nodetool pour voir les changements et la structure du cluster
Pour moi, c’est que mon endpoint_snitch était toujours défini sur SimpleSnitch au lieu de quelque chose comme GossipingPropertyFileSnitch. Cela empêchait le cluster multi-DC de se connecter correctement et se manifestait dans l'erreur ci-dessus.