LindormTable では、カスタム時間列に基づいてホットデータとコールドデータをアーカイブできます。ストレージ最適化 Lindorm インスタンスを購入した後、テーブルまたはセカンダリインデックスで時間列を指定して、ホットデータとコールドデータを分離できます。このメソッドは、異なるメディアにデータを保存することで、ホットデータのクエリ効率を向上させ、コールドデータのストレージコストを削減します。このトピックでは、カスタム時間列に基づいてホットデータとコールドデータを分離する方法と、関連する使用上の注意について説明します。
前提条件
コールドストレージ機能が有効になっています。この機能を有効にする方法の詳細については、「ストレージ最適化 Lindorm インスタンス」をご参照ください。
LindormTable のバージョンが 2.4.3 以降であること。バージョンの表示またはアップグレード方法の詳細については、「LindormTable バージョンガイド」および「マイナーバージョンの更新を実行する」をご参照ください。
Lindorm-cli を使用して LindormTable に接続していること。詳細については、「Lindorm-cli を使用して LindormTable に接続して使用する」をご参照ください。
テーブルまたはカラムファミリーのストレージプロパティ STORAGE_POLICY が
COLDに設定されていないこと。これは、コールド・ホットデータ分離を有効にするテーブルがコールドストレージテーブルであってはならないことを意味します。ストレージプロパティの変更方法の詳細については、「コールドストレージの設定」をご参照ください。
使用上の注意
この機能は Lindorm SQL でのみサポートされています。HBase 互換の操作ではサポートされていません。
行のカスタム時間列の値がホットデータに指定された境界を越えると、行全体がコールドストレージにアーカイブされます。
カスタム時間列を設定する際には、次のルールが適用されます:
カスタム時間列はプライマリキー列である必要があります。
カスタム時間列は、プライマリキーの最初の列にすることはできません。
カスタム時間列は、BIGINT および TIMESTAMP データ型のみをサポートします。指定された列が存在しない場合、列にデータが書き込まれていない場合、または列に書き込まれたデータのデータ型が正しくない場合、データを分離することはできません。これらの場合、すべてのデータはホットストレージに書き込まれます。
手順
テーブルのコールド・ホットデータ境界の設定
カスタム時間列とコールド・ホットデータ境界を設定します。
方法 1: テーブルの作成時に設定します。
dt という名前のテーブルを作成します。コールド・ホットデータ境界を 1 日に設定し、p2 列をコールド・ホットデータ分離に使用します。
-- コールド・ホットデータ境界を 1 日に設定し、p2 列をコールド・ホットデータ分離に使用します。p2 列の値の時間単位は、デフォルトでミリ秒 (ms) です。 CREATE TABLE dt (p1 integer, p2 bigint, p3 bigint, c1 varchar, constraint pk PRIMARY KEY(p1, p2, p3)) WITH(COMPRESSION = 'ZSTD', CHS ='86400', CHS_L2 = 'storagetype=COLD', CHS_COLUMN = 'COLUMN=p2'); -- コールド・ホットデータ境界を 1 日に設定し、p2 列をコールド・ホットデータ分離に使用します。p2 列の値の時間単位を秒 (s) に設定します。 CREATE TABLE dt (p1 integer, p2 bigint, p3 bigint, c1 varchar, constraint pk PRIMARY KEY(p1, p2, p3)) WITH(COMPRESSION = 'ZSTD', CHS ='86400', CHS_L2 = 'storagetype=COLD', CHS_COLUMN = 'COLUMN=p2|TIMEUNIT=SECONDS'); -- コールド・ホットデータ境界を 1 日に設定し、p2 列をコールド・ホットデータ分離に使用します。p2 列の値の時間単位を分 (min) に設定します。 CREATE TABLE dt (p1 integer, p2 bigint, p3 bigint, c1 varchar, constraint pk PRIMARY KEY(p1, p2, p3)) WITH(COMPRESSION = 'ZSTD', CHS ='86400', CHS_L2 = 'storagetype=COLD', CHS_COLUMN = 'COLUMN=p2|TIMEUNIT=MINUTES');パラメーター
パラメーター
説明
CHS
コールド・ホットデータ境界 (秒単位)。たとえば、CHS が 86400 に設定されている場合、カスタム時間列のタイムスタンプが 86,400 秒 (1 日) より古いデータは、自動的にコールドストレージにアーカイブされます。
COMPRESSION
圧縮アルゴリズム。これはテーブル全体に適用されます。アルゴリズム名では大文字と小文字は区別されません。デフォルト設定は none です。
CHS_L2
レイヤー 2 プロパティ。これは通常、ストレージタイプを指定するために設定されます:
storagetype=COLD。CHS_COLUMN
カスタム時間列。その値のデフォルト単位はミリ秒 (ms) です。その他のサポートされている時間単位には、SECONDS、MINUTES、MICROSECONDS、NANOSECONDS があります。フォーマットは
COLUMN=<custom_time_column>|TIMEUNIT=<time_unit>です。例:COLUMN=p2|TIMEUNIT=SECONDS。重要CHS_COLUMN を設定する際、等号 (=) の両側にスペースを追加しないでください。追加すると、エラーが発生します。
結果の確認
次のいずれかの方法で設定を確認できます:
SHOW VARIABLES 文を実行して、テーブルのプロパティを表示します。例:
SHOW TABLE VARIABLES FROM dt LIKE 'CHS_COLUMN';。クラスター管理システム の [概要] ページで、ターゲットデータベース内のターゲットテーブルの名前をクリックします。[現在のテーブル詳細] エリアで、CHS や CHS_COLUMN などのパラメーターの値を確認できます。
方法 2: テーブル作成時にコールド・ホットデータ分離が有効になっていなかった場合は、
ALTER TABLE文を使用して関連プロパティを追加します。-- 作成時にコールド・ホットデータ分離が有効になっていなかった既存のデータテーブルの場合、例: -- CREATE TABLE dt (p1 integer, p2 bigint, p3 bigint, c1 varchar, constraint pk primary key(p1, p2, p3)); -- dt テーブルに対してカスタム列に基づいてコールド・ホットデータ分離を有効にします。コールド・ホットデータ境界を 1 日に設定し、分離に p2 列を使用し、デフォルトの単位であるミリ秒 (ms) を使用します。 ALTER TABLE dt SET 'CHS' ='86400', 'CHS_L2' = 'storagetype=COLD', 'CHS_COLUMN' = 'COLUMN=p2'; -- dt テーブルに対してカスタム列に基づいてコールド・ホットデータ分離を有効にします。コールド・ホットデータ境界を 1 日に設定し、分離に p2 列を使用し、時間単位を秒 (s) に変更します。 ALTER TABLE dt SET 'CHS' ='86400', 'CHS_L2' = 'storagetype=COLD', 'CHS_COLUMN' = 'COLUMN=p2|TIMEUNIT=SECONDS'; -- dt テーブルに対してカスタム列に基づいてコールド・ホットデータ分離を有効にします。コールド・ホットデータ境界を 1 日に設定し、分離に p2 列を使用し、時間単位を分 (min) に変更します。 ALTER TABLE dt SET 'CHS' ='86400', 'CHS_L2' = 'storagetype=COLD', 'CHS_COLUMN' = 'COLUMN=p2|TIMEUNIT=MINUTES';結果の確認
次のいずれかの方法で設定を確認できます:
SHOW VARIABLES 文を実行して、テーブルのプロパティを表示します。例:
SHOW TABLE VARIABLES FROM dt LIKE 'CHS_COLUMN';。クラスター管理システム の [概要] ページで、ターゲットデータベース配下のターゲットテーブルの名前をクリックします。[現在のテーブル詳細] エリアで、CHS や CHS_COLUMN などのパラメーターの値を確認します。
任意: テーブルのコールド・ホットデータ境界とカスタム時間列を変更します。
コールド・ホットデータ境界を変更します。
ALTER TABLE dt SET 'CHS'='1000';カスタム時間列を変更します。
ALTER TABLE dt SET 'CHS_COLUMN'='COLUMN=p3';
任意: テーブルのコールド・ホットデータ分離をキャンセルします。
ALTER TABLE dt SET 'CHS'='', 'CHS_L2' = '', 'CHS_COLUMN'='';説明コールド・ホットデータ境界を変更したり、コールド・ホットデータ分離をキャンセルしたりした後、データがコールドストレージからホットストレージに戻される前に、システムがバックグラウンドで
compactionを実行するのを待つ必要があります。データをすぐにホットストレージに戻すには、major_compact コマンドを手動で実行できます。
セカンダリインデックスのコールド・ホットデータ境界の設定
デフォルトでは、セカンダリインデックスはテーブルに格納されます。したがって、テーブルの場合と同じ方法で、セカンダリインデックスのホットデータとコールドデータを分離できます。
次の例では、前のセクションの dt テーブルのセカンダリインデックスを作成します。
セカンダリインデックスを作成し、コールド・ホットデータ分離を有効にします。
方法 1: セカンダリインデックスの作成時にカスタム時間列とコールド・ホットデータ境界を設定します。
CREATE INDEX idx on dt (c1) WITH(CHS = '86400', CHS_L2 = 'storagetype=COLD', CHS_COLUMN='COLUMN=p2');説明セカンダリインデックスにカスタム時間列を指定することはできません。CHS_COLUMN は、ベーステーブルのカスタム時間列に設定する必要があります。
方法 2: セカンダリインデックスの作成時に設定が構成されていなかった場合は、
ALTER TABLE文を使用してカスタム時間列とコールド・ホットデータ境界を設定します。-- 作成時にコールド・ホットデータ分離が有効になっていなかった既存のセカンダリインデックスの場合、例: -- CREATE INDEX idx on dt (c1); -- セカンダリインデックステーブルのコールド・ホットデータ分離を有効にします。コールド・ホットデータ境界を 1 日に設定し、分離に p2 列を使用します。 ALTER TABLE `dt.idx` SET 'CHS' = '86400', 'CHS_L2' = 'storagetype=COLD', 'CHS_COLUMN'='COLUMN=p2';
任意: セカンダリインデックスのコールド・ホットデータ境界とカスタム時間列を変更します。
コールド・ホットデータ境界を変更します。
ALTER TABLE `dt.idx` SET 'CHS'='10000';カスタム時間列を変更します。
ALTER TABLE `dt.idx` SET 'CHS_COLUMN'='COLUMN=p2';
説明セカンダリインデックステーブルの名前は
TableName.IndexNameというフォーマットを使用します。名前には特殊文字であるピリオド (.) が含まれているため、名前をバックティック (`) で囲んでエスケープする必要があります。たとえば、テーブル名がtest.idxの場合、エスケープされた名前は`test.idx`です。任意: セカンダリインデックスのコールド・ホットデータ分離をキャンセルします。
ALTER TABLE `dt.idx` SET 'CHS'='', 'CHS_L2' = '', 'CHS_COLUMN'='';
データの書き込み
コールド・ホットデータ分離が有効になっているテーブルにデータを書き込む方法は、標準テーブルの場合と同じです。データはまずホットストレージ (Medium または Compute-optimized) に保存されます。時間の経過とともに、データの行が 現在の時間 - 時間列の値 > CHS の値 の条件を満たす場合、compaction が実行されるときにコールドストレージにアーカイブされます。
データのクエリ
ホットデータとコールドデータは同じテーブルに存在するため、すべてのクエリ操作はその単一のテーブルで実行されます。データをクエリするときに、カスタム時間列の時間範囲を指定してクエリの範囲を制限できます。システムは指定された時間範囲に基づいてクエリモードを決定し、ホットストレージエリアのみ、コールドストレージエリアのみ、またはその両方をクエリできます。クエリで時間範囲を制限しない場合、クエリがコールドデータにヒットする可能性があります。これにより、クエリスループットがコールドストレージによって制限される可能性があります。詳細については、「ストレージ最適化 Lindorm インスタンス」をご参照ください。
クエリ条件でカスタム時間列を設定できない場合は、HINT を使用して _l_hot_only_ パラメーターを設定し、ホットデータのみをクエリすることもできます。
クエリの例
ランダムクエリ (Get)
-- p2 はカスタム時間列です。 SELECT * FROM dt WHERE p1 = 10 AND p2 = 10;範囲クエリ
-- p2 はカスタム時間列です。 SELECT * FROM dt WHERE p2 > 10 AND p2 < 1000;重要デフォルトでは、LindormTable は非効率なクエリとして識別された SELECT 文を実行しません。代わりに、例外をスローします。詳細については、「SELECT」をご参照ください。
HINT を使用してホットデータのみをクエリする
SELECT /*+ _l_hot_only_(true) */ * FROM dt WHERE p1>1;
ベストプラクティス
Internet of Vehicles (IoV) シナリオでは、テーブルのプライマリキーは通常、vin (車両識別番号) とタイムスタンプ 列で構成されます。タイムスタンプ列は、コールド・ホットデータ分離のためのカスタム時間列として定義できます。特定の時間範囲内の車両のデータをクエリする場合、システムはクエリ条件に基づいて、コールドデータをクエリするか、ホットデータのみをクエリするかを判断できます。
USE test;
CREATE TABLE dt (
vin varchar, ts bigint, c1 varchar, c2 varchar, constraint pk primary key(vin, ts)) WITH
(COMPRESSION = 'ZSTD', CHS ='86400', CHS_L2 = 'storagetype=COLD', CHS_COLUMN = 'COLUMN=ts'); // 時間列はプライマリキーである必要があります。
-- 特定の時間範囲内の特定の車両のデータをクエリします。
SELECT * FROM dt WHERE vin='xxxx' AND ts > 1675065122000 AND ts < 1675975222000;よくある質問
Q: 既存のコールドデータを更新した場合、更新されたデータはコールドデータのままですか?
A: はい、更新によってカスタム時間列の値が変更されない場合、データはコールドデータのままです。ただし、更新によってカスタム時間列の値が変更された場合、データは新しい値に基づいてホットまたはコールドとして再評価されます。たとえば、テーブルにプライマリキー列 p1 と p2、および非プライマリキー列 c1 と c2 があるとします。ある行の値が p1=row1、p2=Jan-28-2023、c1="c1"、c2="c2" であるとします。コールド・ホット境界 (CHS) は 1 日で、現在の日付は Jan-30-2023 です。この行はコールドデータです。c1 と c2 の値を更新しても、この行はコールドデータのままです。p2 の値を Jan-30-2023 に更新すると、この行はホットデータになります。Feb-01-2023 になると、再びコールドデータになります。
説明プライマリキーの一部であるカスタム時間列の値を更新することはできません。
Q: 行にカスタム時間列の値がない場合、データはホットとコールドに分離されますか?
A: いいえ、分離されません。カスタム時間列は、コールド・ホットデータ分離の基礎です。行にカスタム時間列の値がない場合、その行はホットストレージに保持されます。