2013-12-11 14 views
6

Ich habe zwei C * 2.0.2 Knoten in einem DC (mit einer Standardkonfiguration in cassandra.yaml) und einen Schlüsselraum mit RF = 2. Zwei Clients sind mit einem Datastax Java Driver 1.0.3 mit diesem DC verbunden. Clients lesen und schreiben Daten von/nach C * mit CL = ONE ohne Fehler. Aber wenn ich schließe einen Knoten nach unten beide Clients eine riesige Menge von Ausnahmen erhalten:Cassandra NoHostAvailableException, während noch am Leben ist Knoten

com.datastax.driver.core.exceptions.NoHostAvailableException: 
All host(s) tried for query failed (no host was tried) 

Nach dieser Reihe von Ausnahmen Kunden weiterhin erfolgreich mit einem anderen Knoten arbeiten, die noch am Leben bleibt. Was muss ich tun, um keine NoHostAvailableException zu erhalten, da immer mindestens ein aktiver Knoten vorhanden ist und CL = ONE verwendet wird?

UPDATE: Als ich schloss einer von zwei Knoten wir die folgende Ausnahme in meinem app Protokoll manchmal sehen:

[Reconnection-1] [ERROR] [Control connection] Cannot connect to 
any host, scheduling retry 

Warum beide Knoten nicht verfügbar sind, wenn ich nur eine heruntergefahren? Der zweite ist noch in diesem Moment am Leben und ich kann mich mit Cqlsh verbinden.

+0

Entschuldigung, dass meine Antwort nicht geholfen hat. Haben Sie versucht, die Ablaufprotokollierung für com.datastax.driver.core.RequestHandler einzuschalten? Es sieht so aus, als wenn Sie den ersten Knoten ausschalten und der zweite aus irgendeinem Grund aus dem Pool geworfen wird. Die Stack-Ablaufverfolgung der in der RequestHandler.logError() -Methode protokollierten Ausnahmen ("Fehler bei der Abfrage von Bla-Bla-Bla") könnte helfen, dies herauszufinden. – Wildfire

+0

Ich werde es ausprobieren, danke. – tilex

Antwort

0

Wenn Sie eine Anfrage mit CL = ONE ausführen, versucht der Treiber, nur einen einzelnen Knoten abzufragen. Wenn die Anforderung an diesen Knoten fehlschlägt (oder der Knoten nicht verfügbar ist), wird die Ausnahme sofort ausgelöst. Dieses Verhalten wird von com.datastax.driver.core.policies.RetryPolicy gesteuert, das beim Erstellen eines Cluster angegeben wird.

Ich würde sagen, dass eine RetryPolicy, die eine feste Anzahl von Wiederholungsversuchen Ihren Bedürfnissen entspricht. Leider hat Cassandra Driver 1.0.3 es nicht gebündelt (ich bin mir nicht sicher, ob neuere Versionen dies tun).

public class MyRetryPolicy implements RetryPolicy { 

    final int attempts; 

    public MyRetryPolicy(int attempts) { 
     this.attempts = attempts; 
    } 

    @Override 
    public RetryDecision onReadTimeout(Query query, ConsistencyLevel cl, int requiredResponses, int receivedResponses, boolean dataRetrieved, int nbRetry) { 
     return (nbRetry >= attempts) ? RetryDecision.rethrow() : RetryDecision.retry(cl) 
    }   

    ... <onWriteTimeout & onUnavailable methods with similar implementation> 
} 

ich bin sicher nicht, wenn MyRetryPolicy(2) genug sein wird, da ich nicht in den Treiber-Interna, dass tief graben haben: Dennoch könnte es wie folgt umgesetzt werden. Wahrscheinlich wird ein weiterer Versuch unternommen, dieselbe Anfrage an denselben Host zu senden. Sie können versuchen MyRetryPolicy(10), sollte es zumindest die Anzahl der Fehler deutlich verringern.

Wenn einige Fehler weiterhin auftreten (wie 1 von 1000), kann es sich lohnen, com.datastax.driver.core.ConvictionPolicy zu betrachten, seine Verwendungen zu finden und weitere Untersuchungen durchzuführen.

+1

Benutzerdefinierte 'RetryPolicy' ist das erste, was ich ausprobiert habe, aber keine Callback-Methode wird aufgerufen, wenn' NoHostAvailableException' ausgelöst wird. – tilex

Verwandte Themen