Czytam dane z bazy danych Cassandra za pomocą klienta Astyanax.Maksymalne połączenia klienta Astyanax na węzeł?
Mam około miliona unikalnych wierszy w bazie danych Cassandry. Mam klastra z pojedynczym krzyżem colocation centre z czterema węzłami.
To są moje cztery węzły:
node1:9160
node2:9160
node3:9160
node4:9160
Mam KeyCaching włączona i strategia SizeTieredCompaction jest włączona, jak również.
Mam program kliencki, który jest wielowątkowy, który odczyta dane z bazy danych Cassandra za pomocą klienta Astyanax, a ja używam 20 wątków. Jeśli używam programu klienckiego z 20 wątkami, wydajność odczytu danych z bazy danych Cassandra pogarsza się.
Pierwszą rzeczą, która skacze mi na myśl, jest to, że mogą istnieć spory o połączenia z Cassandrą (czy używają puli, jeśli tak, ile połączeń jest utrzymywanych)? Korzystam z poniższego kodu, aby nawiązać połączenie za pomocą klienta 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());
}
Czy muszę wprowadzić jakiekolwiek zmiany w powyższym kodzie, aby poprawić wydajność?
Co robi ta metoda?
setMaxConnsPerHost(1)
Czy muszę to zwiększyć, aby poprawić wydajność? Mam cztery węzły, więc powinienem to zmienić na 4?
Czy zadzwoni metoda setMaxConns (20)? Czy muszę dodać to również w celu poprawy wydajności? Ponieważ będę uruchamiał mój program z wieloma wątkami.
Dzięki Wildfire za sugestię. Doceniłem twoją pomoc. A co z setMaxConns? Jaką wartość powinniśmy dla tego ustawić? Jakiej logiki zwykle podążamy, aby to zdecydować. –
@FarhanJamal: setMaxConns jest używany tylko z ConnectionPoolType.BAG, jest po prostu ignorowany w innych implementacjach. Jeśli używasz puli połączeń BAG, możesz ustawić ten atrybut na maksymalną liczbę wątków, które mogą jednocześnie wysyłać żądania do Cassandra. – Wildfire
Dzięki za sugestię. Na ogół jakiej puli połączeń powinienem użyć? Znaczenie tego, jakie połączenie połączeń pozwoli mi uzyskać wyższą wydajność odczytu. Obecnie w powyższym przykładzie używam 'ConnectionPoolConfigurationImpl'. Czy masz również jakieś zalecenia? –