Casandra ReadTimeOuts już przy niedużym obciążeniu

0

Witajcie,
Zagadnienie jest następujące.
Ładują Cassadnrę danymi (3 GB) następnie puszczam selecty na dane.
Łącznie mam 9 Casandr z potrójną replikacją. Wszystkie Casaandry są w jednym DataCenter.
Consistency level równy 1.

Testy:
Do testu używam jmetera z wtyczką do Cassandry.
Request to select odpytujący o wiersze dla których ID znajduje się w zadanej liście. W liście zadaję 100 losowych ID'ków i wszystkie będą w bazie. Losowość ID minimalizuje użycie Cache'a.
Tak wieć w odpowiedzi dostaję 100 itemów.

Przykład selectu:

select * from ceny.item_vat_posting_group where no in ('B7B7A6','B2DD05','A34751','B4BC7D','C0BB53','D07DCB','C03716','BB99DF','A975C2','C2AE27','AF621C','242448','B30CDA','508336','B44D6B','D07422','AC44EA','C6F34D','9B25AC','C4CF12','AC25BD','C3D9C7','AE7DB2','C5E03E','BF7AC1','B499B5','A7787E','645180','A9BEFE','AFFEA4','A88955','D95B50','B0F9FC','C09174','253953','9ED9CA','CAF896','536951','214502','427776','DA14CB','422282','A4B10A','C56BF5','B373E0','D171EF','C70607','B350AB','9D809B','586563','BF6308','A4BF5A','C42716','C3261C','C45B79','C6FE55','D1F0D4','C483B5','A67D59','DC5898','9BACAD','D9C6B0','D17DAE','D8D4F3','A05946','BBEBA8','A87B37','A13E97','BB7099','A3FC26','C461DF','309810','BF6306','D07603','C59F70','C5906C','A515ED','B50056','A8390E','A0CCC7','BF2713','C6EC7D','D7EB9D','A5D5EB','984076','D88F44','257058','D61635','D40CDE','B0A347','B7617F','D6277E','B4286F','C41F99','D84232','DC1636','BFF15D','DD0972','9B3138');

Scenariusz 1
Przy Requestach wysyłanych przez 100 wątków w czasie 10 minut Cassandra zwraca 5% błędów związanych z ReadTimeOuts.
Średni czas odpowiedzi to 100 ms.
Obciążenie procesorów na Cassandrach wynosi 40-50%.

Ponadto wykonywałem testy z większą ilością wątków co skutowało częstszym pojawianiem się błędów.
Scenariusz 2.
Przy Requestach wysyłanych przez 4 wątki i w czasie 24 godzin błędy również się pojawiały +/- 10 błędów na 100 000 requestów.
Obciążenie procesorów na Cassandrach wynosi 4-5%.

W załaczniku zamieszczam konfigurację Cassandry.

Treść błędu

Cassandra timeout during read query at consistency LOCAL_ONE (1 responses were required but only 0 replica responded) 
com.datastax.driver.core.exceptions.ReadTimeoutException: Cassandra timeout during read query at consistency LOCAL_ONE (1 responses were required but only 0 replica responded) 
at com.datastax.driver.core.exceptions.ReadTimeoutException.copy(ReadTimeoutException.java:69) 
at com.datastax.driver.core.DefaultResultSetFuture.extractCauseFromExecutionException(DefaultResultSetFuture.java:258)

**PROŚBA

  1. Czy timeout'y które występują wynikaja z samej architektury Cassandry czy też niewłaściwej konfiguracji?**

Będę mega wdzięczny za wskazówki / pomoc,

0

zawsze strzelasz do jednej maszyny czy może rozrzucasz requesty po kilku? czy no z kodu CQL to klucz partycjonujący?

0

Koordynator jest zmienny. Wyznaczany na podstawie wbudowanego algorytmu cassandry (wyb według latency). Reqesty trafiaja na różne maszyny. Cassandry są niemalże jednakowo obciążone.

0

Nie jestem specem od Cassandry, ale średnie obciążanie 40% nie znaczy, ze nie ma momentów, gdy jest większe. Choć 5 sekund timeoutu to jest sporo, to widać załapałeś się na długi ogon daleki od wartości oczekiwanej.
Może akurat gc się włączył podcas tych 5%? Może Cassandra w tym czasie coś robi? Spróbuj podnieś poziom logowania, będziesz miał więcej informacji,
Ewentualnie może trafiłeś na TCP incast?

Może to pomoże: http://blog.mikiobraun.de/2010/08/-cassandra-tips.html

0

@nalik

  • GC pracuje nie dłużej niż 300 ms. TimeOut jest po 5 s
0

Artykuł czytałem już wczesniej. GC działa bardzo często, jednak czas jego pracy nie przekracza max 300ms. W logach cassandry nie ma błędów, jednak widać że w pewnych momentach wszystkie wątki na cass są zajete i selecty wpadają do kolejki.

0

Zmien to query - gorszego sie chyba nie dalo. Na jakich maszynach masz te Cassandry ?

0

Więc tak... Twoje zapytnie dla C* to pomyłka. Wiąże się to z fullscanem dla wszystkich sstable/memtable na wszystkich maszynach.

W przypadku C* bardzo istotne jest porządne modelowanie struktury bazy danych i podporządkowanie tej struktury pod wykonywane zapytania.

Pokaż swój model, pokaż swoje zapytania i powiedz co chcesz osiągnąć.

Ponadto niebardzo wiem jak wartość 256S działa w C*. Nie powinno to odpowiadać liczbie vnodów dla maszyny w klastrze, pierwszy raz widzę taką konfigurację, normalnie jest to wartość liczbowa - masz tu błąd.

Zacznijmy też od przekopiowania nodetool status.

1 użytkowników online, w tym zalogowanych: 0, gości: 1