2016-05-09 17 views
9

Errore di lettura tentativo di leggere i dati da una tabella Cassandra. Ho un'installazione a nodo singolo, con l'impostazione predefinita. Questa è la domanda che sto facendo:Errore di lettura in cassandra

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 è una tabella semplice, senza condizioni di clustering:

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) 
); 

Con alcuni component_id valori, funziona, e con altri valori, non riesce. Questo è l'errore che sto ricevendo:

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'} 

E system.log della Cassandra mostra questo errore:

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 

La cosa strana è che ottengo l'errore solo quando si effettua la query da un esterno programma (tramite il connettore di Python Cassandra). Se lo faccio direttamente nella shell cqlsh, funziona perfettamente.

La mia installazione era di tipo cassandra 2.2, ma ho eseguito l'aggiornamento a 3.5 e ottengo lo stesso errore.

+0

cosa succede se si imposta il livello di coerenza al quorum in una richiesta? – Whitefret

+0

Stesso problema: 'cassandra.ReadFailure: code = 1300 [Replica (s) non riuscita a leggere leggere] message =" Operazione fallita - ricevuto 0 risposte e 1 errore "info = {'received_responses': 0, 'failure': 1, 'required_responses': 1, 'consistenza': 'QUORUM'} ' –

+0

hai solo una replica? – Whitefret

risposta

7

Si sta superando lo tombstone_failure_threshold. Il valore predefinito è 100.000. È possibile sia

  • aumento del valore della cassandra.yaml o
  • ripulire i lapidi

Per fare quest'ultima alter vostro tavolo e impostare i gc_grace_seconds a 0:

ALTER TABLE component_readings WITH GC_GRACE_SECONDS = 0; 

Quindi attivare una compattazione tramite il nodetool. Questo svuota tutte le pietre tombali.

Nel particolare scenario di un cluster a un nodo è possibile lasciare GC_GRACE_SECONDS a zero. Ma se lo fai, tieni presente di annullare questo se vuoi usare più di un nodo!

+1

Ma se il problema sono le pietre tombali, perché la query funziona se la avvio da cqlsh e non riesce dal programma esterno? Non ha senso per me (a proposito, la soluzione funziona, ma non capisco perché). –

+1

@ CésarGarcíaTapia, sì, sono d'accordo che è strano. Attualmente ci sono diversi ticket aperti su alcuni conteggi/comportamenti di lapidi incoerenti o altri che riguardano i rami 3.x. Forse sei affetto da uno di questi? Potresti aumentare un ticket bug. – Ralf