Sto leggendo i dati dal database Cassandra usando il client Astyanax.Connessioni massime del client Astyanax per nodo?
Ho un milione di righe univoche in un database Cassandra. Ho un singolo cluster incrociato colocation centre con quattro nodi.
Questi sono i miei quattro nodi:
node1:9160
node2:9160
node3:9160
node4:9160
ho KeyCaching abilitato e strategia SizeTieredCompaction è attivato pure.
Ho un programma client che è multithreading che leggerà i dati dal database Cassandra utilizzando il client Astyanax e che sto utilizzando con 20 thread. Se sto eseguendo il mio programma client con 20 thread, le prestazioni di lettura dei dati dal database Cassandra diminuiscono.
Quindi la prima cosa che mi viene in mente è che potrebbero esserci contese sulle connessioni a Cassandra (usano un pool, in tal caso quante connessioni vengono mantenute)? Sto usando il codice seguente per effettuare la connessione usando il client Astyanax.
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());
}
Devo apportare qualche tipo di modifica al codice sopra riportato per migliorare le prestazioni?
Cosa fa questo metodo?
setMaxConnsPerHost(1)
Devo aumentarlo per migliorare le prestazioni? Ho quattro nodi, quindi dovrei cambiarlo in 4?
E il metodo setMaxConns (20) chiama? Devo aggiungere anche questo per migliorare le prestazioni? Poiché eseguirò il mio programma con più thread.
Grazie Wildfire per il suggerimento. Apprezzato il tuo aiuto. E per quanto riguarda setMaxConns? Che valore dovremmo impostare per questo? Che tipo di logica noi di solito seguiamo per decidere.? –
@FarhanJamal: setMaxConns viene utilizzato solo con ConnectionPoolType.BAG, è semplicemente ignorato in altre implementazioni. Se si utilizza il pool di connessioni BAG, è possibile impostare questo attributo sul numero massimo di thread che potrebbe inviare richieste a Cassandra contemporaneamente. – Wildfire
Grazie per il suggerimento. In generale, quale pool di connessioni dovrei usare? Significa che il pooling delle connessioni mi consentirà di avere prestazioni di lettura più veloci. Attualmente, nel mio esempio sopra, sto usando 'ConnectionPoolConfigurationImpl'. Hai qualche raccomandazione anche per questo? –