2013-04-24 12 views
5

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.

Odpowiedz

9

Szczegółowe informacje na temat maxConnsPerHost/maxConns może to sprawdzić odpowiedź: setMaxConns and setMaxConnsPerHost in Astyanax client

i tak, maxConnsPerHost powinna być zwiększona w celu uzyskania dobrej wydajności. Optymalna wartość zależy od topologii sieci, współczynnika żądania replikacji, konfiguracji pamięci, buforowania, współczynnika odczytu/zapisu, itp.

Nie sądzę, że możliwe jest osiągnięcie optymalnej wydajności dla mocno obciążonego klastra bez eksperymentów i symulacji.

Dla zadań o umiarkowanym obciążeniu Cassandry Zwykle używam zasada:

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

Oznacza to, że dla klastra pudeł 8-core z czynnikiem replikacji 3, maxConnsPerHost powinna wynosić około 4. Wartość ta jest również dobrym punktem wyjścia dla eksperymentów w scenariuszach dużego obciążenia.

Motywacja: klastry zwęzłami, każdy o rdzeniach C, ma razem rdzeni. Do przetworzenia żądania z czynnikiem replikacji wymagane są rdzenie R, R (różnych węzłów). Tak więc w danym momencie klaster może przetwarzać żądania do N * C/R. Dobrym pomysłem jest utrzymywanie liczby równoczesnych połączeń wokół tego numeru. Podziel go przez N, aby obliczyć liczbę połączeń na hosta. Dodaj 1 zapasowe połączenie na hosta dla opóźnień sieciowych itp. To wszystko.

Aktualizacja: Proste strojenie wydajności klient:

  • start z pewnym maxConnsPerHost wartości
  • obciążenia symulacji i obserwować zużycie procesora i org.apache.cassandra.request->***Stage->pendingTasks JXM atrybuty
  • Wzrost maxConnsPerHostpendingTasks zaczyna gwałtownie wzrastać. Jest to prawdopodobnie optymalna wartość.
  • Obciążenie procesora w węzłach klastra powinno wynosić około 50-70%. Jeśli to znacznie mniej - prawdopodobnie jest coś nie tak z konfiguracją serwera.
+0

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

+0

@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

+0

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

Powiązane problemy