typer af gravsten
gravsten kan oprettes på en række måder, og det er afgørende, at du forstår visse faldgruber, der kan føre til implicit oprettelse af gravsten, der forbliver skjult fra programmørens synspunkt, indtil det overflader som et plausibelt problem, der påvirker din klynge. Derfor er det vigtigt at forstå de typer gravsten, der kan oprettes i Cassandra:
Cellegravsten
Indsæt udsagn kan oprette gravsten, når en bestemt celleværdi er angivet som null i forespørgslen. Dette kan ske, når databaseabstraktionslaget eller en ORM-ramme abstraherer forespørgslen med repræsentation på objektniveau, og nullværdierne sendes implicit ned i den aktuelle forespørgsel til Cassandra. Overvej for eksempel følgende CKL-forespørgsel:
INSERT INTO item_price ( store_number, item_id, price, replacements, product_code ) VALUES ( 'CA104', 'item104', 2.50, null , 'p104');
dette ville skabe en cellegravsten til kolonnen udskiftninger til posten med store_number CA104.
overvej nu følgende slet forespørgsel:
DELETE replacements FROM item_price WHERE store_number = 'CA104';
dette ville også skabe en cellegravsten til den tilsvarende post.
Rækkegravsten
en hel række markeres som en gravsten som et resultat af en sletteforespørgsel, der identificerer en række. For eksempel:
DELETE FROM item_price WHERE store_number = 'CA101' and item_id='item101' and price = 1.80;
Sstabledump ville vise en deletion_info på rækkeniveauet for klyngekolonnerne i partitionen.
,
"position" : 0
},
"rows" : ,
"deletion_info" : {
"marked_deleted" : "2020-07-05T07:26:52.233374Z",
"local_delete_time" : "2020-07-05T07:26:52Z"
},
"cells" :
}
]
}
]
et stort antal rækkegravsten kan være en indikation af en dårlig datamodel, hvor din applikation ofte sletter poster fra en tabel. I sådanne tilfælde skal du overveje at revidere din datamodel og redesigne tabeller baseret på forespørgselsmønstre og kardinaliteten.
Range gravsten
sletning af en hel række rækker ved hjælp af hvor-klausul med en partitionsnøgle og et område repræsenteret af en klyngekolonne. For eksempel:
DELETE FROM item_price WHERE store_number = 'CA101' AND item_id='item101' AND price > 2.0;
SSTabledump ville vise,
,"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 ville udskrive rækkevidde gravsten med en type range_tombstone_bound med en start og slutning af klyngetasten, der blev brugt til at betegne rækkevidden af rækker, der blev gravsten i en partition. Rækkegravsten oprettes også, når en hel samling erstattes med en INSERT-eller OPDATERINGSFORESPØRGSEL. Det anbefales altid at erstatte specifikke elementer i en samling i stedet for at erstatte hele samlingen selv.
Partition gravsten
gravsten af denne type oprettes, når en sletteforespørgsel affyres ved kun at bruge partitionstasten i hvor-klausulen. For eksempel:
DELETE FROM item_price WHERE store_number = 'CA102';
som du utvivlsomt har gættet, ville dette slette hele partitionen CA102, og sstabledump ville vise partitionen deletion_info attributten med marked_deleted tidsstempel.
,
"position" : 0,
"deletion_info" : {
"marked_deleted" : "2020-07-05T22:11:48.367057Z",
"local_delete_time" : "2020-07-05T22:11:48Z"
}
},
"rows" :
}
]
TTL gravsten
disse er gravsten, der oprettes automatisk, når time-to-live udløber for en bestemt række eller celle. De er dog markeret anderledes end normale gravsten.
følgende indsæt erklæring ville skabe en TTL gravsten efter 20 sekunder.
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 ville vise:
,
"position" : 78
},
"rows" : ,
"liveness_info" : { "tstamp" : "2020-07-05T06:47:51.458099Z", "ttl" : 20, "expires_at" : "2020-07-05T06:48:11Z", "expired" : true },
"cells" : }
]
}
]
}
]
Resume
- Cassandra behandler en sletteforespørgsel internt som en opdateringshandling, der tilføjer en markør kaldet tombstone på de data, der skal slettes.
- gravsten kan konfigureres med en udløbstid (gc_grace_seconds) og ryddes op under komprimeringsprocessen.
- sstabledump-værktøjet kan bruges til at se indholdet af en SSTable-fil i et menneskeligt læsbart format.
- undgå at skrive Null værdier til dine tabeller, da der kan oprette gravsten. Pas på, mens du foretager forespørgsler abstraheret af dit ORM-lag.
- Rækkegravsten foretrækkes frem for celle-eller rækkegravsten, da den bare gemmer rækkevidden, der sparer diskplads.
- undgå at erstatte hele elementer i en samling som sæt, liste, kort med Indsæt og opdater forespørgsler, da dette kan oprette rækkegravsten.