Hologres はバージョン V1.3.37 以降、ホットデータとコールドデータの階層型ストレージをサポートしており、データ階層の効率的な管理を支援します。本トピックでは、階層型ストレージの使用方法について説明します。
機能概要
Hologres には、標準と低頻度アクセスという 2 種類のデータストレージがあります。
-
標準ストレージは、すべて SSD を使用したホットストレージです。Hologres のデフォルトストレージタイプであり、低レイテンシかつ高パフォーマンスなデータアクセス要件を満たします。ほとんどのシナリオにおいて、標準ストレージが最も効果的でコスト効率の高い選択肢です。本ドキュメントでは、これをホットストレージと呼びます。
-
低頻度アクセスストレージは、すべて HDD を使用したコールドストレージです。アクセス頻度が低いデータ向けに低コストなストレージを提供し、レイテンシ秘密度が低く、またはアクセスがまれな非常に大規模なデータセットに適しています。本ドキュメントでは、これをコールドストレージと呼びます。
-
プライマリ・セカンダリインスタンスの場合、コールドストレージを有効にするには、バージョン V1.3.55 以降へのスペックアップを推奨します。
Hologres はテーブル単位での階層型ストレージもサポートしています。CREATE PARTITION TABLE 機能を使用して、パーティション子テーブルの記憶媒体を動的に設定できます。
Hologres はバージョン V2.1 以降、SSD ベースのキャッシュアクセラレーションをサポートしており、コールドストレージのアクセス速度を向上させます。キャッシュ領域はデフォルトで割り当てられ、キャッシュアクセラレーションもデフォルトで有効になっています。これにより、アクセスパフォーマンスは 2 倍以上向上することが期待されます。
前提条件
-
ホットデータとコールドデータの階層型ストレージは、Hologres V1.3.37 以降でのみサポートされています。ご利用のインスタンスがそれ以前のバージョンの場合、「一般的なスペックアップ準備エラー」をご参照ください。または、Hologres DingTalk グループにご参加いただき、サポートを受けてください。詳細については、「オンラインサポートをさらに利用する方法」をご参照ください。
-
古いバージョンを実行しているサブスクリプションインスタンスの場合、V1.3.37 にスペックアップ後、低頻度アクセスストレージのクォータはデフォルトで 0 GB になります。
注意事項
-
Hologres のテーブルストレージは、Data と Meta で構成されています。Data はユーザーのデータを格納し、Meta はテーブルのメタデータを格納します。階層型ストレージでは、Data 部分の記憶媒体のみを設定できます。パフォーマンス上の理由から、Meta は常にホットストレージに保存されます。そのため、テーブルのストレージポリシーをコールドストレージに設定しても、少量のホットストレージを消費し、わずかなホットストレージ料金が発生します。
-
サービスへの影響を回避するため、ホットからコールドへのデータ移行タスクは低優先度で実行されます。テーブルの Data のストレージポリシーを変更しても、すぐに反映されません。Hologres はバックグラウンドで非同期にデータ移行を実行します。デフォルトでは、移行は当日の 00:00(深夜)に開始されます。V2.2 以降では、移行時間をカスタマイズできます。詳細については、「動的パーティション管理」をご参照ください。
-
新しいデータがコールドストレージテーブルに書き込まれる際、まずホットストレージに書き込まれます。その後、バックグラウンドタスクが非同期にデータをコールドストレージへ移行するため、若干のホットストレージ料金が発生します。
-
ディスクのシーク時間の制限により、ポイントクエリシナリオ(Flink ディメンションテーブルやサービングシナリオなど)でのコールドストレージテーブルの使用は推奨しません。コールドストレージテーブルの読み取りスループットは、ホットストレージテーブルと比べて 2 桁ほど低くなります。
-
行指向テーブルをコールドストレージに設定することは推奨しません。
-
バッチによるホットからコールドへのデータ変換中は、すべてのテーブル
tabletがオープンされるため、メモリ使用量が増加します。一度に変換するテーブル数は 200 以下にすることを推奨します。
階層型ストレージテーブルの作成
テーブル作成時に、SET_TABLE_PROPERTY 内の storage_mode パラメーターを設定することで、データストレージポリシーを指定します。詳細については、「CREATE TABLE」をご参照ください。
非パーティションテーブル
非パーティションテーブルのストレージポリシーの設定
非パーティションテーブルでは、SET_TABLE_PROPERTY を使用してストレージポリシーを設定します。サポートされるオプションは以下のとおりです。
-
hot(ホットストレージ)
-
cold(コールドストレージ)
たとえば、テーブル tbl1 をコールドストレージに設定する場合は、次のコードを使用します。
-- テーブル作成時にコールドストレージを指定
BEGIN;
CREATE TABLE tbl1 (
"id" int NOT NULL,
"name" text NOT NULL
);
CALL set_table_property('tbl1', 'storage_mode', 'cold');
COMMIT;
非パーティションテーブルの記憶媒体の変更
テーブル作成後も記憶媒体を変更できます。たとえば、テーブル 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;
パーティションテーブルのストレージ変更
テーブル作成後も記憶媒体を変更できます。たとえば、親パーティションテーブル tbl2 をホットストレージに変更すると、すべての子パーティションが非同期でホットストレージへ移行されます。例:
-- テーブル作成後にストレージポリシーをホットストレージに変更
CALL set_table_property('tbl2', 'storage_mode', 'hot');
特定の子パーティションをコールドストレージに設定するには、その storage_mode プロパティを変更します。例:
-- 複数の子パーティションを作成
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');
-- 子パーティションをコールドストレージに設定
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
テーブルアクセス頻度の照会
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;