pietre funerare în Apache Cassandra

tipuri de pietre funerare

pietrele funerare pot fi create în mai multe moduri și este crucial să înțelegeți anumite capcane care pot duce la crearea implicită a pietrelor funerare care vor rămâne ascunse din punctul de vedere al programatorului până când apar ca o problemă plauzibilă care afectează clusterul dvs. Prin urmare, este important să înțelegeți tipurile de pietre funerare care pot fi create în Cassandra:

pietre funerare de celule
Inserare instrucțiuni pot crea pietre funerare atunci când o anumită valoare de celulă este setată ca nulă în interogare. Acest lucru se poate întâmpla atunci când stratul de abstractizare a bazei de date sau un cadru ORM abstractizează interogarea cu reprezentare la nivel de obiect și valorile nule sunt trimise implicit în interogarea reală către Cassandra. De exemplu, luați în considerare următoarea interogare CQL:

INSERT INTO item_price ( store_number, item_id, price, replacements, product_code ) VALUES ( 'CA104', 'item104', 2.50, null , 'p104');

acest lucru ar crea o piatră funerară celulă pentru coloana înlocuiri pentru înregistrarea cu store_number ca104.
acum luați în considerare următoarea interogare de ștergere:

DELETE replacements FROM item_price WHERE store_number = 'CA104';

acest lucru ar crea, de asemenea, o piatră funerară a celulei pentru înregistrarea corespunzătoare.

Row tombstones
un rând întreg este marcat ca o piatră funerară ca urmare a unei interogări de ștergere care identifică un rând. De exemplu:

DELETE FROM item_price WHERE store_number = 'CA101' and item_id='item101' and price = 1.80;

Sstabledump ar arăta un deletion_info la nivelul rândului pentru coloanele de grupare din partiție.

,
"position" : 0
},
"rows" : ,
"deletion_info" : {
"marked_deleted" : "2020-07-05T07:26:52.233374Z",
"local_delete_time" : "2020-07-05T07:26:52Z"
},
"cells" :
}
]
}
]

un număr mare de pietre funerare pe rând poate fi o indicație a unui model de date slab prin care aplicația dvs. șterge frecvent înregistrările dintr-un tabel. În astfel de cazuri, luați în considerare revizuirea modelului de date și reproiectarea tabelelor pe baza modelelor de interogare și a cardinalității.

range tombstones
ștergerea unui întreg interval de rânduri folosind clauza WHERE cu o cheie de partiție și un interval reprezentat de o coloană de grupare. De exemplu:

DELETE FROM item_price WHERE store_number = 'CA101' AND item_id='item101' AND price > 2.0;

SSTabledump ar arăta,

,"position" : 0
},
"rows" : ,
"deletion_info" : { "marked_deleted" : "2020-07-05T06:53:50.671654Z", "local_delete_time" : "2020-07-05T06:53:50Z" }
}
},
{
"type" : "range_tombstone_bound",
"end" : {
"type" : "inclusive",
"clustering" : ,
"deletion_info" : { "marked_deleted" : "2020-07-05T06:53:50.671654Z", "local_delete_time" : "2020-07-05T06:53:50Z" }
}
}
]
}
}}

Sstabledump ar imprima gama de pietre funerare cu un tip de range_tombstone_bound cu un început și sfârșit al tastei de grupare utilizate pentru a desemna gama de rânduri care au fost tombstoned într-o partiție. Gama de pietre funerare sunt, de asemenea, create atunci când o întreagă colecție este înlocuită cu o interogare de inserare sau actualizare. Se recomandă întotdeauna înlocuirea elementelor specifice ale unei colecții, mai degrabă decât înlocuirea întregii colecții în sine.

pietrele funerare de partiție
pietrele funerare de acest tip sunt create atunci când o interogare de ștergere este declanșată folosind doar cheia de partiție din clauza WHERE. De exemplu:

DELETE FROM item_price WHERE store_number = 'CA102';

după cum ați ghicit, fără îndoială, acest lucru ar șterge întreaga partiție ca102 și sstabledump ar arăta partiția atributul deletion_info cu marked_deleted timestamp.

,
"position" : 0,
"deletion_info" : {
"marked_deleted" : "2020-07-05T22:11:48.367057Z",
"local_delete_time" : "2020-07-05T22:11:48Z"
}
},
"rows" :
}
]

TTL tombstones
acestea sunt pietre funerare create automat atunci când timpul de a trăi expiră pentru un anumit rând sau celulă. Cu toate acestea, ele sunt marcate diferit de pietrele funerare normale.

următoarea instrucțiune Inserare ar crea o piatră funerară TTL după 20 de secunde.

INSERT INTO item_price ( store_number, item_id, price, replacements, product_code) VALUES ( 'CA103', 'item103', 3.0, {'item101-r', 'item101'}, 'p103') using TTL 20;

sstabledump ar arăta:

,
"position" : 78
},
"rows" : ,
"liveness_info" : { "tstamp" : "2020-07-05T06:47:51.458099Z", "ttl" : 20, "expires_at" : "2020-07-05T06:48:11Z", "expired" : true },
"cells" : }
]
}
]
}
]

rezumat

  • Cassandra tratează intern o interogare de ștergere ca o operație de actualizare care adaugă un marker numit tombstone pe datele care trebuie șterse.
  • pietrele funerare pot fi configurate cu un timp de expirare (gc_grace_seconds) și sunt curățate în timpul procesului de compactare.
  • utilitarul sstabledump poate fi utilizat pentru a vizualiza conținutul unui fișier SSTable într-un format care poate fi citit de om.
  • evitați scrierea valorilor nule în tabelele dvs., deoarece se pot crea pietre funerare. Aveți grijă în timp ce faceți interogări abstractizate de stratul ORM.
  • gama de pietre funerare sunt preferate peste celule sau rând pietre funerare, deoarece stochează doar limitele gama de economisire spațiu pe disc.
  • evitați înlocuirea elementelor întregi ale unei colecții, cum ar fi set, listă, hartă cu interogări de inserare și actualizare, deoarece aceasta poate crea pietre funerare de gamă.

Lasă un răspuns

Adresa ta de email nu va fi publicată.