grafstenen in Apache Cassandra

soorten grafstenen

grafstenen kunnen op een aantal manieren worden gemaakt en het is van cruciaal belang dat u bepaalde valkuilen begrijpt die kunnen leiden tot impliciete creatie van grafstenen die verborgen blijven voor het standpunt van de programmeur totdat het opduikt als een plausibel probleem dat uw cluster beïnvloedt. Daarom is het belangrijk om de soorten grafstenen te begrijpen die in Cassandra kunnen worden gemaakt:

Cell tombstones
Insert statements kunnen grafstenen maken wanneer een bepaalde celwaarde als null is ingesteld in de query. Dit kan gebeuren wanneer de database abstraction layer of een ORM framework de query abstraheert met object-level representatie en de null waarden impliciet naar beneden worden gestuurd in de eigenlijke query naar Cassandra. Bijvoorbeeld, overwegen de volgende CQL query:

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

dit zou een cel grafsteen voor de replacements kolom voor het record met store_number CA104.
overweeg nu de volgende delete query:

DELETE replacements FROM item_price WHERE store_number = 'CA104';

dit zou ook een cel grafsteen voor de bijbehorende record te creëren.

Rij grafstenen
een hele rij wordt gemarkeerd als grafsteen als gevolg van een verwijderingsquery die een Rij identificeert. Bijvoorbeeld::

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

Sstabledump zou een deletion_info tonen op het rijniveau voor de clustering kolommen binnen de partitie.

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

een groot aantal rij grafstenen kan een indicatie zijn van een slecht datamodel waarbij uw toepassing vaak records uit een tabel verwijdert. Overweeg in dergelijke gevallen uw datamodel opnieuw te bekijken en tabellen opnieuw te ontwerpen op basis van query-patronen en de kardinaliteit.

Range tombstones
het verwijderen van een hele reeks rijen met WHERE-clausule met een partitiesleutel en een bereik vertegenwoordigd door een clustering kolom. Bijvoorbeeld::

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

SSTabledump zou tonen,

,"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" }
}
}
]
}
}}

de SSTabledump zou range tombstones afdrukken met een type range_tombstone_bound met een begin en einde van de clustering sleutel gebruikt om het bereik van rijen die werden tombstoned binnen een partitie aan te geven. Range grafstenen worden ook gemaakt wanneer een hele collectie wordt vervangen door een INSERT of UPDATE query. Het is altijd aan te raden om specifieke elementen van een collectie te vervangen in plaats van de gehele collectie zelf te vervangen.

grafstenen voor partities
grafstenen van dit type worden gemaakt wanneer een delete-query wordt gestart met alleen de partitiesleutel in de WHERE-clausule. Bijvoorbeeld::

DELETE FROM item_price WHERE store_number = 'CA102';

zoals je ongetwijfeld geraden hebt, zou dit de hele partitie CA102 verwijderen en de sstabledump zou de partitie het deletion_info attribuut tonen met marked_deleted tijdstempel.

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

TTL-grafstenen
dit zijn grafstenen die automatisch worden gemaakt wanneer de tijdsduur voor een bepaalde rij of cel verstrijkt. Ze zijn echter anders gemarkeerd dan normale grafstenen.

het volgende insert statement zou na 20 seconden een TTL-grafsteen creëren.

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

de sstabledump zou tonen:

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

samenvatting

  • Cassandra behandelt een verwijderingsquery intern als een update-bewerking die een marker genaamd tombstone toevoegt aan de gegevens die moeten worden verwijderd.
  • grafstenen kunnen worden geconfigureerd met een vervaltijd (gc_grace_seconden) en worden opgeschoond tijdens het verdichtingsproces.
  • sstabledump utility kan gebruikt worden om de inhoud van een SSTable bestand in een voor mensen leesbaar formaat te bekijken.
  • vermijd het schrijven van Null-waarden naar uw tabellen, omdat er grafstenen kunnen worden gemaakt. Wees voorzichtig bij het maken van query ‘ s geabstraheerd door uw ORM-laag.
  • Range tombstones hebben de voorkeur boven cel of rij grafstenen omdat het alleen de range grenzen opslaat en schijfruimte bespaart.
  • vermijd het vervangen van volledige elementen van een verzameling zoals de set, list, map met INSERT en UPDATE queries, omdat dit bereik grafstenen kan creëren.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.