階層型ストレージ
古いウィンドウをカラム指向チャンクに圧縮して隣のテーブルへ移動し、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_window | 1h | 再エンコードウィンドウの長さ。チャンク1つ = タグ1つ × ウィンドウ1つ | |
cold_window | なし | これより古いチャンクは丸ごと削除。hot_window より大きい必要があります | |
consistency | LOCAL_QUORUM | 再エンコーダーが使用する CL。クォーラム系のみ許可 | |
interval | 5m | このテーブルの再エンコード周期 |
期間の文法は <양의 정수><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は静かにスキップせず 失敗します — 過去データだけが欠けた結果を返し続けるよりはましだからです。
関連項目
- 時系列コンパクション (TSCS)
- 時系列関数 — 圧縮された区間でもそのまま動作します