Grabsteine in Apache Cassandra

Arten von Grabsteinen

Grabsteine können auf verschiedene Arten erstellt werden, und es ist wichtig, dass Sie bestimmte Fallstricke verstehen, die zur impliziten Erstellung von Grabsteinen führen können, die aus Sicht des Programmierers verborgen bleiben, bis sie als plausibles Problem auftauchen, das Ihren Cluster betrifft. Daher ist es wichtig, die Arten von Tombstones zu verstehen, die in Cassandra erstellt werden können:

Cell tombstones
Insert-Anweisungen können Tombstones erstellen, wenn ein bestimmter Zellenwert in der Abfrage auf null gesetzt ist. Dies kann passieren, wenn die Datenbankabstraktionsschicht oder ein ORM-Framework die Abfrage mit einer Darstellung auf Objektebene abstrahiert und die Nullwerte implizit in der tatsächlichen Abfrage an Cassandra gesendet werden. Betrachten Sie beispielsweise die folgende CQL-Abfrage:

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

Dies würde einen Zellengrabstein für die Ersetzungsspalte für den Datensatz mit store_number CA104 erstellen.
Betrachten Sie nun die folgende Löschabfrage:

DELETE replacements FROM item_price WHERE store_number = 'CA104';

Dies würde auch einen Zellengrabstein für den entsprechenden Datensatz erstellen.

Row tombstones
Eine ganze Zeile wird als Ergebnis einer Löschabfrage, die eine Zeile identifiziert, als Tombstone markiert. Zum Beispiel:

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

Sstabledump würde eine deletion_info auf Zeilenebene für die Clusterspalten innerhalb der Partition anzeigen.

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

Eine große Anzahl von Zeilengrabsteinen kann ein Hinweis auf ein schlechtes Datenmodell sein, bei dem Ihre Anwendung häufig Datensätze aus einer Tabelle löscht. Erwägen Sie in solchen Fällen, Ihr Datenmodell erneut zu überprüfen und Tabellen basierend auf Abfragemustern und der Kardinalität neu zu gestalten.

Range tombstones
Löschen eines gesamten Zeilenbereichs mithilfe der WHERE-Klausel mit einem Partitionsschlüssel und einem Bereich, der durch eine Clusterspalte dargestellt wird. Zum Beispiel:

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

SSTabledump würde zeigen,

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

Der SSTabledump würde Range-Tombstones mit einem Typ von range_tombstone_bound mit einem Anfang und einem Ende des Clusterschlüssels drucken, der verwendet wird, um den Bereich von Zeilen zu bezeichnen, die innerhalb einer Partition tombstoned wurden. Bereichsgrabsteine werden auch erstellt, wenn eine gesamte Sammlung durch eine INSERT- oder UPDATE-Abfrage ersetzt wird. Es wird immer empfohlen, bestimmte Elemente einer Sammlung zu ersetzen, anstatt die gesamte Sammlung selbst zu ersetzen.

Partitions-Tombstones
Tombstones dieses Typs werden erstellt, wenn eine delete-Abfrage nur mit dem Partitionsschlüssel in der WHERE-Klausel ausgelöst wird. Zum Beispiel:

DELETE FROM item_price WHERE store_number = 'CA102';

Wie Sie zweifellos vermutet haben, würde dies die gesamte Partition CA102 löschen und der sstabledump würde der Partition das deletion_info Attribut mit marked_deleted Zeitstempel anzeigen.

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

TTL-Grabsteine
Dies sind Grabsteine, die automatisch erstellt werden, wenn die Time-to-Live für eine bestimmte Zeile oder Zelle abläuft. Sie sind jedoch anders gekennzeichnet als normale Grabsteine.

Die folgende insert-Anweisung würde nach 20 Sekunden einen TTL-Tombstone erstellen.

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

Der sstabledump würde zeigen:

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

Zusammenfassung

  • Cassandra behandelt eine Löschabfrage intern als Aktualisierungsvorgang, der den zu löschenden Daten eine Markierung namens Tombstone hinzufügt.
  • Grabsteine können mit einer Ablaufzeit (gc_grace_seconds) konfiguriert werden und werden während des Verdichtungsvorgangs bereinigt.
  • Das Dienstprogramm sstabledump kann verwendet werden, um den Inhalt einer SSTable-Datei in einem für Menschen lesbaren Format anzuzeigen.
  • Vermeiden Sie es, Nullwerte in Ihre Tabellen zu schreiben, da dort Grabsteine entstehen können. Seien Sie vorsichtig, wenn Sie Abfragen von Ihrer ORM-Ebene abstrahieren.
  • Bereichsgrabsteine werden gegenüber Zellen- oder Zeilengrabsteinen bevorzugt, da nur die Bereichsgrenzen gespeichert werden, um Speicherplatz zu sparen.
  • Vermeiden Sie es, ganze Elemente einer Sammlung wie set, list , map durch INSERT- und UPDATE-Abfragen zu ersetzen, da dies zu Bereichsgrabsteinen führen kann.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.