2013-05-14 16 views
5

Sono un novizio di Cassandra - Ho cercato informazioni relative a commit e crash recovery in Cassandra su un singolo nodo. E, sperando che qualcuno possa chiarire i dettagli.Cassandra Commit e Recovery su un singolo nodo

Sto testando Cassandra - quindi, configuralo su un singolo nodo. Sto usando stresstool su datastax per inserire milioni di righe. Cosa succede se si verifica un guasto elettrico o un arresto del sistema? Tutti i dati che erano nella memoria di Cassandra verranno scritti su disco dopo il riavvio di Cassandra (suppongo che commitlog funge da intermediario)? Quanto dura questo processo?

Grazie!

risposta

11

Il registro di commit di Cassandra dà alle scritture durature Cassandra. Quando scrivi su Cassandra, la scrittura viene aggiunta al log di commit prima che la scrittura venga riconosciuta al client. Ciò significa che ogni scrittura che il client riceve una risposta corretta è garantita per essere scritta nel registro di commit. La scrittura viene anche fatta al meme corrente, che alla fine verrà scritto su disco come SSTable quando sufficientemente grande. Questo potrebbe essere molto tempo dopo la scrittura.

Tuttavia, il registro di commit non viene immediatamente sincronizzato su disco per motivi di prestazioni. L'impostazione predefinita è la modalità periodica (impostata dal parametro commitlog_sync in cassandra.yaml) con un periodo di 10 secondi (impostato da commitlog_sync_period_in_ms in cassandra.yaml). Ciò significa che il registro di commit è sincronizzato su disco ogni 10 secondi. Con questo comportamento potresti perdere fino a 10 secondi di scrittura se il server perde potenza. Se nel proprio cluster erano presenti più nodi e si utilizzava un fattore di replica maggiore di uno, per perdere dati si avrebbe bisogno di perdere potenza su più nodi entro 10 secondi.

Se questa finestra dei rischi non è accettabile, è possibile utilizzare la modalità batch per il registro di commit. Questa modalità non riconoscerà le scritture al client fino a quando il registro di commit non è stato sincronizzato su disco. La finestra temporale è impostata da commitlog_sync_batch_window_in_ms, il valore predefinito è 50 ms. Ciò aumenterà in modo significativo la latenza di scrittura e probabilmente ridurrà anche il throughput, quindi usalo solo se il costo di perdere alcune scritture riconosciute è alto. È particolarmente importante memorizzare il registro di commit su un'unità separata quando si utilizza questa modalità.

Nel caso in cui il server si spenga, all'avvio Cassandra riproduce il registro di commit per ricostruire il suo memtable. Questo processo impiegherà secondi (possibilmente minuti) su server molto pesanti per scrivere.

Se si desidera garantire che i dati nei memoble vengano scritti su disco, è possibile eseguire 'nodetool flush' (che opera per nodo). Ciò creerà un nuovo SSTable ed eliminerà i registri di commit relativi ai dati nei memobles scaricati.

+3

Grazie per la spiegazione dettagliata e molto ben scritta - ora è molto più chiara.Spero che questo aiuti anche altri neofiti come me. – user1680784

+0

sembra che tu possa avere "batch" e "periodico" all'indietro ... periodico è l'impostazione predefinita, per fare in modo che i riconoscimenti attendono che tu passi al batch, sì? –

+0

@Richard Sto affrontando questo problema. Il registro di commit di Cassandra è corrotto. Eventuali suggerimenti? Ho postato una domanda qui: http://stackoverflow.com/questions/33304367/cassandra-exiting-due-to-error-while-processing-commit-log-during-initializatio – Dojo

0

si sta chiedendo qualcosa di simile

  1. Cosa succede se c'è un errore di rete al momento di dati viene caricato in Oracle utilizzando SQL * Loader?
  2. O cosa succede Sqoop interrompe l'elaborazione a causa di alcune condizioni durante il trasferimento dei dati?

Semplicemente qualsiasi dato venga trasferito prima di un guasto elettrico o di un arresto del sistema, rimarrà lo stesso.

Venendo alla seconda domanda, quando mai il memble esaurisce lo spazio, vale a dire quando il numero di chiavi supera un certo limite (128 è predefinito) o quando raggiunge la durata (orologio cluster), viene memorizzato in sstable , spazio immutabile.

+0

La seconda parte ha aiutato - grazie! – user1680784