ディレクトリベースのシャーディング
ディレクトリベースのシャーディングでは、実行時にキー値とシャードを動的に関連付けることができるため、キー値からシャードへのマッピングを細かく制御できます。
これをシステム管理のシャーディングと比較すると、特に個別キー値が比較的多い(数万から数十万)ものの、ハッシュベースの割当てで均一なデータ分散を実現するには十分な規模でない場合、データ分散が不均一になる可能性があります。
また、これと通常のユーザー定義シャーディングを比較します。これは、スキーマの作成時に指定できる少数の静的キー値に適しています。
ディレクトリベースのシャーディングのユースケース
次のユースケースは、シャード・データベースでディレクトリベースのデータ分散方法を使用する場合に有利な場合を示しています。
システム・シャーディングによる不均等なデータ分散
ディレクトリベースのシャーディングは、個別キー値の数が不十分なため、システム・シャーディングでデータ分散が不均一になる場合に役立ちます
一般的なユース・ケースに、多数のビジネス顧客アカウントのデータを管理するB2Bアプリケーションがあります。ここでは数万規模のアカウントを管理します。
この例の1つにディーラ・アプリケーションがあり、多数のディーラのデータをホストおよび管理します。ディーラ数は数万規模であり、ハッシングによってデータを分散するほど大きくはありません。さらに、様々なディーラのデータの量は大きく異なる可能性があります。一部のディーラは大規模運営ですが、はるかに小規模のディーラもあり、それらすべてをシステム・シャーディング内でのように同じ方法で処理するのは適していません。アプリケーション固有の基準に基づいて、様々なディーラに対して異なるリソースと場所を指定する必要がある場合もあります。
特定のキー値を同じ場所またはチャンクにグループ化
ディレクトリベースのシャーディングは、特定のキー値を同じ場所にグループ化するか、アフィニティ目的でチャンクにグループ化する必要がある場合や、このグループをまとめて効率的に移動できる場合に便利です
この例の1つにSocial Networkアプリケーションがあります。ここでは、同じシャードでメッセージを頻繁に交換する顧客をグループ化すると、シャード間のトラフィックが最小限になります。データをシャード間で移動する場合、再シャーディング中にグループ化を保持する必要があります。一方、グループのメンバーが別のグループのメンバーとの通信をさらに始める場合は、アプリケーションへの影響を最小限に抑えて、そのデータを適切なグループに移動する必要があります。
カスタム・ポリシーベースのシャーディングの実装
ディレクトリベースのシャーディングを使用して、カスタム・ポリシーベースのシャーディング(ラウンドロビン、ランダム、最小データなど)を実装できます。
ディレクトリベースのシャーディングの概念とアーキテクチャ
ディレクトリベースのシャーディングを理解するための主要な概念を次に示します。
- パーティションおよびシャードへのキー値のマッピングは、ディレクトリ表に格納されます。
- ディレクトリ表は、ディレクトリによってシャードされた表が作成されると、シャード・カタログに自動的に作成され、シャードされます。
- シャード・ディレクタ(GSM)およびクライアント側の接続プールは、ルーティングの目的でディレクトリをキャッシュします。キャッシュ内のキー値は暗号化されます。
- 自動割当ルールが有効な挿入のために、行がシャード表に挿入または削除されると、ディレクトリが自動的に更新されます。削除しても、ディレクトリ内のマッピングは自動的には削除されません。
- シャード表には、パーティション情報を含む仮想列が含まれており、パーティション・プルーニングに使用されます。
次の図は、ディレクトリベースのシャーディングの主要なコンポーネントを示しています。ディレクトリ表はシャード・カタログでホストされ、すべてのシャードに複製されます。シャード表は、ディレクトリ表のキー/パーティション・マッピングに基づいて異なるシャードに分散されます。
キー挿入および更新操作はシャード・カタログで実行され、コミット時にシャードと同期的に複製されます。
クライアント・プールは、他のシャーディング・メソッドの場合と同様に、各シャードからキーとチャンク/シャードのマッピングをフェッチします。また、新しいキー・マッピングまたは削除を通知する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のデプロイおよび管理を参照してください。