2013-08-07 19 views
10

avevo cambiato tutta la base di codice da Thrift a CQL utilizzando datastax java driver 1.0.1 e cassandra 1.2.6..Cassandra frequente lettura e scrittura Timeout

con parsimonia mi è stato sempre timeout frequenti dall'inizio, non ero in grado di procedere ... Adottando CQL, tavoli progettato come per quello ho avuto successo e meno timeout ....

Con ciò sono riuscito a inserire dati enormi che non funzionavano con parsimonia ... Ma dopo una fase, la cartella di dati intorno a 3,5 GB. Sto ricevendo frequenti eccezioni di timeout di scrittura. anche io faccio di nuovo lo stesso caso d'uso di lavoro precedente che ora getta anche un'eccezione di timeout. LA SUA RANDOM ONCE LAVORATA NON FUNZIONA ANCHE ANCHE DOPO L'IMPOSTAZIONE FRESCO.

CASSADNRA SERVER LOG

questo è il server cassandra modalità DEBUG registro parziale allora il tempo ho ottenuto l'errore:

http://pastebin.com/rW0B4MD0

eccezione cliente è:

Caused by: com.datastax.driver.core.exceptions.WriteTimeoutException: Cassandra timeout during write query at consistency ONE (1 replica were required but only 0 acknowledged the write) 
    at com.datastax.driver.core.exceptions.WriteTimeoutException.copy(WriteTimeoutException.java:54) 
    at com.datastax.driver.core.ResultSetFuture.extractCauseFromExecutionException(ResultSetFuture.java:214) 
    at com.datastax.driver.core.ResultSetFuture.getUninterruptibly(ResultSetFuture.java:169) 
    at com.datastax.driver.core.Session.execute(Session.java:107) 
    at com.datastax.driver.core.Session.execute(Session.java:76) 

Infrastruttura: macchina 16GB con 8GB mucchio dato a Cassandra, i7 .. Sto usando SINGLE cassandra nodo con questo YAML ottimizzato per il timeout, tutto il resto è di default:

  • read_request_timeout_in_ms: 30000
  • range_request_timeout_in_ms: 30000
  • write_request_timeout_in_ms: 30000
  • truncate_request_timeout_in_ms: 60000
  • request_timeout_in_ms: 30000

Caso d'uso: Sono in esecuzione di un caso d'uso che memorizza Combinazioni (il mio progetto terminologia) in Cassandra .... attualmente testando la memorizzazione di 250 000 combinazioni con 100 filo threads..each parallelo memorizzare una combinazione ... vero e proprio caso ho bisogno di sostegno di decine di milioni, ma che avrebbe bisogno di hardware diverso e di cluster a più nodi ...

In Memorizzazione di combinazione dura circa 2 secondi e coinvolge:

  • 527 INSERT INTO interroga
  • 506 UPDATE domande
  • 954 SELEZIONA interroga

100 fili paralleli paralleli memorizzazione 100 combinazioni.

Avevo trovato il comportamento di WRITE TIMEOUTS un po 'di tempo prima che funzionasse fino a 200.000, quindi buttava i timeout E a volte non funziona nemmeno per le combinazioni 10k. COMPORTAMENTO CASUALE.

+0

Interrompere la registrazione a DEBUG e osservare cosa dice StatusLogger su INFO. – jbellis

risposta

1

Ho appena trascorso un po 'di tempo a leggere i miei dev cassandra nodi config yaml, perché ho avuto un problema simile.Il mio sistema si è bloccato e ha interrotto il timeout quando ho provato a caricare circa 3 miliardi di sha2 al mio nodo di sviluppo con solo 600 MB di RAM;)

L'ho risolto diminuendo le dimensioni della cache e attendendo prima di eseguire il flush e così via. Ciò ha reso il nodo più lento nelle scritture, ma stava diventando stabile. Sono stato quindi in grado di caricare tutti i dati necessari.

Ma mi dispiace non ho potuto capire quali opzioni erano. Ricordo che ho letto i documenti sull'ottimizzazione delle prestazioni e su come calcolare i valori corretti per il sistema basato su core CPU, ram ecc.

Il problema era che le cache non venivano scritte abbastanza velocemente sul disco, quindi il suo avvio per bloccare tutto Dopo aver detto, scrivi più spesso e lascia che la nuova richiesta attenda, il nodo si sta stabilizzando e la mia importazione sta diventando un po 'più lenta.

Ciò significa che le opzioni predefinite di cassandra sono per le macchine pesanti con un sacco di core in un cluster multi-nodo che può distribuire il carico. Per farlo funzionare in ambiente dev locale, avvitarlo. La sua ENV dev e non il sistema di vita, prendere il tempo per prendere un caffè o due;)

Speranza che aiuta a ottenere pensare in modo corretto

+0

grazie mille proverò in quella direzione solo per verificare se funziona .. Il mio caso 1-2 volte ha funzionato per un carico enorme, ma la maggior parte del tempo non funziona per un carico ancora minore di quello lavorato ... questo è il motivo per cui mi confondo se ha funzionato, allora perché non di nuovo se non ci sono cambiamenti nel sistema ... – user2572801

0

Dal frammento di registro, solo 4 GB di cumulo è stato dato a Cassandra, e sta diventando pieno. Questo è più probabile che il vostro problema:

DEBUG [ScheduledTasks:1] 2013-08-07 15:08:09,434 GCInspector.java (line 121) GC for ParNew: 155 ms for 6 collections, 3230372760 used; max is 4277534720

max è 4.277.534,72 mila == 4 GB mucchio. Dovresti andare nel tuo cassandra-env.sh e impostare esplicitamente l'heap massimo e le nuove dimensioni dell'heap. Per il nodo che hai descritto, 8 GB di heap massimo e 800 MB di nuovo heap sono probabilmente un buon punto di partenza.

+1

ho provato a dare un heap da 12 GB da 16 GB anche se non funziona ... – user2572801

0

ho anche incontrato questo problema, "Cassandra timeout durante scrittura interrogazione alla coerenza LOCAL_ONE (0 repliche) ha riconosciuto la scrittura oltre 1 necessaria" "timeout Cassandra durante leggere interrogazione alla coerenza LOCAL_ONE (0 repliche) ha riconosciuto la necessità di scrivere oltre 1 ". L'ho affrontato cambiando il parametro in cassandra.yaml. Ricerca "timeout" in cassandra.yaml, troverai read_request_timeout_in_ms: 5000 write_request_timeout_in_ms: 2000 Aumentare il numero e riavviare il "cassandra -f". Il mio problema è stato risolto. Spero che ti possa aiutare anche tu!

2

Ho scoperto che durante alcune operazioni di lettura di stress cassandra, se imposto i thread di frequenza troppo alti otterrò quell'errore CL. Prendere in considerazione della minore durante il test il numero di thread da qualcosa a prezzi accessibili per la vostra piscina per sostenere al fine di battere i

  • read_request_timeout_in_ms

A mio parere la modifica che nel cassandra.yaml non è sempre una buona idea. Considera le risorse hardware con le quali le tue macchine lavorano.

per l'uovo:

cassandra-stress read n=100000 cl=ONE -rate threads=200 -node N1 

mi darà l'errore, mentre

cassandra-stress read n=100000 cl=ONE -rate threads=121 -node N1 

farà senza intoppi il lavoro.

Spero che possa aiutarti ragazzi.

P.S. quando leggi i test prova a diffondere le letture anche sui dati con '-pop dist = UNIFORM (1..1000000)' o quanto vuoi.