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.
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? –
@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
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? –