2016-05-09 5 views
9

Mam błąd wein próbuje odczytać dane z tabeli Cassandra. Mam instalację z jednym węzłem, z domyślną konfiguracją. To zapytanie robię:Błąd odczytu w kassierze

SELECT component_id, 
     reading_1, 
     reading_2, 
     reading_3, 
     date 
    FROM component_readings 
    WHERE park_id=2 
     AND component_id IN (479) 
     AND date >= '2016-04-09+0000' 
     AND date <= '2016-05-08+0000'; 

component_readings jest prosty stół, bez żadnych warunków grupowania:

CREATE TABLE component_readings (
    park_id int, 
    component_id int, 
    date timestamp, 
    reading_1 decimal, 
    reading_2 decimal, 
    ... 
    PRIMARY KEY ((park_id), component_id, date) 
); 

Z pewnymi wartościami component_id, to działa, i z innymi wartościami, to się nie powiedzie. Jest to błąd otrzymuję:

cassandra.ReadFailure: code=1300 [Replica(s) failed to execute read] 
message="Operation failed - received 0 responses and 1 failures" 
info={'required_responses': 1, 'received_responses': 0, 'failures': 1, 
'consistency': 'LOCAL_ONE'} 

I system.log Cassandra pokazuje ten błąd:

ERROR [SharedPool-Worker-1] 2016-05-09 15:33:58,872 StorageProxy.java:1818 - 
Scanned over 100001 tombstones during query 'SELECT * FROM xrem.component_readings 
WHERE park_id, component_id = 2, 479 AND date >= 2016-04-09 02:00+0200 AND date <= 
2016-05-08 02:00+0200 LIMIT 5000' (last scanned row partion key was ((2, 479), 
2016-05-04 17:30+0200)); query aborted 

Najdziwniejsze jest to, że pojawia się błąd tylko Dokonując zapytania z zewnętrznego program (za pomocą pythassu-konektora). Jeśli zrobię to bezpośrednio w powłoce cqlsh, działa idealnie.

Moja instalacja była cassandra 2.2, ale zaktualizowałem ją do wersji 3.5 i otrzymuję ten sam błąd.

+0

co się stanie, jeśli ustawisz poziom spójności na kworum w żądaniu? – Whitefret

+0

Ten sam problem: 'cassandra.ReadFailure: kod = 1300 [Replika nie wykonała odczytu] message =" Operacja nie powiodła się - odebrano 0 odpowiedzi i 1 błąd "info = {'received_responses': 0," awaria ": 1, "required_responses": 1, 'consistency': 'QUORUM'} ' –

+0

masz tylko jedną replikę? – Whitefret

Odpowiedz

7

Przekraczasz granicę tombstone_failure_threshold. Domyślnie jest to 100'000. Można albo

  • wzrost wartości w cassandra.yaml lub
  • oczyścić nagrobki

Aby zrobić ten ostatni alter tabelę i ustawić gc_grace_seconds do 0:

ALTER TABLE component_readings WITH GC_GRACE_SECONDS = 0; 

Następnie uruchomić zagęszczanie za pomocą nodetool. Spowoduje to wypłukanie wszystkich nagrobków.

W określonym scenariuszu klastra z jednym węzłem można pozostawić wartość GC_GRACE_SECONDS na zero. Ale jeśli tak, pamiętaj, aby cofnąć to, jeśli chcesz użyć więcej niż jednego węzła!

+1

Ale jeśli problemem są nagrobki, dlaczego zapytanie działa, jeśli uruchomię je z cqlsh i nie powiedzie się z zewnętrznego programu? Nie ma to dla mnie sensu (BTW, rozwiązanie działa, ale nie rozumiem dlaczego). –

+1

@ CésarGarcíaTapia, tak, zgadzam się, że to dziwne. Obecnie istnieje kilka otwartych zgłoszeń dotyczących niespójnego liczenia/zachowania się nagrobków lub innych, które mają wpływ na gałęzie 3.x. Może na ciebie wpływa jeden taki? Możesz podnieść bilet błędu. – Ralf