Hologres V1.3.37 以降は、ホットデータとコールドデータに対応する階層型ストレージをサポートしており、データ階層を効果的に管理するのに役立ちます。このトピックでは、階層型ストレージの使用方法について説明します。
機能紹介
Hologres は、次の2つのストレージタイプを提供しています。標準と低頻度アクセス。
標準ストレージは、オールSSDホットストレージを使用します。これは Hologres のデフォルトのストレージタイプであり、低レイテンシ、高性能なデータアクセス要件を満たします。ほとんどのシナリオにおいて、標準ストレージは最も効果的で費用対効果の高いオプションです。このドキュメントでは、これを ホットストレージ と呼びます。
低頻度アクセスストレージは、オールHDDコールドストレージを使用します。これは、アクセス頻度の低いデータに対する低コストのストレージニーズを満たし、レイテンシの影響を受けにくい、またはめったにアクセスされない非常に大規模なデータセットに適しています。このドキュメントでは、これを コールドストレージ と呼びます。
プライマリ/セカンダリインスタンスの場合、コールドストレージを有効にするには、Hologres V1.3.55 以降にアップグレードしてください。
Hologres はテーブルレベルの階層型ストレージもサポートしています。「CREATE PARTITION TABLE」機能を使用して、パーティション子テーブルの記憶媒体を動的に設定できます。
Hologres V2.1 以降では、コールドストレージのアクセス速度を向上させるために、SSDベースのキャッシュアクセラレーションがサポートされています。現在サポートされているのは、デフォルトで割り当てられたキャッシュスペースのみです。キャッシュアクセラレーションはデフォルトで有効になっており、アクセスパフォーマンスを2倍以上に向上させます。
前提条件
Hologres V1.3.37 以降のみが階層型ホットストレージとコールドストレージをサポートしています。ご利用のインスタンスが以前のバージョンを実行している場合は、「Common upgrade preparation failure errors」ガイドを使用するか、Hologres DingTalk グループに参加してフィードバックを提供してください。詳細については、「オンラインサポートをさらに利用する方法」をご参照ください。
以前のバージョンを実行しているサブスクリプションインスタンスの場合、Hologres V1.3.37 にアップグレードすると、低頻度アクセスストレージクォータはデフォルトで0 GBになります。
注意事項
Hologres のテーブルストレージは、データとメタで構成されます。データはユーザーデータを保存し、メタはテーブルメタデータを保存します。階層型ストレージでは、データの部分にのみ記憶媒体を設定できます。パフォーマンス上の理由から、メタは常にホットストレージに保存されます。したがって、テーブルのストレージポリシーをコールドストレージに設定した場合でも、少量のホットストレージを消費し、わずかなホットストレージ料金が発生します。
サービスへの影響を避けるため、ホットからコールドへのデータ移行タスクは低優先度で実行されます。テーブルのデータストレージポリシーを変更しても、その変更はすぐに有効になりません。Hologres はバックグラウンドで非同期にデータ移行を実行します。デフォルトでは、移行は深夜に開始されます。Hologres V2.2 以降では、移行時間をカスタマイズできます。詳細については、「動的パーティション管理」をご参照ください。
コールドストレージテーブルに新しいデータを書き込む際、データは最初にホットストレージに書き込まれます。バックグラウンドタスクが非同期にコールドストレージに移行するため、いくらかのホットストレージ料金が発生します。
ディスクシーク時間の制限により、Flink ディメンションテーブルやサービングシナリオなどのポイントクエリシナリオにはコールドストレージテーブルを使用しないでください。コールドストレージテーブルは、ホットストレージテーブルよりも2桁低い読み取りスループットをサポートします。
行指向テーブルをコールドストレージを使用するように設定しないでください。
バッチホットからコールドへのデータ変換中、すべてのテーブル
tabletが開かれ、メモリ使用量が増加します。一度に200テーブルを超えて変換しないでください。
階層型ストレージテーブルの作成
テーブルを作成する際、SET_TABLE_PROPERTY で storage_mode パラメーターを設定して、データストレージポリシーを指定します。詳細については、「CREATE TABLE」をご参照ください。
非パーティションテーブル
非パーティションテーブルのストレージポリシー設定
非パーティションテーブルの場合、SET_TABLE_PROPERTY を使用してストレージポリシーを設定します。サポートされているオプションは次のとおりです。
hot (ホットストレージ)。
cold (コールドストレージ)。
例えば、tbl1をコールドストレージを使用するように設定するには、次のコードを実行します。
-- Specify cold storage when creating the table
BEGIN;
CREATE TABLE tbl1 (
"id" INT NOT NULL,
"name" TEXT NOT NULL
);
CALL set_table_property('tbl1', 'storage_mode', 'cold');
COMMIT;非パーティションテーブルの記憶媒体変更
Hologres はテーブル作成後に記憶媒体を変更することをサポートしています。例えば、tbl1をホットストレージに変更すると、システムはデータをホットストレージに非同期に移行します。例:
-- Change storage medium to hot storage after table creation
CALL set_table_property('tbl1', 'storage_mode', 'hot');パーティションテーブル
パーティションテーブルのストレージポリシー設定
パーティションテーブルも SET_TABLE_PROPERTY を使用してストレージポリシーを設定します。子パーティションはデフォルトで親テーブルのストレージプロパティを継承しますが、個別に設定することもできます。サポートされているオプションは次のとおりです。
hot (ホットストレージ)。
cold (コールドストレージ)。
例えば、親パーティションテーブル (tbl2) をコールドストレージに設定すると、すべての子パーティション (tbl2_v1など) がコールドストレージを使用するようになります。コード:
-- Specify cold storage when creating the table
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 をホットストレージに変更すると、すべての子パーティションがホットストレージに非同期に移行されます。例:
-- Change storage policy to hot storage after table creation
CALL set_table_property('tbl2', 'storage_mode', 'hot');特定のパーティションをコールドストレージに設定するには、そのパーティションの storage_mode プロパティを変更します。システムは直ちにそのパーティションをコールドストレージに移行し始めます。例:
-- Create multiple child partitions
CREATE TABLE tbl2_v2 PARTITION OF tbl2 FOR VALUES IN ('v2');
CREATE TABLE tbl2_v3 PARTITION OF tbl2 FOR VALUES IN ('v3');
-- Query table properties; they currently inherit the parent's hot storage setting
SELECT * FROM hg_table_storage_status('public', 'tbl2');
-- Change a child partition to cold storage
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 | ステータス:
|
例:
-- Non-partitioned table
SELECT * FROM hg_table_storage_status('public', 'tbl1');-- returns size in bytes
table_name | hot_size | cold_size | status
------------+----------+---------------+--------
tbl1 | 145643 | 3685 | transferring
-- Parent partition table
SELECT * FROM hg_table_storage_status('public', 'tbl2');-- returns size in bytes
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.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;