2013-04-24 13 views
5

Ich lese die Daten aus der Cassandra-Datenbank mit dem Astyanax-Client.Astyanax Client maximale Verbindungen pro Knoten?

Ich habe rund eine Million Zeilen in einer Cassandra-Datenbank. Ich habe ein einzelnes Kreuz colocation centre Cluster mit vier Knoten.

Das sind meine vier Knoten:

node1:9160 
    node2:9160 
    node3:9160 
    node4:9160 

Ich habe ist KeyCaching aktiviert und SizeTieredCompaction Strategie als auch aktiviert.

Ich habe ein Client-Programm, das Multithread ist, das die Daten aus der Cassandra-Datenbank mit dem Astyanax-Client liest und die ich mit 20 Threads ausführen. Wenn ich mein Client-Programm mit 20 Threads ausführe, verschlechtert sich die Leistung beim Lesen der Daten aus der Cassandra-Datenbank.

Also die erste Sache, die mir in den Sinn kommt ist, dass es Streit über Verbindungen zu Cassandra sein kann (verwenden sie einen Pool, wenn ja, wie viele Verbindungen werden beibehalten)? Ich verwende den folgenden Code, um die Verbindung mit dem Astyanax-Client herzustellen.

private CassandraAstyanaxConnection() { 
    context = new AstyanaxContext.Builder() 
    .forCluster(ModelConstants.CLUSTER) 
    .forKeyspace(ModelConstants.KEYSPACE) 
    .withAstyanaxConfiguration(new AstyanaxConfigurationImpl() 
     .setDiscoveryType(NodeDiscoveryType.RING_DESCRIBE) 
    ) 
    .withConnectionPoolConfiguration(new ConnectionPoolConfigurationImpl("MyConnectionPool") 
     .setPort(9160) 
     .setMaxConnsPerHost(1) 
     .setSeeds("nod1:9160,node2:9160,node3:9160,node4:9160") 
    ) 
    .withAstyanaxConfiguration(new AstyanaxConfigurationImpl() 
     .setCqlVersion("3.0.0") 
     .setTargetCassandraVersion("1.2")) 
    .withConnectionPoolMonitor(new CountingConnectionPoolMonitor()) 
    .buildKeyspace(ThriftFamilyFactory.getInstance()); 

    context.start(); 
    keyspace = context.getEntity(); 

    emp_cf = ColumnFamily.newColumnFamily(
     ModelConstants.COLUMN_FAMILY, 
     StringSerializer.get(), 
     StringSerializer.get()); 
} 

Muss ich irgendwelche Änderungen im obigen Code vornehmen, um die Leistung zu verbessern?

Was macht diese Methode?

setMaxConnsPerHost(1) 

Muss ich das erhöhen, um die Leistung zu verbessern? Ich habe vier Knoten, also sollte ich das auf 4 ändern?

Und wird die Methode setMaxConns (20) aufrufen? Muss ich das auch hinzufügen, um die Leistung zu verbessern? Da ich mein Programm mit mehreren Threads ausführen werde.

Antwort

9

Einzelheiten zu maxConnsPerHost/maxConns Sie diese Antwort überprüfen können: setMaxConns and setMaxConnsPerHost in Astyanax client

Und ja, sollte maxConnsPerHost erhöht werden, um gute Leistung zu erzielen. Der optimale Wert hängt von der Netzwerktopologie, dem Replikationsfaktor der Anforderung, der Speicherkonfiguration, Zwischenspeicherung, Lese-/Schreibverhältnis usw. ab.

Ich glaube nicht, dass es möglich ist, eine optimale Leistung für stark belastete Cluster ohne Experimente und Simulationen zu erreichen.

Für Aufgaben mit mäßiger Belastung Cassandra ich in der Regel eine Faustregel gilt:

maxConnsPerHost ~= <Number of cores per host>/<Replication factor> + 1 

Das heißt, für eine Gruppe von 8-Core-Boxen mit Replikationsfaktor 3 sollte maxConnsPerHost um 4 sein Dieser Wert ist auch ein guter Ausgangspunkt für Experimente in Schwerlast-Szenarien.

Die Motivation: Ein Cluster von N Knoten mit C Kernen hat N * C Kerne insgesamt. Um die Anfrage mit dem Replikationsfaktor R, R zu bearbeiten, sind Cores (von verschiedenen Knoten) erforderlich. So kann der Cluster zu jedem Zeitpunkt bis zu N * C/R Anfragen verarbeiten. Es empfiehlt sich, die Anzahl der gleichzeitigen Verbindungen um diese Nummer beizubehalten. Teilen Sie es durch N, um die Anzahl der Verbindungen pro Host zu berechnen. Fügen Sie 1 Ersatzverbindung pro Host für Netzwerklatenzen usw. hinzu. Das war's.

Update: Einfacher Client-Performance-Tuning:

  • beginnt mit einiger maxConnsPerHost Wert
  • Simulieren Last und beobachtet die CPU-Auslastung und org.apache.cassandra.request->***Stage->pendingTasks JXM Attribute
  • Zunahme maxConnsPerHost bis pendingTasks beginnt schnell zu erhöhen. Dies ist wahrscheinlich der optimale Wert.
  • CPU-Last auf Clusterknoten sollte etwa 50-70% betragen. Wenn es viel weniger ist - es ist wahrscheinlich etwas falsch mit der Serverkonfiguration.
+0

Danke Wildfire für den Vorschlag. Schätze deine Hilfe. Und was ist mit setMaxConns? Welchen Wert sollten wir dafür setzen? Welche Art von Logik folgen wir normalerweise, um das zu entscheiden? –

+0

@FarhanJamal: setMaxConns wird nur mit ConnectionPoolType.BAG verwendet, in anderen Implementierungen wird es einfach ignoriert. Wenn Sie den BAG-Verbindungspool verwenden, können Sie dieses Attribut auf die maximale Anzahl von Threads setzen, die gleichzeitig Anfragen an Cassandra senden können. – Wildfire

+0

Danke für den Vorschlag. Im Allgemeinen welchen Verbindungspool ich verwenden sollte? Das bedeutet, dass das Verbindungs-Pooling eine schnellere Leseleistung ermöglicht. Im obigen Beispiel verwende ich 'ConnectionPoolConfigurationImpl'. Haben Sie auch eine Empfehlung? –

Verwandte Themen