Tipi di lapidi
Le lapidi possono essere create in diversi modi ed è fondamentale comprendere alcune insidie che possono portare alla creazione implicita di lapidi che rimarranno nascoste dal punto di vista del programmatore fino a quando non emergeranno come un problema plausibile che riguarda il tuo cluster. Pertanto, è importante comprendere i tipi di lapidi che possono essere creati in Cassandra:
Lapidi di celle
Le istruzioni Insert possono creare lapidi quando un determinato valore di cella è impostato come null nella query. Ciò può accadere quando il livello di astrazione del database o un framework ORM astrae la query con una rappresentazione a livello di oggetto e i valori null vengono inviati implicitamente nella query effettiva a Cassandra. Ad esempio, si consideri la seguente query CQL:
INSERT INTO item_price ( store_number, item_id, price, replacements, product_code ) VALUES ( 'CA104', 'item104', 2.50, null , 'p104');
Ciò creerebbe una lapide di cella per la colonna sostituzioni per il record con store_number CA104.
Considera ora la seguente query di eliminazione:
DELETE replacements FROM item_price WHERE store_number = 'CA104';
Ciò creerebbe anche una lapide di cella per il record corrispondente.
Lapidi di riga
Un’intera riga viene contrassegnata come lapide come risultato di una query di eliminazione che identifica una riga. Ad esempio:
DELETE FROM item_price WHERE store_number = 'CA101' and item_id='item101' and price = 1.80;
Sstabledump mostrerebbe un deletion_info a livello di riga per le colonne di clustering all’interno della partizione.
,
"position" : 0
},
"rows" : ,
"deletion_info" : {
"marked_deleted" : "2020-07-05T07:26:52.233374Z",
"local_delete_time" : "2020-07-05T07:26:52Z"
},
"cells" :
}
]
}
]
Un numero elevato di lapidi di righe può essere un’indicazione di un modello di dati scadente per cui l’applicazione elimina frequentemente i record da una tabella. In questi casi, prendere in considerazione la rivisitazione del modello di dati e la riprogettazione delle tabelle in base ai modelli di query e alla cardinalità.
Range tombstones
Eliminazione di un intero intervallo di righe utilizzando la clausola WHERE con una chiave di partizione e un intervallo rappresentato da una colonna di clustering. Per esempio:
DELETE FROM item_price WHERE store_number = 'CA101' AND item_id='item101' AND price > 2.0;
SSTabledump mostrerebbe,
,"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 stamperebbe le lapidi dell’intervallo con un tipo di range_tombstone_bound con inizio e fine della chiave di clustering utilizzata per indicare l’intervallo di righe che sono state tombstonate all’interno di una partizione. Le lapidi dell’intervallo vengono create anche quando un’intera raccolta viene sostituita con una query di INSERIMENTO o AGGIORNAMENTO. Si consiglia sempre di sostituire elementi specifici di una collezione piuttosto che sostituire l’intera collezione stessa.
Lapidi di partizione
Le lapidi di questo tipo vengono create quando viene attivata una query di eliminazione utilizzando solo la chiave di partizione nella clausola WHERE. Ad esempio:
DELETE FROM item_price WHERE store_number = 'CA102';
Come hai indubbiamente intuito, questo eliminerebbe l’intera partizione CA102 e sstabledump mostrerebbe alla partizione l’attributo deletion_info con timestamp marked_deleted.
,
"position" : 0,
"deletion_info" : {
"marked_deleted" : "2020-07-05T22:11:48.367057Z",
"local_delete_time" : "2020-07-05T22:11:48Z"
}
},
"rows" :
}
]
Lapidi TTL
Si tratta di lapidi create automaticamente alla scadenza del time-to-live per una particolare riga o cella. Tuttavia, sono contrassegnati in modo diverso rispetto alle normali lapidi.
La seguente istruzione insert creerebbe una lapide TTL dopo 20 secondi.
INSERT INTO item_price ( store_number, item_id, price, replacements, product_code) VALUES ( 'CA103', 'item103', 3.0, {'item101-r', 'item101'}, 'p103') using TTL 20;
Il sstabledump mostrerebbe:
,
"position" : 78
},
"rows" : ,
"liveness_info" : { "tstamp" : "2020-07-05T06:47:51.458099Z", "ttl" : 20, "expires_at" : "2020-07-05T06:48:11Z", "expired" : true },
"cells" : }
]
}
]
}
]
Sommario
- Cassandra tratta internamente una query di eliminazione come un’operazione di aggiornamento che aggiunge un marcatore chiamato tombstone sui dati da eliminare.
- Le lapidi possono essere configurate con un tempo di scadenza (gc_grace_seconds) e vengono ripulite durante il processo di compattazione.
- l’utilità sstabledump può essere utilizzata per visualizzare il contenuto di un file SSTable in un formato leggibile dall’uomo.
- Evita di scrivere valori Null nelle tue tabelle, poiché è possibile creare lapidi. Fare attenzione mentre si effettuano query astratte dal livello ORM.
- Le lapidi di intervallo sono preferite rispetto alle lapidi di cella o riga in quanto memorizzano solo i limiti dell’intervallo risparmiando spazio su disco.
- Evita di sostituire interi elementi di una raccolta come set, list, map con query di INSERIMENTO e AGGIORNAMENTO in quanto ciò può creare lapidi di intervallo.