Hologres でテーブルグループとシャード数を設定して、ワークロード全体のクエリパフォーマンス、書き込みスループット、ストレージ効率のバランスをとります。
このドキュメントでは、テーブルグループの作成、クエリ、変更、削除の方法、およびワークロードが変化した場合のテーブルのリシャーディング方法について説明します。
テーブルグループとシャードの仕組み
Hologres インスタンスは、データを 2 階層の構造で整理します:
-
テーブルグループ -- 1 つ以上のテーブルを保持する論理的なコンテナです。同じテーブルグループ内のすべてのテーブルは、同じシャード数を共有します。
-
シャード -- データ分散の単位です。シャードは並列処理のためにワーカー (コンピューティングノード) に分散されます。
|
概念 |
役割 |
|
インスタンス |
1 つ以上のデータベースを含み、各データベースには 1 つ以上のテーブルグループがあります。 |
|
テーブルグループ |
シャード数を共有するテーブルをグループ化します。JOIN されるテーブルは、同じテーブルグループに属している必要があります。 |
|
シャード |
並列処理のためにワーカー全体にデータを分散します。 |
|
ワーカー |
1 つ以上のシャードを処理するコンピューティングノードです。 |
すべてのデータベースには、シャード数がインスタンス仕様と一致するデフォルトのテーブルグループがあります。ほとんどのワークロードでは、このデフォルトで十分です。
設定に関する推奨事項
以下のガイドラインに従ってください:
-
デフォルトのテーブルグループを使用する:ワークロードが異なるシャード数を必要としない限り、デフォルトのテーブルグループを使用してください。インスタンスサイズごとのデフォルトのシャード数は、「インスタンス管理」に記載されています。
-
大規模インスタンス (> 256 CU):負荷分散のために、複数のテーブルグループを検討してください:
-
大容量のデータ -- より高いシャード数を持つ別のテーブルグループを作成します。
-
多数の小さなテーブル -- より低いシャード数を持つ別のテーブルグループを作成して、クエリの起動オーバーヘッドを削減します。
-
-
JOIN するテーブルは同じテーブルグループを共有する必要があります。
-
テーブルごとにテーブルグループを作成しないでください。これにより、不要なオーバーヘッドと断片化が発生します。
-
シャード数をワーカーに合わせてください。リソースをバランスよく使用し、スケールアウトを容易にするために、シャード数をワーカーの倍数に設定します。
既存のテーブルグループのシャード数は変更できません。シャード数を変更するには、新しいテーブルグループを作成し、テーブルをそこにリシャーディングする必要があります。
シャード数の上限
Hologres V2.0 以降、デフォルトの上限により、過剰なシャードによる割り当ての失敗が防止されます。上限を超えると、too many shards in this instance エラーが返されます。
上限は以下の式に従います:
-
テーブルグループあたりの最大シャード数 = デフォルトのシャード数 x 2
-
インスタンスあたりの最大合計シャード数 = デフォルトのシャード数 x 8
|
インスタンス仕様 |
デフォルトのコンピューティングノード |
デフォルトのシャード (V0.10.31+) |
テーブルグループあたりの最大シャード数 (V2.0+) |
インスタンスあたりの最大シャード数 (V2.0+) |
|
32 CU |
2 |
20 |
40 (20 x 2) |
160 (20 x 8) |
|
64 CU |
4 |
40 |
80 (40 x 2) |
320 (40 x 8) |
|
96 CU |
6 |
60 |
120 (60 x 2) |
480 (60 x 8) |
|
128 CU |
8 |
80 |
160 (80 x 2) |
640 (80 x 8) |
|
160 CU |
10 |
80 |
160 (80 x 2) |
640 (80 x 8) |
|
192 CU |
12 |
80 |
160 (80 x 2) |
640 (80 x 8) |
|
256 CU |
16 |
120 |
240 (120 x 2) |
960 (120 x 8) |
|
384 CU |
24 |
160 |
320 (160 x 2) |
1280 (160 x 8) |
|
512 CU |
32 |
160 |
320 (160 x 2) |
1280 (160 x 8) |
|
... |
... |
M |
M x 2 |
M x 8 |
これらの上限を無効にするには (非推奨 — リソース割り当ての失敗を引き起こす可能性があります):
SET hg_experimental_enable_shard_count_cap = off;
権限
スーパーユーザーのみが、テーブルグループの作成、変更、削除、またはテーブルの別のテーブルグループへの移動 (リシャーディング) を実行できます。
ユーザーにスーパーユーザー権限を付与するには:
-- <Alibaba Cloud account ID> をユーザーの UID に置き換えます。
-- RAM ユーザーの場合、アカウント ID の前にプレフィックス「p4_」を追加します。
ALTER USER "<Alibaba Cloud account ID>" SUPERUSER;
新しいテーブルをテーブルグループに割り当てるには、テーブル作成権限のみが必要です。
テーブルグループのメタデータのクエリ
デフォルトのテーブルグループの表示
SELECT * FROM hologres.hg_table_group_properties
WHERE tablegroup_name IN (
SELECT tablegroup_name FROM hologres.hg_table_group_properties
WHERE property_key = 'is_default_tg' AND property_value = '1'
);
出力例:
tablegroup_name | property_key | property_value
-----------------+------------------+----------------
test_tg_default | tg_version | 1
test_tg_default | table_num | 1
test_tg_default | is_default_tg | 1
test_tg_default | shard_count | 3
test_tg_default | replica_count | 1
test_tg_default | created_manually | 0
(6 rows)
出力では、is_default_tg がデフォルトのテーブルグループを示し、shard_count がそのシャード数を示します。
すべてのテーブルグループのリスト表示
SELECT tablegroup_name
FROM hologres.hg_table_group_properties GROUP BY tablegroup_name;
テーブルグループのシャード数の表示
SELECT property_value AS shard_count
FROM hologres.hg_table_group_properties
WHERE property_key = 'shard_count' AND tablegroup_name = '<tg_name>';
テーブルグループ内のテーブルのリスト表示
SELECT table_namespace AS schema_name, table_name
FROM hologres.hg_table_properties
WHERE property_key = 'table_group' AND property_value = '<tg_name>';
テーブルのテーブルグループの検索
SELECT property_value AS table_group_name
FROM hologres.hg_table_properties
WHERE property_key = 'table_group' AND table_name = '<table_name>';
テーブルグループの作成
CALL HG_CREATE_TABLE_GROUP('<new_tg_name>', <shard_count>);
|
パラメーター |
型 |
説明 |
|
|
Text |
テーブルグループ名 |
|
|
INT4 |
テーブルグループのシャード数 |
例:
-- 「tg_8」という名前で 8 つのシャードを持つテーブルグループを作成します。
CALL HG_CREATE_TABLE_GROUP('tg_8', 8);
-
既存のテーブルは、元のテーブルグループに残ります。
-
元のテーブルグループは、そのすべてのテーブルとデータが移動または削除された後にのみ無効になります。
デフォルトのテーブルグループの変更
新しいテーブルが自動的に割り当てられるように、別のデフォルトのテーブルグループを設定します。
Hologres V0.9 以降が必要です。インスタンスがそれより前のバージョンの場合は、まずインスタンスをアップグレードしてください。
CALL HG_UPDATE_DATABASE_PROPERTY('default_table_group', '<tg_name>');
|
パラメーター |
型 |
説明 |
|
|
TEXT |
デフォルトとして設定するテーブルグループの名前。そのシャード数がデータベースの新しいデフォルトになります。 |
例:
-- 「tg_8」をデフォルトのテーブルグループとして設定します。
CALL HG_UPDATE_DATABASE_PROPERTY('default_table_group', 'tg_8');
新しいテーブルを特定のテーブルグループに割り当てる
CREATE TABLE と SET_TABLE_PROPERTY の呼び出しをトランザクションでラップします:
BEGIN;
CREATE TABLE <table_name> (
col1 text,
...
);
CALL SET_TABLE_PROPERTY('<table_name>', 'table_group', '<tg_name>');
COMMIT;
|
パラメーター |
型 |
説明 |
|
|
TEXT |
新しいテーブルの名前 |
|
|
TEXT |
対象のテーブルグループ。テーブルはこのテーブルグループのシャード数を継承します。 |
例:
-- テーブル「tbl1」を作成し、テーブルグループ「tg_8」に割り当てます。
BEGIN;
CREATE TABLE tbl1 (
col1 text
);
CALL SET_TABLE_PROPERTY('tbl1', 'table_group', 'tg_8');
COMMIT;
テーブルのリシャーディング
インスタンスをスケールアップしても、既存のデータベースのシャード数は調整されません。追加されたキャパシティを使用するには、より高いシャード数を持つ新しいテーブルグループを作成し、テーブルをそこに移動します。スケールアップ後に作成された新しいデータベースは、更新されたデフォルトを使用します。インスタンス仕様の概要。
3 つの方法が利用可能です:
|
方法 |
サポートされるテーブルタイプ |
最小バージョン |
|
Liquid Table |
非パーティション化テーブルと論理パーティションテーブル (動的。読み取り/書き込みを中断せずに即時反映) |
Hologres V4.2 |
|
|
非パーティション化テーブル、物理パーティションテーブル、論理パーティションテーブル (パーティションごとに順次実行) |
Hologres V3.1 |
|
ストアドプロシージャ |
非パーティション化テーブルと物理パーティションテーブル |
Hologres V0.10 |
Liquid Table を使用したリシャーディング
Hologres V4.2 以降、Liquid Table はテーブルグループ間を動的に移動できます。この変更は、読み取りや書き込みを中断することなく即座に有効になります。Liquid Table。
REBUILD を使用したリシャーディング
Hologres V3.1 以降、REBUILD コマンドは、リアルタイムの進捗監視機能を使用して、テーブルグループ間でテーブルを非同期に移動します。REBUILD (ベータ版)。
ストアドプロシージャを使用したリシャーディング
Hologres V0.10 以降、組み込みのストアドプロシージャを使用して、テーブルを再作成したりデータを再インポートしたりすることなく、新しいテーブルグループに移動できます。
制限事項
-
Hologres V0.10 以降が必要です。バージョンは [Instance Details] ページで確認できます。それより前のバージョンの場合は、インスタンスをアップグレードするか、オンラインサポートをご利用ください。
-
リシャーディング中はすべての書き込みを停止してください。読み取りは影響を受けません。Hologres V1.1 以降では、
set table readonlyを使用して、リアルタイム書き込みタスクの自動フェイルオーバーが可能です。 -
リシャーディングは CPU を消費し、一時的にストレージを増加させます。オフピーク時に実行してください。
-
リシャーディングの前にテーブルのバイナリログを無効にし、後で再度有効にしてください。詳細については、「Hologres バイナリログのサブスクライブ」をご参照ください。
-
SERIALフィールドを持つテーブルはリシャーディングできません。DEFAULT値を持つテーブルは、リシャーディング後にDEFAULT属性を失います。 -
テーブルはビューなどの他のオブジェクトに依存していてはなりません。リシャーディングの前に依存関係を削除してください。さもないと、Hologres は
"ERROR: resharding table xxx can not executed because other objects depend on it."を返します。ビューの依存関係をバイパスするには、set hg_experimental_hg_insert_overwrite_enable_view=on;を設定します。 -
リシャーディングは Simple Permission Model (SPM) にのみ適用されます。詳細については、「Hologres 権限モデル」をご参照ください。
-
リシャーディングでは、自動パーティション化プロパティは保持されません。
-
Hologres V2.0 以降、リシャーディング中に列コメントが保持されます。それより前のバージョンでは、列コメントを手動でバックアップおよび復元してください。
構文
Hologres V2.0.24 以降の場合:HoloWeb を使用して、グラフィカルインターフェイス経由でリシャーディングを実行します。詳細については、「テーブルのリシャーディング」をご参照ください。
それより前のバージョンの場合:以下の SQL コマンドを実行します。
-- V1.1 以降の場合:
CALL HG_MOVE_TABLE_TO_TABLE_GROUP('<table_name>', '<new_table_group_name>');
-- V0.10 以降の場合:
CALL HG_UPDATE_TABLE_SHARD_COUNT('<table_name>', '<new_table_group_name>');
|
パラメーター |
説明 |
例 |
|
|
移動するテーブル。パーティションテーブルの場合は、親テーブルを指定します。テーブルごとにコマンドを 1 回実行します。 |
|
|
|
対象のテーブルグループ。 |
|
-
テーブルを移動する前に、新しいテーブルグループを作成します。詳細については、「テーブルグループの作成」をご参照ください。
-
リシャーディング中は、テーブルに対するすべての書き込み操作を停止してください。読み取りは影響を受けません。
-
テーブルグループからすべてのテーブルが移動した後、不要になった場合は
HG_DROP_TABLE_GROUPを使用して空のテーブルグループを手動で削除します。 -
パーティションテーブルの場合は、親テーブルのみを操作してください。
-
仮想ウェアハウスインスタンスでは、移行は対象テーブルグループのリーダー仮想ウェアハウスによって実行される必要があり、その仮想ウェアハウスはフォロワーとしてソーステーブルグループにアクセスする必要もあります。詳細については、「コンピューティンググループにデータアクセスを承認する」をご参照ください。
リシャーディング例外の処理
リシャーディングは、OOM エラーや手動での終了によって中断されることがあります。中断された場合、元のテーブルは読み取り専用になり、<initial_table_name>_xxxxxxxx という名前の一時テーブルが表示されます。
Hologres V2.0.24 以降のインスタンスの場合:
-
HoloWeb: UI からリシャーディングを続行またはキャンセルします。詳細については、「テーブルのリシャーディング」をご参照ください。
-
SQL:以下の手順に従ってください。
以前のバージョンのインスタンスの場合:まず V2.0.24 以降にアップグレードしてください。
リシャーディングを再開するには、根本原因を解決し、HG_MOVE_TABLE_TO_TABLE_GROUP コマンドを再度実行してください。
リシャーディングをキャンセルして元の状態に戻すには、以下のコマンドを順番に実行してください:
-- 1. 元のテーブルから読み取り専用フラグを削除します。
CALL set_table_property('<schema_name>.<table_name>', 'readonly', 'false');
-- 2. 一時テーブルの名前を見つけます。
-- パーティションテーブルの場合:
SELECT schema_name, target_temp_table_name
FROM hologres.hg_resharding_properties
WHERE reshard_table_name = '<schema_name>.<table_name>' AND is_parent_table IS TRUE;
-- 非パーティション化テーブルの場合:
SELECT schema_name, target_temp_table_name
FROM hologres.hg_resharding_properties
WHERE reshard_table_name = '<schema_name>.<table_name>'
AND is_parent_table IS FALSE AND is_sub_table IS FALSE;
-- 3. 一時テーブルを削除します。
DROP TABLE IF EXISTS <schema_name>.<target_temp_table_name>;
-- 4. リシャーディングの進捗記録をクリアします。
CALL hologres.hg_internal_clear_resharding_properties('<schema_name>.<table_name>');
テーブルグループの削除
まずテーブルグループからすべてのテーブルを削除し、次に以下を実行してください:
CALL HG_DROP_TABLE_GROUP('<tg_name>');
例:
CALL HG_DROP_TABLE_GROUP('tg_8');
シャードからワーカーへの分散の確認
ワーカー間でのシャードの不均等な分散は、負荷の不均衡と非効率的なリソース使用を引き起こします。
Hologres V1.3 以降、worker_info システムビューを使用して、シャードとワーカーのマッピングを確認できます。「基本概念」ではシャードとノードの関係について説明しており、「ワーカー間のシャード割り当てのクエリ」でクエリ構文を提供しています。
ベストプラクティス
デフォルトのテーブルグループは、ほとんどのワークロードに適しています。カスタム設定については、「テーブルグループ設定のベストプラクティス」をご参照ください。
よくある質問
"internal error: Get rundown is not allowed in recovering state" エラーの意味
このエラーは、テーブルが読み取り専用であり、INSERT、UPDATE、DELETE 操作がブロックされていることを示します。Hologres は、データ不整合を防ぐために、リシャーディングが中断されたときにこの状態を設定します。
解決するには:
-
すべての読み取り専用テーブルを検索してください:
SELECT * FROM hologres.hg_table_properties WHERE property_key = 'readonly' AND property_value = 'true'; -
読み取り専用フラグを削除してください。
<table_name>を完全修飾テーブル名 (例:public.my_table) に置き換えてください。CALL set_table_property('<table_name>', 'readonly', 'false');