experiențele cu pietre funerare în Apache Cassandra
detectarea și prevenirea pietrelor funerare
pietrele funerare pot fi detectate în jurnale și prin monitorizarea unor valori specifice. Durata lor de viață este definită de setarea tabelului gc_grace_seconds.
reglați setările tabelului
- gc_grace_seconds
setarea implicită pentru gc_grace_seconds este 864000 (10 zile). Pentru noi a avut sens să scădem această valoare la 345600 (4 zile). În cazul în care decideți să schimbați perioada de grație, asigurați-vă că efectuați reparații în acel interval de timp.
puteți modifica pur și simplu valoarea pentru tabelele existente sau puteți crea un tabel nou ca acesta:
creați KEYSPACE de masă.tablename cu GC_GRACE_SECONDS = 345600;
ALTER spațiu cheie de masă.numele tablei cu GC_GRACE_SECONDS = 345600;
- TTL
după ce TTL trece intervalul de timp definit, rândurile sunt șterse și valorile sunt transformate în pietre funerare. În mod implicit rândurile/valorile nu expiră.
în timp ce ne confruntăm cu problemele legate de piatra funerară, ne-am dat seama că trebuie să creștem timpul de viață al meselor noastre. Prin faptul că această valoare este setată la 1 zi la sută, lucrările de scriere nereușite au avut ca efect ștergerea simultană a tuturor datelor dintr-un tabel. Datorită actualizărilor lipsă, fiecare rând a fost marcat cu o piatră de mormânt. Setarea valorii mai mari ne permite să reluăm lucrările în timp și să evităm crearea inutilă a unei cantități mari de pietre funerare.
- tombstone_warn_threshold
avertizarea pragului de piatră funerară este setată implicit la 1.000 și va deveni vizibilă în jurnalele dvs. în cazul în care mai mult de 1.000 de pietre funerare sunt scanate de o singură interogare.
- tombstone_failure_threshold
pragul de eșec al pietrei funerare este atins atunci când 100.000 de pietre funerare sunt scanate printr-o singură interogare. În acest caz, interogarea va fi anulată, ceea ce înseamnă că datele din tabelul afectat nu mai pot fi interogate.
aceste setări de prag pot fi modificate, dar rețineți că, dacă le măriți, poate duce la epuizarea nodurilor din memorie.
executați reparații regulate
Cassandra vine cu toleranță ridicată la erori și funcționează bine chiar dacă un nod este temporar indisponibil. Cu toate acestea, este cea mai bună practică să rulați nodetool repair după o defecțiune a nodului. Mai ales dacă doriți să evitați pierderea datelor cu orice preț.
în timpul procesului de reparare, nodul care nu a fost disponibil va primi scrierile care s-au întâmplat în timpul perioadei de nefuncționare.
este o abordare bună pentru a rula reparații în cadrul gc_grace_seconds și în mod regulat, în caz contrar s-ar putea experimenta cazuri în care datele șterse este înviat.
există câteva modalități de a rula reparațiile automat. Una dintre ele este Cassandra Reaper. Acest instrument vine cu un UI frumos, care îl face ușor pentru a programa reparații.
configurați și rulați compactarea
pentru a elimina în cele din urmă pietrele funerare și a elibera spațiu pe disc, compactarea trebuie declanșată. Există diferite tipuri de compacții. Compactarea minoră execută compactarea peste toate sstables și rulează automat în Cassandra. Elimină toate pietrele funerare care sunt mai vechi decât perioada de grație. Dacă declanșați o compactare manual peste toate sstables se numește compactare majoră. Rețineți că compactarea trebuie declanșată pentru fiecare nod individual. De asemenea, aveți opțiunea de a rula o compactare definită de utilizator doar pe un grup de sstables specificate.
compactarea datelor în C* înseamnă de obicei îmbinarea sstables într-un singur sstable nou. Când efectuați citiri pe mai multe rânduri, cu cât mai multe sstables trebuie scanate, cu atât procesul devine mai lent. Pentru a preveni acest lucru, compactarea trebuie să funcționeze în mod regulat.
pentru a porni manual compactările, puteți utiliza nodetool compact. În cazul în care nu specificați un spațiu cheie sau un tabel, compactarea va rula pe toate spațiile cheie și tabelele.
nodetool compact keyspace tablename
această comandă începe o compactare pe tabelul specificat. Ar trebui să vă dați seama ce strategie de compactare este configurată pentru tabelele dvs. și să o comparați cu strategiile alternative. Dacă doriți să aflați dacă o altă strategie satisface mai bine nevoile dvs., puteți consulta documentația DataStax.
monitorizați valorile tabelului
1. Nodetool
Nodetool este interfața liniei de comandă a Cassandrei. Este util dacă doriți să aflați mai multe despre performanța clusterelor. Puteți consulta întreaga listă de comenzi posibile furnizate de DataStax.
comenzile Nodetool trebuie executate pentru fiecare nod individual. Rulăm C * pe Kubernetes, astfel încât să putem deschide o coajă pentru Podul Cassandra care rulează după cum urmează:
kubectl exec-it cassandra-0-n recomanda bash
din acel moment putem folosi nodetool pentru a obține diverse informații despre tabelele noastre. Comanda nodetool tablestats pot fi efectuate pentru a imprima statistici pentru keyspaces individuale sau tabele:
valorile pentru ‘pietre funerare medii pe felie’ și ‘pietre funerare maxime pe felie’ vă vor spune câte pietre funerare au fost scanate pe interogare în ultimele cinci minute. Dacă vedeți că această valoare este foarte mare, poate fi necesar să rulați compactarea mai des pentru acel tabel.
2. Sstable Tools
înainte de a executa Sstable Tools Cassandra trebuie oprită. Comanda sstableutil vă va oferi o listă de fișiere sstable existente pentru un anumit tabel. Executarea sstablemetadata pe aceste fișiere, vă va oferi informații utile despre tabelul specificat, cum ar fi, de exemplu, TTL și o estimare a pietrelor funerare droppable.
3. Prometheus și Grafana
monitorizarea noastră pentru C* este stabilită cu Prometheus și Grafana. După ce am primit avertismentele privind pragul pietrelor funerare, am decis să adăugăm un panou la tabloul nostru de bord care ne oferă o idee despre comportamentul pietrei funerare pentru fiecare dintre mesele noastre.
Cassandra are o metrică de tabel numită ‘TombstoneScannedHistogram’, care prezintă histograma pietrelor funerare care au fost scanate pe interogare. Arătând percentila 99, vom vedea dacă ceva nu este în regulă.