Zum Hauptinhalt springen

Hierarchische Speicherung

Alte Datenfenster werden als spaltenorientierte Chunks komprimiert und in eine Nebentabelle verschoben, die SELECT liest sie dann automatisch zusammen. Die Anwendung muss nicht wissen, ob die Daten komprimiert sind.

쓰기 ──▶ [ 핫 구간 ] ── hot_window 경과 ──▶ [ 콜드 청크 ] ── cold_window 경과 ──▶ 삭제
행 저장 <테이블>__chunks
◀────── SELECT 이 알아서 합친다 ──────▶

Konfiguration​

Die Richtlinie wird als JSON-String unter dem Schlüssel timeseries_tiering in der extensions-Tabelle eingetragen.

ALTER TABLE pp.tm_tag_point WITH extensions = {
'timeseries_tiering': '{"hot_window":"2d","chunk_window":"1d","cold_window":"3650d","interval":"1h"}'
};
SchlüsselErforderlichStandardwertBedeutung
hot_windowErforderlich—Zeilen, die jünger als dieses Alter sind, werden nicht angefasst. Muss chunk_window oder größer sein
chunk_window1hLänge des Re-Encoding-Fensters. 1 Chunk = 1 Tag × 1 Fenster
cold_windowKeineChunks, die älter als dieses Alter sind, werden vollständig gelöscht. Muss größer als hot_window sein
consistencyLOCAL_QUORUMVerwendetes CL für den Re-Encoder. Nur Quorum-Typen erlaubt
interval5mRe-Encoding-Intervall für diese Tabelle

Die Syntax für Zeiträume ist <양의 정수><m|h|d>. Unbekannte Schlüssel oder Richtlinienverstöße (hot_window < chunk_window, cold_window <= hot_window, CL unter Quorum usw.) werden zum Zeitpunkt ALTER TABLE abgelehnt – nicht stillschweigend ignoriert.

Bei Codecs gibt es keine Auswahl

Der Spaltentyp bestimmt die Kodierung. double ist nur ALP/ALP-RD, Spalten, deren Werte sich gar nicht ändern, werden als CONSTANT behandelt, und Spalten, die vollständig null sind, werden als ALL_NULL mit O(1) unabhängig von der Zeilenzahl verarbeitet. Wenn der Schlüssel codec im Richtlinien-JSON enthalten ist, wird dieser Schlüssel gezielt abgelehnt.

Freigabe​

ALTER TABLE pp.tm_tag_point WITH extensions = {};

Nur die neue Kodierung stoppt; Daten, die bereits in Chunks geschrieben wurden, werden weiterhin zusammengeführt angezeigt.

Betrieb​

# 지금 즉시 한 사이클 (interval 무시)
nodetool retier <keyspace> <table>

# 정책이 걸린 모든 테이블의 상태
nodetool tieringstatus

Dasselbe wird auch in CQL angezeigt.

SELECT * FROM system_views.timeseries_tiering;
Wenn tags_skipped nicht 0 ist, ist die Hierarchie weniger ausgeprägt

Das bedeutet, dass der letzte abgeschlossene Zyklus nicht bis zum Cutoff kodiert hat – die Daten sind nicht so komprimiert, wie es die anderen Zähler nahelegen. retier schlägt fehl, wenn auch nur ein Tag übersprungen wurde, mit einem Exit-Code ungleich 0. Die ursprünglichen Zeilen wurden nicht verändert, es gibt also keinen Datenverlust. Prüfen Sie die Ursache im Log und führen Sie es erneut aus.

Die Statistik ist knotenlokal · im Speicher und basiert auf dem letzten abgeschlossenen Lauf – sie wird bei einem Neustart zurückgesetzt. Bei mehreren Knoten kodiert jeder Knoten nur die Tags in seinem Primär-Token-Bereich neu, um die Arbeit aufzuteilen.

Hinweise​

  • Kaltdaten sind unveränderlich. Löschungen für bereits in Chunks geschriebene Bereiche werden abgelehnt.
  • Verspätete Zeilen werden spaltenweise zusammengeführt.
  • 🔴 Vollständige Scans-Aggregationen ohne Partitionsschlüssel liefern falsche Werte in hierarchischen Tabellen. Dieser Pfad führt Chunks nicht zusammen. Senden Sie solche Abfragen an Spark SQL.
  • Das Nutzlastformat ist nur v4. Wenn ein entferntes altes Format gefunden wird, schlägt SELECT fehl, statt es stillschweigend zu überspringen – das ist besser, als weiterhin Ergebnisse zu liefern, bei denen nur alte Daten fehlen.

Siehe auch​