Hologres は、高パフォーマンスでコンピューティングとストレージを分離した、オールインワンの分散リアルタイムデータウェアハウスエンジンです。基盤となるストレージシステムにあるシャードにデータを格納します。このトピックでは、Hologres のテーブルグループとシャード数について説明します。
テーブルグループとシャード数
Hologres では、データは Apsara Distributed File System のシャードに格納されます。テーブルグループはストレージロジックに似ており、これらのシャードを管理するために使用されます。テーブル内のデータは、固定のシャードグループに格納されます。Hologres テーブルにデータが書き込まれると、データは分散キーに基づいて特定のシャードに分散されます。テーブルが作成されると、テーブルにデータを格納するための一連のシャードが割り当てられます。このシャードのグループは、テーブルグループと呼ばれます。
テーブルグループは、Hologres 固有の論理ストレージの概念です。PostgreSQL にはこの概念はありません。テーブルグループは、PostgreSQL のテーブルスペースとは異なります。テーブルスペースは、データベースオブジェクトの格納場所を一意に識別し、ディレクトリに似ています。テーブルグループは、基盤となる論理シャードのグループを表します。
次の図は、テーブルグループを明確に示しています。図に基づいて、次の関係を推測できます。
テーブルグループとスキーマの関係
スキーマは標準のデータベース概念ですが、テーブルグループは標準のデータベース概念ではなく、論理ストレージ概念です。異なるスキーマのテーブルは、同じテーブルグループに属することができます。つまり、基盤となるレイヤーでは、同じシャードグループを使用してこれらのテーブルにデータが格納されます。
テーブルグループとデータベースの関係
データベースには 1 つ以上のテーブルグループが含まれ、各データベースには 1 つのテーブルグループのみを含めることができます。データベースを作成すると、Hologres はデフォルトのテーブルグループを作成します。ビジネス要件に基づいて、テーブルグループを追加したり、デフォルトのテーブルグループを変更したりできます。
異なるテーブルグループ間の関係
データベースには複数のテーブルグループを含めることができます。シャードはこれらのテーブルグループ間で共有されず、各シャードはインスタンス内で一意の ID を持ちます。
シャード数
テーブルグループ内のシャードの数は、シャード数と呼ばれます。テーブルグループを作成するときにシャード数を指定する必要があります。後でシャード数を変更することはできません。シャード数を変更するには、別のテーブルグループを作成する必要があります。
テーブルとシャードの関係
シャードは、テーブル内のデータの格納とクエリに使用されます。Hologres は、分散キーに基づいて、データが分散されるシャードを決定します。分散キーがない場合、データはシャードにランダムに割り当てられます。
テーブルグループには複数のテーブルを含めることができます。つまり、複数のテーブルが同じシャードグループに属することができます。ただし、テーブルは 1 つのテーブルグループにのみ属することができます。テーブルグループにテーブルが含まれていない場合、Hologres はテーブルグループを自動的に削除します。
テーブルを再作成するか、テーブルを別のテーブルグループに移動するために使用される関数を呼び出さない限り、テーブルを別のテーブルグループに移動することはできません。
シャード数とワーカーコンピューティングノードの関係
Hologres では、ストレージエンジンを使用してデータの管理と処理を行います。データ操作言語 (DML) では、ストレージエンジンは単一またはバッチの作成、読み取り、更新、削除 (CRUD) 操作を提供します。クエリエンジンは、これらの操作を呼び出してシャード上のデータにアクセスし、高パフォーマンスのデータ書き込みまたは読み取りを実装できます。
次の図は、ワーカー、ストレージエンジン、およびシャード数の関係を示しています。次の図は、テーブルグループとシャード数がストレージ割り当てとワーカーにどのように関連しているかを示しています。
データベースを作成するときに、テーブルグループを作成し、各テーブルグループのシャード数を設定できます。各ワーカーは複数の内部ストレージエンジンを作成し、各ストレージエンジンはシャードからデータを読み取り、シャードにデータを書き込みます。データベースの作成時にテーブルグループの数とシャード数を指定しない場合、Hologres はデフォルトのテーブルグループを作成し、テーブルグループのデフォルトのシャード数を設定します。詳細については、「インスタンス管理」をご参照ください。
Hologres は、ストレージエンジンが各ワーカーに均等に分散されるようにします。これにより、リソースをワーカー間で均等に割り当てることができます。
Hologres は、テーブルグループ内のシャードが複数のワーカーに分散されるようにします。これにより、テーブルグループが 1 つのワーカーに割り当てられ、他のワーカーがアイドル状態になるという不均等なリソース割り当てを防ぎます。ただし、テーブルグループのシャード数がインスタンス内のワーカーの数に比例しない場合、シャードを一部のワーカーに割り当てることができず、これらのワーカーはアイドル状態になります。シャード数を指定する場合は、インスタンス内の合計シャード数がワーカーの数に比例するようにしてください。
前の図では、
Table Group 1
には 3 つのシャードが含まれていますが、これらのシャードは 2 つのワーカーに割り当てられています。これは、テーブルグループのシャード数がワーカーの数に比例していないことを意味します。したがって、ワーカーに割り当てられるシャード数は、他のワーカーに割り当てられるシャード数よりも 1 つ多くなります。この場合、リソースはワーカーに不均等に割り当てられ、ロングテールが発生します。これを解決するには、シャード数を変更して、シャード数がワーカーの数に比例するようにすることをお勧めします。次の図では、Table Group 1
とTable Group 2
の合計シャード数はワーカーの数の倍数です。リソースはワーカーに均等に割り当てることができます。メモリ不足 (OOM) などの理由でワーカーがフェイルオーバーした場合、Hologres はこのワーカーに対応するシャードを他の正常なワーカーに自動的に割り当てます。これにより、各正常なワーカーにシャードが均等に割り当てられます。次の例では、インスタンスに 4 つのワーカーがあり、2 つのテーブルグループに 8 つのシャードが含まれています。もともと、各ワーカーには 2 つのストレージエンジンがあり、ストレージエンジンは 2 つのシャードに対応しています。
Worker 4
(Shard 7
とShard 8
が割り当てられている)がフェイルオーバーした後、Shard 7
とShard 8
は他の 3 つのワーカーにすぐに割り当てられます。シャードは 2 つしかないため、システムはランダムに 2 つのワーカーを選択してシャードを割り当てます。これにより、各ワーカーのストレージエンジンの数が基本的に均等になります。
まとめ
ワーカーの数は、シャード数と密接に関係しています。テーブルグループの数とシャード数が適切に設定されている場合、データは高並行で書き込み、クエリ、分析できます。これにより、リソースの使用率とデータストレージおよびコンピューティング効率が向上します。テーブルグループの数とシャード数が適切に設定されていない場合、パフォーマンスが期待どおりにならない可能性があり、長期的には最適化できません。
テーブルグループのシャード数が多い場合、データは高並行で書き込み、クエリ、分析できます。ただし、シャード数が多いほどパフォーマンスが向上するとは限りません。シャードが増えると、より多くの通信とコンピューティングリソースとより大きなメモリスペースが必要になります。この観点から、リソースが不足している場合、または少量のデータのみがクエリされる場合、シャード数を増やすと逆効果になる可能性があります。
Hologres では、シャード数の下限は 1 です。データ量が数百または数千レコードのみの場合、シャード数を 1 に設定できます。原則として、シャード数の上限はインスタンスのコンピューティングコアの総数です。これにより、各シャードが計算用に少なくとも 1 つのコアを占有できます。シャード数がコンピューティングコアの数を超えると、一部のシャードはクエリ中に常に CPU リソースを割り当てることができません。これにより、ロングテールとフェイルオーバーのオーバーヘッドが発生する可能性があります。
シャード数と同様に、テーブルグループの数は適切な値に設定する必要があります。シャードは、使用中かどうかに関係なく、テーブル内のメタデータやスキーマなどの情報を格納するために、特定のメモリスペースを占有します。テーブルにデータが書き込まれると、シャードはより多くのメモリスペースを占有します。インスタンス内のシャードの総数はテーブルグループの数とともに増加し、その結果、メモリスペースが大きくなります。さらに、互いに関連する複数のテーブルでローカル結合操作を実行する場合、これらのテーブルは同じテーブルグループに属している必要があります。
ディスクの観点からは、同じテーブルの場合、シャードが多いほどデータが分散し、小さなファイルが出現しやすく、ファイルの数が増えます。多数のテーブルとシャードが存在する場合、ファイルの数は非常に大きくなります。その結果、クエリとフェイルオーバー中にさらにオーバーヘッドが必要になり、クエリ I/O が増加し、リカバリ時間が長くなります。