2013-04-24 12 views
5

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.

risposta

9

Per i dettagli sulla maxConnsPerHost/maxConns Check questa risposta: setMaxConns and setMaxConnsPerHost in Astyanax client

E sì, maxConnsPerHost dovrebbe essere aumentato per ottenere buone prestazioni. Il valore ottimale dipende dalla topologia della rete, dal fattore di replica delle richieste, dalla configurazione di archiviazione, dalla memorizzazione nella cache, dal rapporto di lettura/scrittura, ecc.

Non credo sia possibile ottenere prestazioni ottimali per i cluster con carichi pesanti senza esperimenti e simulazioni.

Per compiti con carico moderato sul Cassandra solito uso una regola empirica:

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

Cioè, per un cluster di scatole 8-core con fattore di replicazione 3, maxConnsPerHost dovrebbe essere di circa 4. Questo valore è anche un buon punto di partenza per esperimenti in scenari di carichi pesanti.

La motivazione: un cluster di N nodi con core C ha un totale di N * C core. Per elaborare la richiesta con il fattore di replica R, sono necessari i nuclei R (di nodi diversi). Pertanto, in ogni momento il cluster può elaborare fino a N * C/R richieste. È una buona idea mantenere la quantità di connessioni simultanee attorno a questo numero. Dividilo per N per calcolare il numero di connessioni per host. Aggiungi 1 connessione di ricambio per host per latenze di rete, ecc. Tutto qui.

Aggiornamento: semplice ottimizzazione delle prestazioni del client:

  • Inizia con qualche maxConnsPerHost valore
  • carico Simulare e osservare l'utilizzo della CPU e org.apache.cassandra.request->***Stage->pendingTasks JXM attributi
  • Aumento maxConnsPerHost fino pendingTasks inizia ad aumentare rapidamente. Questo è probabilmente il valore ottimale.
  • Il carico della CPU sui nodi del cluster deve essere attorno al 50-70%. Se è molto meno - probabilmente c'è qualcosa di sbagliato nella configurazione del server.
+0

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

+0

@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

+0

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

Problemi correlati