リアルタイムデータ分析、ログ収集など、リアルタイムのデータ処理や大規模なデータ収集が必要なシナリオでは、多数の同時読み取りおよび書き込みリクエストが存在する可能性があります。このような場合は、適切なテーブルグループと適切なシャード数を指定することで、データ分散と負荷分散を実現できます。これにより、クエリのパフォーマンスが最適化され、データストレージと計算効率が向上します。
テーブルグループとシャード数に関する推奨設定
Hologres では、ビジネス要件に基づいてテーブルグループとシャード数を指定できます。同様のサービスと比較して、Hologres では、特定のビジネスシナリオに基づいて、より柔軟かつ簡単にカスタムスキーマを作成できます。ビジネスを十分に理解することで、Hologres の高性能を最大限に活用できます。テーブルグループを指定する場合は、次のルールに従うことをお勧めします。
不要な場合は、テーブルグループを作成しないでください。デフォルトのテーブルグループを使用することをお勧めします。 Hologres インスタンスの仕様の詳細については、「インスタンスの仕様」をご参照ください。
256 CPU コア以上を持つインスタンスの場合、ビジネス要件に基づいて複数のテーブルグループを指定することをお勧めします。こうすることで、ビジネスワークロードのバランスを取ることができます。
データ量が多い場合は、大きなシャード数を持つ独立したテーブルグループを作成できます。
データ量が少ないテーブルグループには、小さなシャード数を持つ独立したテーブルグループを作成できます。これにより、クエリの起動オーバーヘッドが削減されます。
ローカル結合操作に関連するテーブルは、同じテーブルグループに追加する必要があります。
テーブルごとにテーブルグループを設定しないでください。
シャード数を指定する場合は、ワーカーノードの数と後続のスケールアウトを考慮する必要があります。シャード数はワーカーノードの数の倍数に設定することをお勧めします。こうすることで、計算リソースを均等に割り当てることができます。
既存のテーブルグループのシャード数は変更できません。シャード数を変更する場合は、テーブルグループを作成します。
シャード数を大きな値に設定しないことをお勧めします。大きな値に設定すると、一部のシャードに計算リソースが割り当てられず、追加のオーバーヘッドが発生する可能性があります。 Hologres V2.0 以降では、テーブルグループのシャード数の上限とインスタンスのシャード数の上限が、デフォルトで次のルールに基づいて設定されます。これにより、シャード数が多すぎることによる計算リソースの不均等な割り当てを防ぎます。上限を超えると、このインスタンスのシャードが多すぎます というエラーメッセージが報告されます。
テーブルグループの最大シャード数 = テーブルグループのデフォルトシャード数 × 2インスタンスの最大シャード数 = テーブルグループのデフォルトシャード数 × 8Grand Unified Configuration(GUC)パラメータをオフに設定して、上限をキャンセルできます。ただし、上限がキャンセルされ、シャード数をより大きな値に設定すると、一部のシャードに計算リソースが割り当てられない可能性があります。したがって、上限をキャンセルしないことをお勧めします。
set hg_experimental_enable_shard_count_cap =off;テーブルグループとインスタンスのシャード数の上限は、インスタンスの仕様によって異なります。
インスタンス仕様
デフォルトの計算ノード数
デフォルトのシャード数 (Hologres V0.10.31 以降)
テーブルグループのシャード数の上限 (Hologres V2.0 以降)
インスタンスのシャード数の上限 (Hologres V2.0 以降)
32 コア
2
20
40 (20 × 2)
160 (20 × 8)
64 コア
4
40
80 (40 × 2)
320 (40 × 8)
96 コア
6
60
120 (60 × 2)
480 (60 × 8)
128 コア
8
80
160 (80 × 2)
640 (80 × 8)
160 コア
10
80
160 (80 × 2)
640 (80 × 8)
192 コア
12
80
160 (80 × 2)
640 (80 × 8)
256 コア
16
120
240 (120 × 2)
960 (120 × 8)
384 コア
24
160
320 (160 × 2)
1,280 (160 × 8)
512 コア
32
160
320 (160 × 2)
1,280 (160 × 8)
...
...
M
M × 2
M × 8
権限
テーブルグループの作成、デフォルトのテーブルグループの変更、テーブルグループの削除、またはリシャーディング機能を使用してテーブルを新しいテーブルグループに移行するには、Hologres インスタンスのスーパーユーザーロールが割り当てられている必要があります。スーパーユーザーとして、次のステートメントを実行して、スーパーユーザーロールを一般ユーザーに割り当てることができます。
-- アカウント ID を Alibaba Cloud アカウント ID に置き換えます。 RAM ユーザーを使用する場合は、アカウント ID の前に p4_ を付けます。 ALTER USER "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' );次の結果が返されます。
説明返された結果で、is_default_tg プロパティはテーブルグループがデフォルトのテーブルグループであるかどうかを示し、shard_count プロパティはテーブルグループのシャード数を示します。
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)現在のデータベースのテーブルグループをクエリします。
SELECT tablegroup_name FROM hologres.hg_table_group_properties GROUP BY tablegroup_name;次の結果が返されます。
tablegroup_name ----------------- test_tg_default (1 row)テーブルグループのシャード数をクエリします。
SELECT property_value AS shard_count FROM hologres.hg_table_group_properties WHERE property_key = 'shard_count' AND tablegroup_name ='<tg_name>';次の結果が返されます。
shard_count ------------- 3 (1 row)テーブルグループのテーブルをクエリします。
SELECT table_namespace AS schema_name, table_name FROM hologres.hg_table_properties WHERE property_key = 'table_group' AND property_value = '<tg_name>';次の結果が返されます。
schema_name | table_name -------------+------------ public | a (1 row)テーブルが属するテーブルグループをクエリします。
SELECT property_value AS table_group_name FROM hologres.hg_table_properties WHERE property_key = 'table_group' AND table_name = '<table_name>';次の結果が返されます。
table_group_name ------------------ test_tg_default (1 row)
テーブルグループを作成する
新しいビジネスがある場合、または既存のテーブルグループのシャード数を変更する場合、次の構文を使用してテーブルグループを作成できます。
テーブルグループを作成した後、元のテーブルグループのテーブルとデータは新しいテーブルグループに自動的に移行されません。
元のテーブルグループは無効になります。テーブルとデータが新しいテーブルグループに移行された後、または削除された後のみです。
CALL HG_CREATE_TABLE_GROUP ('<new_tg_name>', <shard_count>);次の表は、上記の構文のパラメータについて説明しています。
パラメータ | データ型 | 説明 |
new_tg_name | Text | 作成するテーブルグループの名前。 |
shard_count | INT4 | テーブルグループのシャード数。 |
例:
-- tg_8 という名前で、8 つのシャードを持つテーブルグループを作成します。
CALL HG_CREATE_TABLE_GROUP ('tg_8', 8);デフォルトのテーブルグループを変更する
データベースを作成すると、Hologres インスタンスのデータベースに、デフォルトのシャード数を持つデフォルトのテーブルグループが作成されます。詳細については、「インスタンスタイプ」をご参照ください。データベースに複数のテーブルグループが含まれている場合は、次のステートメントを実行してデフォルトのテーブルグループを変更し、後続で作成されたテーブルを新しいデフォルトのテーブルグループに格納できます。
Hologres V0.9 以降では、次のステートメントを実行してデフォルトのテーブルグループを変更できます。 Hologres インスタンスのバージョンが V0.9 より前の場合は、最初にインスタンスをアップグレードしてください。
CALL HG_UPDATE_DATABASE_PROPERTY ('default_table_group', '<tg_name>');次の表は、上記の構文のパラメータについて説明しています。
パラメータ | データ型 | 説明 |
tg_name | TEXT | 新しいデフォルトのテーブルグループの名前。デフォルトのテーブルグループが変更されると、新しいデフォルトのテーブルグループのシャード数は、テーブルグループのシャード数になります。 |
例:
-- Hologres V0.9 以降では、新しく作成されたテーブルグループをデフォルトのテーブルグループとして設定できます。設定が有効になると、後続で作成されたテーブルは新しいデフォルトのテーブルグループに格納されます。
CALL HG_UPDATE_DATABASE_PROPERTY ('default_table_group', 'tg_8');テーブルを作成し、指定したテーブルグループに追加する
次のステートメントを実行して、テーブルを作成し、明示的に指定したテーブルグループに追加できます。
BEGIN;
CREATE TABLE table_name (
col type,
....
);
CALL SET_TABLE_PROPERTY('table_name', 'table_group', '<tg_name>');
COMMIT;次の表は、上記の構文のパラメータについて説明しています。
パラメータ | データ型 | 説明 |
table_name | TEXT | 作成するテーブルの名前。 |
tg_name | TEXT | 指定したテーブルグループの名前。テーブルグループのシャード数は、テーブルグループのシャード数になります。 |
例:
-- tbl1 という名前のテーブルを作成し、tg_8 という名前のテーブルグループに追加します。
BEGIN;
CREATE TABLE tbl1 (
col1 text
);
CALL SET_TABLE_PROPERTY('tbl1', 'table_group', 'tg_8');
COMMIT;リシャーディング機能を使用してテーブルを新しいテーブルグループに移行する
Hologres では、シャードを使用してデータ処理の並列性を向上させています。シャード数を適切な値に設定することで、クエリまたは書き込みのパフォーマンスを向上させることができます。ほとんどの場合、Hologres インスタンスのデフォルトのシャード数で要件を満たすことができます。シャード数を変更する必要はありません。
たとえば、Hologres インスタンスが 32 CPU コアから 128 CPU コアにスケールアウトされた後、Hologres インスタンスの既存のデータベースのシャード数は変更されません。データベースのパフォーマンスを向上させる場合は、データベースのシャード数を増やすことをお勧めします。 Hologres インスタンスにデータベースを作成する場合、現在のインスタンス仕様のデフォルトのシャード数が適用されます。インスタンスの仕様とシャードの詳細については、「インスタンスの仕様」をご参照ください。
Hologres インスタンスがスケールインまたはスケールアウトされた後、既存のデータベースのシャード数は変更されません。ステートメントを実行してシャード数を変更し、データを再度インポートできます。
通常テーブルと物理パーティションテーブルの場合、
REBUILD構文と組み込みストアドプロシージャの両方を使用できます。論理パーティションテーブルの場合は、
REBUILD構文を使用することをお勧めします。これは、パーティションごとに操作を順番に自動的に実行します。再シャーディングに REBUILD を使用する
V3.1 以降、Hologres はテーブルプロパティの変更(テーブルグループ間のテーブルの移行を含む)に
REBUILD構文をサポートしています。REBUILD構文を使用すると、移行タスクを非同期で実行し、タスクの進捗状況をリアルタイムで監視できます。詳細については、「REBUILD (ベータ)」をご参照ください。再シャーディングに組み込みストアドプロシージャを使用する
V0.10 以降、Hologres は再シャーディング機能を提供しています。シャード数を変更した後、再シャーディング機能を使用して、既存のテーブルとデータをシャード間で再分散できます。テーブルを作成してデータを再度インポートする必要はありません。これにより、手順が簡素化され、最適なパフォーマンスが実現します。
制限事項
再シャーディング機能は、Hologres V0.10 以降でのみサポートされています。 Hologres インスタンスのバージョンは、Hologres コンソールのインスタンス詳細ページで確認できます。 Hologres インスタンスのバージョンが V0.10 より前の場合は、Hologres コンソールで Hologres インスタンスを手動でアップグレードするか、Hologres DingTalk グループに参加してインスタンスのアップグレードを申請してください。 Hologres インスタンスを手動でアップグレードする方法の詳細については、「インスタンスのアップグレード」をご参照ください。 Hologres DingTalk グループへの参加方法の詳細については、「Hologres のオンラインサポートを受ける」をご参照ください。
再シャーディング操作は、一度に 1 つのテーブルに対して実行されます。テーブルに対して再シャーディング操作を実行する場合は、Realtime Compute for Apache Flink または Data Integration を使用したデータ書き込みを停止する必要があります。テーブル内のデータは引き続きクエリできます。 Hologres V1.1 以降では、
set table readonlyを指定して、リアルタイムデータ書き込みの自動フェールオーバーを実装できます。リシャーディングは CPU リソースと追加のストレージリソースを消費します。オフピーク時にリシャーディング操作を実行することをお勧めします。
テーブルでバイナリロギングが有効になっている場合は、テーブルでリシャーディング操作を実行する前に、バイナリロギングを無効にする必要があります。リシャーディングが完了したら、バイナリロギングを再度有効にできます。詳細については、「Hologres バイナリログをサブスクライブする」をご参照ください。
テーブルに SERIAL データ型の自動インクリメントフィールドが含まれている場合、またはテーブルが DEFAULT 制約で作成されている場合は、テーブルでリシャーディング操作を実行できません。テーブルに SERIAL データ型の自動インクリメントフィールドが含まれている場合、リシャーディング中にエラーが発生します。テーブルが DEFAULT 制約で作成されている場合、リシャーディングの完了後に DEFAULT 制約は無効になります。
ビューなどの依存オブジェクトを持つテーブルに対しては、再シャーディング操作を実行できません。再シャーディング操作を実行する前に、関連する依存オブジェクトを削除する必要があります。削除しないと、
ERROR: resharding table xxx can not executed because other objects depend on itというエラーメッセージが報告されます。Hologres V2.2.29 以降、および Hologres V3.0.36 以降では、1 つ以上のビューによって参照されるテーブルに対して再シャーディング機能がサポートされています。
set hg_experimental_hg_insert_overwrite_enable_view=on;コマンドを実行することで、ビューによって参照されるテーブルの再シャーディングを有効にできます。簡易権限モデル (SPM) を使用するデータベースでのみ、リシャーディング操作を実行できます。標準 PostgreSQL 認証モデルを使用するデータベースは、リシャーディングをサポートしていません。 Hologres 権限モデルの詳細については、「概要」をご参照ください。
動的パーティション分割プロパティは、リシャーディング操作の後も保持されません。
Hologres V2.0 以降では、列のコメントはリシャーディング操作の後も保持されます。 Hologres インスタンスのバージョンが V2.0 より前の場合は、リシャーディング操作の前に列のコメントをバックアップし、リシャーディング操作の完了後に手動でコメントを追加してください。
構文
Hologres インスタンスのバージョンが V2.0.24 以降の場合は、[HoloWeb コンソール] でリシャーディング操作を実行することをお勧めします。詳細については、「テーブルのリシャーディング」をご参照ください。
Hologres インスタンスのバージョンが V2.0.24 より前の場合は、次のステートメントを実行して、一部のビジネステーブルを新しいテーブルグループに移行できます。 Hologres インスタンスのバージョンが V0.10 より前の場合は、インスタンスをアップグレードしてください。
説明テーブルをテーブルグループに移行するには、事前にテーブルグループを作成する必要があります。テーブルグループの作成方法の詳細については、「テーブルグループを作成する」をご参照ください。
テーブルを移行する場合は、テーブルへのデータの書き込みを停止する必要があります。これらのテーブルのデータは引き続きクエリできます。
元のテーブルグループのすべてのテーブルが移行されると、元のテーブルグループは自動的に削除されます。ビジネス要件に基づいて複数のテーブルグループを作成する場合は、各テーブルグループのシャード数を適切な値に設定することをお勧めします。
パーティションテーブルを移行する場合は、親テーブルのみを移行する必要があります。
仮想ウェアハウスインスタンスを使用していて、テーブルグループ A からテーブルグループ B にテーブルを移行する場合は、テーブルグループ B のリーダー仮想ウェアハウスを使用してこの移行タスクを実行する必要があります。また、テーブルグループ B のリーダー仮想ウェアハウスがテーブルグループ A にアクセスできることを確認する必要があります。したがって、テーブルグループ B のリーダー仮想ウェアハウスは、テーブルグループ A のフォロワー仮想ウェアハウスとしてロードする必要があります。関連する権限付与の詳細については、「仮想ウェアハウスにロードされたテーブルグループの権限を管理する」をご参照ください。
-- Hologres V1.1 以降でサポートされている構文: CALL HG_MOVE_TABLE_TO_TABLE_GROUP('<table_name>','<new_table_group_name>'); -- Hologres V0.10 でサポートされている構文: CALL HG_UPDATE_TABLE_SHARD_COUNT('<table_name>','<new_table_group_name>');パラメータ
パラメータ
説明
例
table_name
移行するテーブルの名前。上記のステートメントのいずれかを実行して、一度に 1 つのテーブルを移行できます。複数のテーブルを移行する場合は、ステートメントを複数回実行します。移行するテーブルがパーティションテーブルの場合は、親テーブルのみを移行する必要があります。
new_table
table_group_name
テーブルを移行するテーブルグループの名前。
new_tg
例外処理
テーブルのリシャーディング中、テーブルは読み取り専用として設定され、一時テーブルを使用して新しいテーブルグループに移行されます。リシャーディングタスクにはデータのインポートが含まれ、時間がかかります。このプロセス中に、メモリ不足 (OOM) やタスクの手動終了などの例外が発生する可能性があります。例外が発生すると、元のテーブルは読み取り専用の状態のままになり、<initial_table_name>_xxxxxxxx という名前の一時テーブルがデータベースに存在します。例外を処理するには、次の手順に従います。
Hologres インスタンスのバージョンが V2.0.24 より前の場合、インスタンスをスペックアップするか、チケットを送信してください。インスタンスをスペックアップする方法の詳細については、「インスタンスのスペックアップ」をご参照ください。
Hologres インスタンスのバージョンが V2.0.24 以降の場合は、次のルールに従います。
[HoloWeb コンソール] でリシャーディング操作を実行する場合は、必要に応じて [続行] または [キャンセル] をクリックします。詳細については、「テーブルのリシャーディング」をご参照ください。
上記のステートメントを実行してリシャーディング操作を実行する場合は、次のいずれかの操作を実行して、リシャーディング操作を続行またはキャンセルします。
リシャーディング操作を続行する場合は、問題のトラブルシューティングを行い、テーブルで CALL HG_MOVE_TABLE_TO_TABLE_GROUP ステートメントを再度実行します。
リシャーディング操作をキャンセルして元の状態に戻す場合は、次のステートメントを順番に実行します。
-- 元のテーブルの読み取り専用プロパティを無効にします。 CALL set_table_property('<schema_name>.<table_name>','readonly','false'); -- 一時テーブルをクリアします。 -- 一時パーティションテーブルの名前を取得します。 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; -- 一時テーブルをクリアします。 DROP TABLE IF EXISTS <schema_name>.<target_temp_table_name>; -- システムテーブルをクリアします。システムテーブルには、現在のテーブルのリシャーディングの進捗状況が記録されます。リシャーディングタスクをキャンセルする場合は、システムテーブルのデータをクリアする必要があります。 CALL hologres.hg_internal_clear_resharding_properties('<schema_name>.<table_name>');
テーブルグループの削除
空のテーブルグループを削除するには、次の文を実行できます。テーブルグループにテーブルが存在する場合、テーブルグループを削除することはできません。
CALL HG_DROP_TABLE_GROUP('<tg_name>');例:
-- tg_8 という名前のテーブルグループを削除します。
CALL HG_DROP_TABLE_GROUP('tg_8');シャードとワーカーノード間の割り当て関係をクエリする
シャードはワーカーに均等に割り当てる必要があります。詳細については、「基本概念」トピックの「Shard Count とワーカー計算ノードの関係」セクションをご参照ください。シャードがワーカーに均等に割り当てられていない場合、リソースの偏りが発生し、リソースが非効率的に使用される可能性があります。Hologres V1.3 では、worker_info システムビューで、現在のデータベース内のワーカーノード、テーブルグループ、および Shard Count 間の割り当て関係をクエリできます。これにより、リソース割り当ての不均一性の問題を解決できます。ワーカーノード間のシャード割り当てをクエリする方法の詳細については、「ワーカー間のシャード割り当てをクエリする」をご参照ください。
ベスト プラクティス
ほとんどの場合、テーブルグループを作成したり、テーブルグループの Shard Count を変更したりすることはお勧めしません。ビジネス要件に基づいてテーブルグループを作成する場合は、ベストプラクティスに基づいてテーブルグループを計画できます。詳細については、「テーブルグループを指定するためのベスト プラクティス」をご参照ください。
トラブルシューティング
リシャーディングは、一時テーブルの作成、ソーステーブルの読み取り専用状態の変更、デスティネーションテーブルへのデータ書き込み、テーブル名の変更、同期ステータスの記録など、複数のステップを含む複雑なプロセスです。 1 つ以上のステップを実行するときに例外が発生した場合、システムは不明な状態になる可能性があります。 この場合、トラブルシューティングのために次のソリューションを使用できます。
internal error: Get rundown is not allowed in recovering state というエラーメッセージが返された場合、更新中のテーブルは読み取り専用の状態です。この場合、テーブルが読み取り専用の状態ではない限り、テーブルに対して INSERT、UPDATE、DELETE などの操作を実行できません。
読み取り専用状態のテーブルをクエリするには、次の文を実行します。
select * from hologres.hg_table_properties where property_key ='readonly' and property_value='true';テーブルの読み取り専用状態を無効にするには、次の文を実行します。
call set_table_property('<table_name>','readonly','false');table_name は、読み取り専用状態を無効にするテーブルの名前を指定します。