2016-10-20 2 views
-1

Ich habe eine kleine Anwendung geschrieben, um das Konzept Verbindung Pooling in Cassandra zu verstehen. Ich teste es mit Apache Bench Tool. Die App zeigt jedoch manchmal den Fehler und schließt die Verbindungen dazwischen. und dann wirft es Fehler wie Host ist down. Wenn ich Anfrage für 1.000.000 Abfragen mit Gleichzeitigkeit von 1000 gebe. Es wird erfolgreich ausgeführt, aber wenn ich versuche, die Nebenläufigkeit zu erhöhen, endet es schließlich schließen Socket und schließlich zeigt es Host ist down. Also, was meine Fragen sind, gibt es eine Grenze für gleichzeitige Anfragen, die Cassandra dienen kann? limit ist ungefähr 32K Anfragen, ohne auf Antwort zu warten, da ich Cassandra 3.0 verwende.Verbindung Pooling mit Cassandra-Treiber für Nodejs

  1. bedeutet das, dass ich so viel gleichzeitige Anfrage laufen lassen kann?

  2. Was ist der Grund dafür, diese Fehler zu bekommen? für einige Eingaben und nicht für alle.

  3. Wie funktioniert das Verbindungs-Pooling in Cassandra so gut wie wir können nur die Anzahl der CoreConnections pro Host und nicht die Anzahl der Anfragen pro Verbindung?

Hier ist die Testdatei, die ich gemacht habe.

var cassandra = require("cassandra-driver"); 
    var express = require("express"); 
    var distance = cassandra.types.distance; 


    var cassClient = new cassandra.Client({contactPoints: ['myhost'],pooling: { 
     coreConnectionsPerHost: { 
      [distance.local] : 2, 
      [distance.remote] : 1 
     } 
    }, keyspace: 'MY_DB'}); 

    var app = express(); 
    cassClient.connect(function(err){ 
     if(err){ 
     console.log("Error: Connection to cassandra server."+err); 
     } else { 
     console.log("Success !!!"); 
     } 
    }); 

    var i =0; 
    app.get("/",function(req,res){ 
    cassClient.execute('SELECT * from mytable LIMIT 2', function(err, rows) { 
    //cassClient.shutdown(); 
    if (!err){ 
    // console.log('The solution is: ' +i); 
     return res.send(); 
     } 
    else 
     { 

     i++; 
     console.log(err.message +" "+i); 
     return res.send(); 
     } 
    }); 
    // cassClient.nwd(); 
    }); 

    app.listen(3001); 

die Fehler ich bin immer sind

  • Alle Host (s) zur Abfrage versucht, fehlgeschlagen. Erster Host versucht, myhost: 9042: Host wird als DOWN betrachtet. Siehe innere Fehler.
  • Alle Host (s) versucht für Abfrage fehlgeschlagen. Erster Host versucht, myhost: 9042: Fehler: Socket wurde geschlossen. Siehe innere Fehler.
  • Alle Host (s) versucht für Abfrage fehlgeschlagen. Erster Host versucht, myhost: 9042: OperationTimedOutError: Der Host myhost: 9042 hat vor dem Timeout 12000 ms nicht geantwortet. Siehe innere Fehler.

also warum passiert es?

Antwort

0

Der folgende Fehler:

All host(s) tried for query failed. First host tried, 
myhost:9042: OperationTimedOutError: The host myhost:9042 did not reply before 
timeout 12000 ms. See innerErrors. 

Bezieht sich auf Client-Timeouts: wenn eine Anforderung ausgegeben wird, aber es dauert zu lange die Antwort vom Server zu erhalten (siehe socketOptions.readTimeout).

Wenn zu viele Anfragen gleichzeitig abgelaufen sind, wird die Verbindung als nicht mehr gültig markiert (siehe socketOptions.defunctReadTimeoutThreshold) und aus dem Pool entfernt. Wenn der Pool leer ist, wird der Knoten als DOWN markiert.

Sie können enable logging auf Ebene INFO oder oben, um zu sehen, was unter der Haube geschieht.

+0

Ich lese die gleichen Dinge auch. aber meine Sorge ist, selbst wenn die Datenbank klein ist und Abfrage dauert nicht mehr als Lese-Timeout zeigt es immer noch Fehler. liegt es daran, dass ich mehrere Anfragen gleichzeitig auslöse? –

+0

Der Treiber unterstützt hohe Gleichzeitigkeitsgrade. Zeigt das Treiberprotokoll etwas Relevantes? – jorgebg

+0

Logs zeigt nur die drei Fehler, die ich Ihnen gezeigt habe –