ディレクトリベースのシャーディング

ディレクトリベースのシャーディングでは、実行時にキー値とシャードを動的に関連付けることができるため、キー値からシャードへのマッピングを細かく制御できます。

これをシステム管理のシャーディングと比較すると、特に個別キー値が比較的多い(数万から数十万)ものの、ハッシュベースの割当てで均一なデータ分散を実現するには十分な規模でない場合、データ分散が不均一になる可能性があります。

また、これと通常のユーザー定義シャーディングを比較します。これは、スキーマの作成時に指定できる少数の静的キー値に適しています。

ディレクトリベースのシャーディングのユースケース

次のユースケースは、シャード・データベースでディレクトリベースのデータ分散方法を使用する場合に有利な場合を示しています。

システム・シャーディングによる不均等なデータ分散

ディレクトリベースのシャーディングは、個別キー値の数が不十分なため、システム・シャーディングでデータ分散が不均一になる場合に役立ちます

一般的なユース・ケースに、多数のビジネス顧客アカウントのデータを管理するB2Bアプリケーションがあります。ここでは数万規模のアカウントを管理します。

この例の1つにディーラ・アプリケーションがあり、多数のディーラのデータをホストおよび管理します。ディーラ数は数万規模であり、ハッシングによってデータを分散するほど大きくはありません。さらに、様々なディーラのデータの量は大きく異なる可能性があります。一部のディーラは大規模運営ですが、はるかに小規模のディーラもあり、それらすべてをシステム・シャーディング内でのように同じ方法で処理するのは適していません。アプリケーション固有の基準に基づいて、様々なディーラに対して異なるリソースと場所を指定する必要がある場合もあります。

特定のキー値を同じ場所またはチャンクにグループ化

ディレクトリベースのシャーディングは、特定のキー値を同じ場所にグループ化するか、アフィニティ目的でチャンクにグループ化する必要がある場合や、このグループをまとめて効率的に移動できる場合に便利です

この例の1つにSocial Networkアプリケーションがあります。ここでは、同じシャードでメッセージを頻繁に交換する顧客をグループ化すると、シャード間のトラフィックが最小限になります。データをシャード間で移動する場合、再シャーディング中にグループ化を保持する必要があります。一方、グループのメンバーが別のグループのメンバーとの通信をさらに始める場合は、アプリケーションへの影響を最小限に抑えて、そのデータを適切なグループに移動する必要があります。

カスタム・ポリシーベースのシャーディングの実装

ディレクトリベースのシャーディングを使用して、カスタム・ポリシーベースのシャーディング(ラウンドロビン、ランダム、最小データなど)を実装できます。

ディレクトリベースのシャーディングの概念とアーキテクチャ

ディレクトリベースのシャーディングを理解するための主要な概念を次に示します。

  • パーティションおよびシャードへのキー値のマッピングは、ディレクトリ表に格納されます。
  • ディレクトリ表は、ディレクトリによってシャードされた表が作成されると、シャード・カタログに自動的に作成され、シャードされます。
  • シャード・ディレクタ(GSM)およびクライアント側の接続プールは、ルーティングの目的でディレクトリをキャッシュします。キャッシュ内のキー値は暗号化されます。
  • 自動割当ルールが有効な挿入のために、行がシャード表に挿入または削除されると、ディレクトリが自動的に更新されます。削除しても、ディレクトリ内のマッピングは自動的には削除されません。
  • シャード表には、パーティション情報を含む仮想列が含まれており、パーティション・プルーニングに使用されます。

次の図は、ディレクトリベースのシャーディングの主要なコンポーネントを示しています。ディレクトリ表はシャード・カタログでホストされ、すべてのシャードに複製されます。シャード表は、ディレクトリ表のキー/パーティション・マッピングに基づいて異なるシャードに分散されます。

図2-9 ディレクトリベースのシャーディング・アーキテクチャ



キー挿入および更新操作はシャード・カタログで実行され、コミット時にシャードと同期的に複製されます。

クライアント・プールは、他のシャーディング・メソッドの場合と同様に、各シャードからキーとチャンク/シャードのマッピングをフェッチします。また、新しいキー・マッピングまたは削除を通知するFANイベントもサブスクライブします。

ディレクトリベースのシャーディングはユーザー定義のシャーディング方法の拡張であるため、ユーザー定義のシャーディング方法およびいくつかの例については、ユーザー定義シャーディングを参照してください。

ディレクトリベースのシャーディングでのシャード表の作成

ディレクトリベースのシャード表は、CREATE SHARDED TABLE文でPARTITION BY DIRECTORYを使用して作成されます。

たとえば:

CREATE SHARDED TABLE customers
( id             NUMBER NOT NULL
, name           VARCHAR2(30)
, address        VARCHAR2(30)
, status         VARCHAR2(1)
,
CONSTRAINT cust_pk PRIMARY KEY(id)
)
PARTITION BY DIRECTORY (id)
( PARTITION p1 TABLESPACE tbs1,
  PARTITION p2 TABLESPACE tbs2,
  PARTITION p3 TABLESPACE tbs3…);

ノート:

  • ユーザー定義シャーディングとは異なり、CREATE TABLE文のパーティションにキー値は指定されません。

  • ディレクトリ表は、ルート表の作成時に自動的に作成されます。ディレクトリ表の定義は次のとおりです。

    <shard_user_schema>.<root_table>$SDIR

オブジェクトの作成、ディレクトリベースのシャード・データベースのデプロイおよび管理の詳細は、ディレクトリベースのOracle Globally Distributed Databaseのデプロイおよび管理を参照してください。