リアルタイム分析やログ収集など、リアルタイムのデータ処理や大規模なデータ収集を必要とするシナリオでは、大量の同時読み取り/書き込みリクエストが発生することがあります。適切なテーブルグループと Shard Count を指定することで、データ分布と負荷分散を実現できます。この実践により、クエリパフォーマンスが最適化され、データストレージと計算効率が向上します。
テーブルグループと Shard Count の設定に関する推奨事項
Hologres では、Shard とテーブルグループを柔軟に指定できます。類似製品と比較して、Hologres は特定のシナリオに合わせてスキーマをカスタマイズするための、より柔軟で使いやすいメソッドを提供します。この機能は、ビジネス要件を満たすのに役立ちます。ビジネスを十分に理解することで、Hologres が提供する高性能を最大限に活用できます。テーブルグループを設定する際は、以下の基本ルールに従ってください:
必要な場合を除き、新しいテーブルグループを作成しないでください。代わりにデフォルトのテーブルグループを使用してください。インスタンス仕様の詳細については、「インスタンス管理」をご参照ください。
256 コアを超える大規模なインスタンスでは、必要に応じて複数のテーブルグループを作成してワークロードのバランスを取ることができます。
データ量が大きい場合は、Shard Count が大きい別のテーブルグループを作成します。
データ量が少ないテーブルが多数ある場合は、Shard Count が小さい別のテーブルグループを作成します。これにより、クエリ起動のオーバーヘッドが削減されます。
結合 (Local Join) が必要なテーブルは、同じテーブルグループに属している必要があります。
テーブルごとに個別のテーブルグループを設定しないでください。
Shard Count を設定する際は、ワーカーの数と将来のスケールアウトを考慮してください。リソース割り当てのバランスを取るために、Shard Count をワーカー数の倍数に設定します。
既存のテーブルグループの Shard Count は変更できません。Shard Count を変更するには、新しいテーブルグループを作成する必要があります。
Shard Count を高く設定しすぎないでください。そうしないと、計算リソースの割り当てに失敗し、余分なオーバーヘッドが発生する可能性があります。Hologres V2.0 以降では、Shard Count が過剰になることによるリソース割り当ての失敗を防ぐため、単一テーブルグループの Shard Count とインスタンスの合計 Shard Count にデフォルトで上限が設定されています。合計 Shard Count が上限を超えると、too many shards in this instance というエラーが報告されます。上限は以下のルールによって決定されます:
単一テーブルグループの最大 Shard Count = 単一テーブルグループのデフォルト Shard Count × 2インスタンスの最大合計 Shard Count = 単一テーブルグループのデフォルト Shard Count × 8上限を調整するには、以下の GUC パラメーターを使用してそれらを削除できます。ただし、これは推奨されません。Shard Count を高く設定しすぎると、計算リソースの割り当てに失敗する可能性があります。
set hg_experimental_enable_shard_count_cap =off;以下の表に、Shard Count の上限をリストします。
インスタンスタイプ
デフォルトの計算ノード数
デフォルトの Shard Count (V0.10.31 以降)
単一テーブルグループの最大 Shard Count (V2.0 以降)
インスタンスの合計最大 Shard Count (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)
1280 (160 × 8)
512 コア
32
160
320 (160 × 2)
1280 (160 × 8)
......
......
M
M × 2
M × 8
権限
テーブルグループの作成、デフォルトテーブルグループの変更、テーブルグループの削除、またはテーブルの別のテーブルグループへの移行 (リシャーディング) を行うには、インスタンスのスーパーユーザー権限が必要です。スーパーユーザーは、以下の文を実行して一般ユーザーにスーパーユーザー権限を付与できます。
-- "Alibaba Cloud アカウント ID" を実際のユーザー名に置き換えます。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' );結果:
説明結果では、is_default_tg はテーブルグループがデフォルトであるかどうかを示し、shard_count はテーブルグループの 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)テーブルグループの Shard Count を表示します。
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)
テーブルグループを作成する
新しいサービスがある場合や、新しい Shard Count でテーブルグループを作成する必要がある場合は、以下の文を使用できます。
新しいテーブルグループを作成した後、元のテーブルとデータは元のテーブルグループに残ります。それらは自動的に新しいテーブルグループに移行されません。
元のテーブルグループは、そのすべてのテーブルとデータを移行または削除した後にのみ削除されます。
CALL HG_CREATE_TABLE_GROUP ('<new_tg_name>', <shard_count>);パラメーター:
パラメータ | 型 | 説明 |
new_tg_name | Text | 新しいテーブルグループの名前。 |
shard_count | INT4 | テーブルグループのシャード数。 |
例:
-- Shard Count が 8 の tg_8 という名前の新しいテーブルグループを作成します。
CALL HG_CREATE_TABLE_GROUP ('tg_8', 8);デフォルトテーブルグループの変更
データベースを作成すると、インスタンス内にデフォルトの Shard Count を持つデフォルトのテーブルグループが作成されます。詳細については、「インスタンス管理」をご参照ください。データベースに複数のテーブルグループがあり、デフォルトのものを変更したい場合は、以下の文を使用できます。変更後、新しいテーブルは新しいデフォルトのテーブルグループに保存されます。
Hologres V0.9 以降では、以下の文を実行してデフォルトのテーブルグループを変更できます。ご利用のインスタンスがそれより前のバージョンの場合は、まずアップグレードする必要があります。
CALL HG_UPDATE_DATABASE_PROPERTY ('default_table_group', '<tg_name>');説明:
パラメータ | 型 | 説明 |
tg_name | TEXT | デフォルトのテーブルグループの名前。このパラメーターを設定すると、このテーブルグループの Shard Count が使用されます。 |
例:
-- 新しいテーブルグループをデフォルトとして設定します。新しいテーブルはデフォルトでこのテーブルグループを使用します (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 | 指定されたテーブルグループの名前。このパラメーターを設定すると、このテーブルグループの Shard Count が使用されます。 |
例:
-- tbl1 という名前のテーブルを作成し、tg_8 という名前のテーブルグループに関連付けます。
BEGIN;
CREATE TABLE tbl1 (
col1 text
);
CALL SET_TABLE_PROPERTY('tbl1', 'table_group', 'tg_8');
COMMIT;テーブルの新しいテーブルグループへの移行 (リシャーディング)
Hologres では、Shard がデータ処理の同時実行性を向上させます。適切な Shard Count は、クエリと書き込みのパフォーマンスを向上させるのに役立ちます。ほとんどの場合、Hologres インスタンスのデフォルトの Shard Count で十分であり、手動で変更する必要はありません。
インスタンスがスケールアウトされた後、たとえば 32 コアから 128 コアにスケールアウトされた場合、既存のデータベースの Shard Count はデフォルトでは変更されません。パフォーマンスを向上させるために、データベースの Shard Count を増やすことを推奨します。インスタンスに新しいデータベースを作成すると、現在のインスタンスタイプのデフォルトの Shard Count が使用されます。インスタンスタイプと Shard の詳細については、「インスタンス管理」をご参照ください。
インスタンスがスケールアウトまたはスケールインされた後、既存のデータベースの Shard Count は自動的に増減しません。文を使用して Shard Count を設定し、その後データを再インポートする必要があります。
標準テーブルと物理パーティションテーブルの場合、`REBUILD` 構文または組み込みストアドプロシージャのいずれかを使用できます。
論理パーティションテーブルの場合、`REBUILD` 構文の使用を推奨します。この構文は、パーティションごとに自動的に順次実行できます。
REBUILD 構文を使用したリシャーディング
Hologres V3.1 以降では、テーブルを別のテーブルグループに移行するなど、テーブルプロパティを変更するための `REBUILD` コマンドがサポートされています。`REBUILD` 構文は移行タスクを非同期で実行でき、タスクの進行状況のリアルタイムモニタリングをサポートします。詳細については、「REBUILD (ベータ)」をご参照ください。
組み込みストアドプロシージャを使用したリシャーディング
Hologres V0.10 以降では、リシャーディングコマンドが提供されています。Shard Count を変更した後、このコマンドは自動的にデータを再分散します。テーブルを再作成したり、データを再インポートしたりすることなく、元のテーブルとデータをリシャーディングできます。これにより、操作が簡素化され、最適なパフォーマンスを実現できます。
制限事項
リシャーディング機能は、Hologres V0.10 以降でのみサポートされています。ご利用の Hologres インスタンスのバージョンは、Hologres コンソールのインスタンス詳細ページで確認できます。ご利用のインスタンスのバージョンが V0.10 より前の場合は、「一般的なアップグレード準備エラー」をご参照いただくか、Hologres DingTalk グループに参加してフィードバックを提供してください。詳細については、「Hologres のオンラインサポートの取得」をご参照ください。
現在、リシャーディングはテーブルレベルで実行されます。テーブルをリシャーディングする際は、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 以降および V3.0.36 以降では、ビューの依存関係を持つテーブルをリシャーディングできます。これを行うには、
set hg_experimental_hg_insert_overwrite_enable_view=on;コマンドを実行して GUC パラメーターを有効にします。リシャーディングは、簡易権限モデルにのみ適用され、エキスパート権限モデルには適用されません。Hologres の権限モデルの詳細については、「Hologres 権限モデル」をご参照ください。
リシャーディングは、テーブルの動的パーティショニングプロパティを保持しません。
Hologres V2.0 以降のリシャーディング操作のみが列の `COMMENTS` を保持します。ご利用のインスタンスのバージョンが V2.0 より前の場合は、事前に列の `COMMENTS` をバックアップし、リシャーディング完了後に手動で設定する必要があります。
構文例
ご利用のインスタンスが V2.0.24 以降の場合は、HoloWeb を使用してリシャーディングを実行することを推奨します。詳細については、「テーブルのリシャーディング」をご参照ください。
ご利用のインスタンスのバージョンが V2.0.24 より前の場合は、以下のコマンドを使用してビジネステーブルを新しいテーブルグループに移行できます。インスタンスのバージョンが V0.10 より前の場合は、まずアップグレードする必要があります。
説明移行の前に、新しいテーブルグループが必要です。ない場合は、まず作成してください。詳細については、「テーブルグループの作成」をご参照ください。
テーブルを移行する際は、データ書き込みを停止する必要があります。クエリは影響を受けません。
元のテーブルグループ内のすべてのテーブルが移行されると、元のテーブルグループは自動的に削除されます。ビジネスで複数のテーブルグループが必要な場合は、それぞれに適切な Shard Count を設定してください。
パーティションテーブルを移行する際は、親テーブルに対してのみ操作を実行する必要があります。
ご利用のインスタンスが計算グループタイプで、テーブルをテーブルグループ A からターゲットのテーブルグループ B に移行する必要がある場合は、テーブルグループ B のプライマリ計算グループ W を使用して移行を実行する必要があります。さらに、計算グループ W はテーブルグループ A へのアクセス権限を持っている必要があります。つまり、計算グループ W はテーブルグループ A のフォロワー計算グループとしてロードされている必要があります。計算グループにテーブルグループの権限を付与する方法の詳細については、「計算グループへのデータアクセス権限の付与」をご参照ください。
-- 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>');パラメータ
パラメータ
説明
例
table_name
移行するテーブルの名前。一度に移行できるテーブルは 1 つだけです。複数のテーブルを移行するには、コマンドを複数回実行します。パーティションテーブルの場合、親テーブルに対してのみ操作を実行する必要があります。
new_table
table_group_name
新しいテーブルグループの名前。
new_tg
例外処理
テーブルのリシャーディング中、テーブルはまず読み取り専用に設定され、その後一時テーブルを使用して新しいテーブルグループに移行されます。リシャーディングタスクにはデータインポートが含まれ、時間がかかる可能性があるため、Out-of-Memory (OOM) エラーや手動でのタスク終了など、さまざまな例外が発生する可能性があります。このような場合、元のテーブルは読み取り専用状態のままで、データベースに <initial_table_name>_xxxxxxxx という名前の一時テーブルが表示されます。このような場合は、次のように対処してください:
Hologres インスタンスのバージョンが V2.0.24 より前の場合、インスタンスをスペックアップするか、チケットを送信してください。インスタンスをスペックアップする方法の詳細については、「インスタンスのスペックアップ」をご参照ください。
ご利用の Hologres インスタンスのバージョンが V2.0.24 以降の場合:
HoloWeb でリシャーディングを実行している場合は、[続行] または [キャンセル] をクリックします。詳細については、「テーブルのリシャーディング」をご参照ください。
前述のコマンドを実行してリシャーディングしている場合は、次の手順に従ってください:
テーブルのリシャーディングを続行するには、中断の原因となった問題を解決し、テーブルに対して再度 `HG_MOVE_TABLE_TO_TABLE_GROUP` コマンドを実行します。
リシャーディングをキャンセルして初期状態に戻すには、以下のコマンドを順番に実行します:
-- 元のテーブルの readonly プロパティをキャンセルします。 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 とワーカー間のスキュー関係の表示
Shard Count とワーカー数との間には割り当て関係が存在します。詳細については、「Shard とワーカー計算ノードの関係」をご参照ください。Shard がワーカーに均等に割り当てられていない場合、ワーカーリソースのスキューが発生し、負荷が不均一になり、リソース使用が非効率になる可能性があります。そのため、Hologres V1.3 では、現在のデータベース内のワーカー、テーブルグループ、および Shard 間の関係をクエリするための worker_info システムビューが提供されています。このビューは、スキュー問題のトラブルシューティングに役立ちます。ワーカーリソースのスキューを確認する方法の詳細については、「ワーカースキュー関係の表示」をご参照ください。
ベスト プラクティス
テーブルグループは高度な機能です。ほとんどの場合、ビジネスのために新しいテーブルグループを作成したり、Shard Count を変更したりすることは推奨されません。異なるビジネス要件がある場合は、当社のベストプラクティスに基づいて計画することができます。詳細については、「テーブルグループ設定のベストプラクティス」をご参照ください。
よくある質問
リシャーディングは、一時テーブルの作成、元のテーブルの読み取り専用状態への変更、ターゲットテーブルへの書き込み、テーブル名の変更、同期ステータスの記録など、複数のステップを含む複雑なプロセスです。いずれかのステップで例外が発生した場合、システムの状態が不確定になる可能性があります。以下の方法で問題をトラブルシューティングできます。
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 は、読み取り専用状態を終了したいテーブルの名前を指定します。