Hologres V1.3.37 以降では、ホットデータとコールドデータの階層型ストレージがサポートされており、お客様は科学的な方法でデータを管理できます。このトピックでは、Hologres でホットデータとコールドデータの階層型ストレージを使用する方法について説明します。
ストレージタイプ
Hologres のデータストレージモードには、標準ストレージと低頻度アクセス(IA)ストレージがあります。
標準ストレージは、ソリッドステートドライブ(SSD)ホットストレージと呼ばれます。これは Hologres が使用するデフォルトのストレージモードであり、このストレージモードは低レイテンシと高パフォーマンスのデータアクセス要件を満たします。標準ストレージは、ほとんどのシナリオで最も効率的で費用対効果の高い選択肢です。
IA ストレージは、ハードディスクドライブ(HDD)コールドストレージと呼ばれます。このストレージモードは、IA データの費用対効果の高いストレージ要件を満たします。 IA ストレージは、レイテンシに影響されない、またはアクセス頻度の低い超大規模データセットに最適な選択肢です。
プライマリインスタンスとセカンダリインスタンスにデータを保存する場合は、Hologres インスタンスを V1.3.55 以降にアップグレードし、HDD コールドストレージを使用することをお勧めします。
Hologres は、テーブル内のホットデータとコールドデータの階層型ストレージもサポートしています。 Hologres の CREATE PARTITION TABLE ステートメントを使用して、子テーブルのストレージモードを設定できます。
Hologres V2.1 以降では、SSD キャッシュベースのアクセラレーションがサポートされており、コールドストレージ内のデータへのアクセスを高速化できます。現在、デフォルトのキャッシュスペース内のデータへのアクセスのみが高速化されます。キャッシュアクセラレーションはデフォルトで有効になっており、アクセス パフォーマンスは 2 倍以上向上すると予想されます。
前提条件
Hologres V1.3.37 以降のみが、ホットデータとコールドデータの階層型ストレージをサポートしています。 Hologres インスタンスのバージョンが V1.3.37 より前の場合は、Hologres コンソールで Hologres インスタンスを手動でアップグレードするか、Hologres DingTalk グループに参加してインスタンスのアップグレードを申請してください。 Hologres インスタンスを手動でアップグレードする方法の詳細については、「インスタンスのアップグレード」をご参照ください。 Hologres DingTalk グループへの参加方法の詳細については、「Hologres のオンラインサポートを受ける」をご参照ください。
サブスクリプション課金方式を使用するインスタンスの場合、インスタンスを V1.3.37 にアップグレードした後、インスタンスの IA ストレージのデフォルトクォータは 0 GB です。
使用上の注意
Hologres テーブルは、ユーザーデータとメタデータで構成されています。ホットデータとコールドデータの階層型ストレージでは、ユーザーデータのストレージモードのみを設定できます。パフォーマンスを確保するために、メタデータはホットストレージ層に保存する必要があります。テーブルのストレージモードがコールドストレージに設定されている場合でも、メタデータはホットストレージ層に保存されます。これにより、少量のホットストレージ料金が発生します。
ユーザーサービスへの影響を最小限に抑えるため、ホットデータとコールドデータの移行タスクには低い優先度が設定されています。ユーザーデータのストレージモードを変更した後、設定はすぐに有効になりません。 Hologres は、バックエンドで非同期モードでデータを移行します。デフォルトでは、移行は当日の 00:00 に開始されます。 Hologres V2.2 以降では、移行時間をカスタマイズできます。詳細については、「動的パーティショニング」をご参照ください。
テーブルのコールドストレージ層に新しいデータを書き込む場合、Hologres は最初にデータをホットストレージ層に書き込み、次にバックエンドで非同期タスクを使用してデータをコールドストレージ層に移行します。これにより、一定量のホットストレージ料金が発生します。
ディスクシーク時間の制限のため、テーブルでポイントクエリが実行される場合は、ストレージモードをコールドストレージに設定しないことをお勧めします。たとえば、Apache Flink 用 Realtime Compute の Hologres ディメンションテーブルやサービングテーブルにコールドストレージを適用しないことをお勧めします。 Hologres がコールドストレージ層から 1 秒あたりに読み取るテーブル行数は、Hologres がホットストレージ層から 1 秒あたりに読み取るテーブル行数よりも 100 倍少なくなります。
行指向テーブルのストレージモードをコールドストレージに設定しないことをお勧めします。
コードストレージ層とホットストレージ層の間でデータをバッチで移行する場合、すべてのテーブルの
tabletsが有効になります。これにより、メモリ使用量が増加します。一度に最大 200 個のテーブルでデータを移行することをお勧めします。 /* これにより、メモリ使用量が増加します。一度に最大 200 個のテーブルでデータを移行することをお勧めします。 */
テーブルのホットデータとコールドデータの階層型ストレージを設定する
テーブルを作成するときに、SET_TABLE_PROPERTY ステートメントの storage_mode パラメータを設定して、テーブルのストレージモードを指定できます。詳細については、「CREATE TABLE」をご参照ください。
非パーティションテーブル
非パーティションテーブルのストレージモードを指定する
SET_TABLE_PROPERTY ステートメントの storage_mode パラメータを設定して、非パーティションテーブルのストレージモードを指定できます。このパラメータの有効な値:
hot
cold
たとえば、tbl1 という名前のテーブルを作成し、テーブルのストレージモードをコールドストレージに設定できます。ステートメントの例:
-- テーブルを作成するときに、ストレージモードをコールドストレージとして指定します。
/* テーブルを作成するときに、ストレージモードをコールドストレージとして指定します。 */
BEGIN;
CREATE TABLE tbl1 (
"id" int NOT NULL,
"name" text NOT NULL
);
CALL set_table_property('tbl1', 'storage_mode', 'cold');
COMMIT;非パーティションテーブルのストレージモードを変更する
Hologres では、テーブルを作成した後にストレージモードを変更できます。たとえば、tbl1 テーブルのストレージモードをホットストレージに変更できます。システムはデータをホットストレージ層に非同期的に移行します。ステートメントの例:
-- テーブルを作成した後に、ストレージモードをホットストレージに変更します。
/* テーブルを作成した後に、ストレージモードをホットストレージに変更します。 */
CALL set_table_property('tbl1', 'storage_mode', 'hot');パーティションテーブル
パーティションテーブルのストレージモードを指定する
SET_TABLE_PROPERTY パラメータを指定して、パーティションテーブルのストレージモードを設定できます。子テーブルは、デフォルトで親テーブルのストレージモードを継承します。子テーブルのストレージモードを個別に指定することもできます。有効な値:
hot
cold
たとえば、tbl2 という名前の親テーブルのストレージモードをコールドストレージに設定できます。親テーブルの tbl2_v1 という名前の子テーブルにデータを書き込むと、データはコールドストレージ層に書き込まれます。ステートメントの例:
-- テーブルを作成するときに、ストレージモードをコールドストレージとして指定します。
/* テーブルを作成するときに、ストレージモードをコールドストレージとして指定します。 */
BEGIN;
CREATE TABLE tbl2(
c1 text NOT NULL,
c2 text
)
PARTITION BY LIST(c2);
CALL set_table_property('tbl2', 'storage_mode', 'cold');
CREATE TABLE tbl2_v1 PARTITION OF tbl2 FOR VALUES IN ('v1');
COMMIT;パーティションテーブルのストレージモードを変更する
Hologres では、テーブルを作成した後にストレージモードを変更できます。たとえば、tbl2 親テーブルのストレージモードをホットストレージに変更できます。システムは、この親テーブルのすべての子テーブルのデータをホットストレージ層に非同期的に移行します。ステートメントの例:
-- テーブルを作成した後に、ストレージモードをホットストレージに変更します。
/* テーブルを作成した後に、ストレージモードをホットストレージに変更します。 */
CALL set_table_property('tbl2', 'storage_mode', 'hot');たとえば、子テーブルの storage_mode パラメータを cold に設定することで、子テーブルのストレージモードをコールドストレージに変更できます。ステートメントの例:
-- tbl2 親テーブルに tbl2_v2 と tbl2_v3 という名前の子テーブルを作成します。
/* tbl2 親テーブルに tbl2_v2 と tbl2_v3 という名前の子テーブルを作成します。 */
CREATE TABLE tbl2_v2 PARTITION OF tbl2 FOR VALUES IN ('v2');
CREATE TABLE tbl2_v3 PARTITION OF tbl2 FOR VALUES IN ('v3');
-- 子テーブルのストレージモードをクエリします。子テーブルは、デフォルトで親テーブルのストレージモードを継承します。
/* 子テーブルのストレージモードをクエリします。子テーブルは、デフォルトで親テーブルのストレージモードを継承します。 */
SELECT * FROM hg_table_storage_status('public', 'tbl2');
-- tbl2_v3 子テーブルのストレージモードをコールドストレージに変更します。
/* tbl2_v3 子テーブルのストレージモードをコールドストレージに変更します。 */
CALL set_table_property('tbl2_v3', 'storage_mode', 'cold');
パーティションテーブルを動的に管理する
動的パーティショニング機能を使用して、ホットストレージ層とコールドストレージ層の間でデータを移行するルールを設定できます。これにより、コストとクエリ パフォーマンスのバランスをとるために、ホットデータとコールドデータの階層型ストレージをインテリジェントな方法で実装できます。動的パーティショニングの詳細については、「動的パーティショニング」をご参照ください。
テーブル内のデータのストレージ状態をクエリする
hg_table_storage_status 関数を呼び出して、テーブル内のデータのストレージ状態をクエリできます。 hg_table_storage_status 関数の戻り値には、メタデータのストレージサイズではなく、ユーザーデータのストレージサイズが含まれます。ステートメントの例:
SELECT * FROM hg_table_storage_status('<schema_name>', '<table_name>');パラメータ | 説明 |
| テーブルが属するスキーマの名前。 |
| テーブルの名前。 |
次の表に、関数が返す結果の列を示します。
列 | 説明 |
table_name |
|
hot_size | ホットストレージ層のデータサイズ。単位:バイト。 |
cold_size | コールドストレージ層のデータサイズ。単位:バイト。 |
status | データのストレージ状態。有効な値:
|
ステートメントの例:
-- 非パーティションテーブルのデータのストレージ状態をクエリします。
/* 非パーティションテーブルのデータのストレージ状態をクエリします。 */
SELECT * FROM hg_table_storage_status('public', 'tbl1'); -- 戻り値のデータサイズはバイト単位です。
/* 戻り値のデータサイズはバイト単位です。 */
table_name | hot_size | cold_size | status
------------+----------+---------------+--------
tbl1 | 145643 | 3685 | transferring
-- パーティションテーブルのデータのストレージ状態をクエリします。
/* パーティションテーブルのデータのストレージ状態をクエリします。 */
SELECT * FROM hg_table_storage_status('public', 'tbl2');-- 戻り値のデータサイズはバイト単位です。
/* 戻り値のデータサイズはバイト単位です。 */
table_name | hot_size | cold_size | status
-----------------+----------+-----------+--------
tbl2_2022062222 | 0 | 0 | hot
tbl2_2022062221 | 1125 | 0 | hot
tbl2_2022062220 | 1245 | 0 | hot
tbl2_2022062219 | 1358 | 0 | hot
tbl2_2022062218 | 0 | 1875 | cold
tbl2_2022062217 | 0 | 1143 | cold
tbl2_2022062216 | 0 | 1299 | coldテーブルデータのアクセス頻度をクエリする
Hologres V1.3.37 以降では、Hologres インスタンス内のテーブルの統計情報を毎日収集し、hologres.hg_table_info という名前のシステムテーブルに保存します。これにより、テーブルの統計情報をクエリおよび分析し、統計分析の結果に基づいて最適化対策を講じることができます。詳細については、「テーブル統計のクエリと分析」をご参照ください。このシステムテーブルをクエリして、テーブルに保存されているホットデータとコールドデータの量、テーブルデータのアクセス頻度、パーティションデータのアクセス頻度などの情報を取得できます。次に、取得した情報に基づいて、ホットデータとコールドデータを移行するかどうかを決定できます。次のサンプルコードは、このシステムテーブルを使用してインスタンス内のテーブルの統計情報をクエリする方法の例を示しています。
非パーティションテーブル
SELECT a.table_name,
(a.total_read_count - b.total_read_count) AS read_count,
(a.total_write_count - b.total_write_count) AS write_count,
a.hot_storage_size
FROM (SELECT * FROM hologres.hg_table_info
WHERE type='TABLE' AND collect_time::DATE = CURRENT_DATE - interval '1 day') a
JOIN
(SELECT * FROM hologres.hg_table_info
WHERE type='TABLE' AND collect_time::DATE = CURRENT_DATE - interval '${days} day') b
ON a.table_name = b.table_name
ORDER BY hot_storage_size DESC;パーティションテーブル
すべてのパーティションのアクセス頻度をクエリします。
SELECT parent_table_name,count(*) AS partition_cnt,
sum(hot_storage_size)/1024/1024/1024 AS hot_size_gb
FROM hologres.hg_table_info
WHERE type = 'PARTITION' AND collect_time::DATE = CURRENT_DATE - interval '1 day'
GROUP BY parent_table_name
ORDER BY hot_size_gb DESC;指定されたパーティションのアクセス頻度をクエリします。
SELECT a.table_name,
(a.total_read_count - b.total_read_count) as read_count,
(a.total_write_count - b.total_write_count) as write_count,
a.hot_storage_size
FROM (SELECT * FROM hologres.hg_table_info
WHERE type = 'PARTITION'
AND parent_table_name = '${p_table_name}'
AND collect_time::DATE = CURRENT_DATE - interval '1 day') a
JOIN
(SELECT * FROM hologres.hg_table_info
WHERE type = 'PARTITION'
AND parent_table_name = '${p_table_name}'
AND collect_time::DATE = CURRENT_DATE - interval '${days} day') b
ON a.table_name = b.table_name
ORDER BY table_name DESC;