メインコンテンツまでスキップ

階層型ストレージ

古いウィンドウをカラム指向チャンクに圧縮して隣のテーブルへ移動し、SELECT はそれを自動的に 結合して読み取ります。 アプリケーションはデータが圧縮されているかどうかを知る必要はありません。

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

設定​

ポリシーはテーブル extensions マップの timeseries_tiering キーにJSON文字列として入れます。

ALTER TABLE pp.tm_tag_point WITH extensions = {
'timeseries_tiering': '{"hot_window":"2d","chunk_window":"1d","cold_window":"3650d","interval":"1h"}'
};
キー必須デフォルト値意味
hot_window必須—この年齢より若い行は触りません。chunk_window 以上である必要があります
chunk_window1h再エンコードウィンドウの長さ。チャンク1つ = タグ1つ × ウィンドウ1つ
cold_windowなしこれより古いチャンクは丸ごと削除。hot_window より大きい必要があります
consistencyLOCAL_QUORUM再エンコーダーが使用する CL。クォーラム系のみ許可
interval5mこのテーブルの再エンコード周期

期間の文法は <양의 정수><m|h|d> です。不明なキーやルール違反 (hot_window < chunk_window、cold_window <= hot_window、クォーラム未満のCLなど)は ALTER TABLE 時点で拒否されます — 静かに無視されることはありません。

コーデックは選べません

カラムタイプがエンコーディングを決定します。double はALP/ALP-RD ただ一つで、値が全く変化しない カラムは CONSTANT 、全て null のカラムは ALL_NULL として行数に関係なく O(1) で処理されます。 ポリシー JSON に codec キーを入れると、そのキーを特定して拒否します。

解除​

ALTER TABLE pp.tm_tag_point WITH extensions = {};

新しいエンコーディングが停止するだけで、既にチャンクに入ったデータは引き続きマージされて見えます。

運用​

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

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

同じ内容を CQL でも確認します。

SELECT * FROM system_views.timeseries_tiering;
tags_skipped が 0 でない場合は、階層化が不完全です

最後の完了サイクルが cutoff まで全てをエンコードできなかったことを意味します — 他のカウンターが示唆する ほど圧縮されていません。retier は、スキップされたタグが一つでもあれば0 以外の終了コードで 失敗します。元の行には手を加えていないため、データ損失はありません。ログで原因を確認し、再実行してください。

統計はノードローカル・インメモリで、最後の完了実行に基づきます — 再起動すると初期化されます。 複数ノードでは、各ノードが自身のプライマリトークンレンジのタグのみを再エンコードして作業を分担します。

注意点​

  • コールドデータは不変です。 チャンクに入った区間に対する削除は拒否されます。
  • 遅延行はカラム単位でマージされます。
  • 🔴 パーティションキーなしの全スキャン集計は、階層化テーブルで誤った値を返します。 そのパスはチャンクをマージしません。そのようなクエリは Spark SQL に送ってください。
  • ペイロードフォーマットはv4 のみです。削除された古いフォーマットに遭遇すると、SELECT は静かにスキップせず 失敗します — 過去データだけが欠けた結果を返し続けるよりはましだからです。

関連項目​