5 シャード・データベース・アプリケーションの設計に関する考慮事項

シャーディングの利点を活用するには、1つのシャードで実行されるデータベース・リクエストの数が最大になるように、SDBのスキーマを設計する必要があります。

次の各項で、シャード・データベース・スキーマの管理に必要な用語と概念について説明します。

シャード・データベース・スキーマ設計の考慮点

データベース・スキーマの設計はシャード・データベース(SDB)のパフォーマンスとスケーラビリティに大きく影響します。スキーマの設計が不適切な場合、データおよびワークロードがシャード間にバランスよく分散されず、マルチシャード操作の割合が大きくなります。

SDBにデータを移入した後で、表をシャーディングまたは複製するかや、シャーディング・キーなど、スキーマの多くの属性を変更することはできません。したがって、SDBをデプロイする前に次の点を慎重に考慮してください。

  • どの表をシャーディングするか?

  • どの表を複製するか?

  • どのシャード表をルート表にするか?

  • 他の表をルート表にリンクするためにどの方法を使用するか?

  • どのシャーディング方法を使用するか?

  • どのシャーディング・キーを使用するか?

  • 使用するスーパー・シャーディング・キー(シャーディング方法がコンポジットである場合)

Oracle Sharding用アプリケーションの開発

シャーディングは、Oracle Databaseのエンタープライズ品質を損なうことなく、ほとんどの要求の厳しいアプリケーションの線形スケーラビリティと完全な障害分離を提供します。厳密な一貫性、SQLの完全活用、JSONによる軽快な開発、セキュリティ、高可用性、バックアップおよびリカバリ、ライフサイクル管理など多くの利点があります。

シャーディングは、独立したデータベース間でデータが水平にパーティション化されるデータ階層アーキテクチャです。このような構成内の各データベースをシャードと呼びます。すべてのシャードが一体的に単一の論理データベースを形成し、これはシャード・データベース(SDB)と呼ばれます。

開発者は、3つのシャーディング方法を使用できます。

  • システム管理のシャーディングでは、ユーザーがシャードへのデータのマッピングを指定する必要はありません。コンシステント・ハッシュによるパーティション化を使用して、データが自動的にシャード間に分散されます。パーティション化アルゴリズムにより、線形スケーラビリティのためにデータがシャード間に均一およびランダムに分散されます。

  • コンポジット・シャーディングでは、コンシステント・ハッシュによりパーティション化された表のデータの異なるサブセットについて、複数のシャード領域を作成できます。コンポジット・シャーディングはOracle独自の機能であり、データのサブセットを異なる地理的場所に格納するためにSDB内のデータのサブセットを区別し、それらに別々のハードウェア・リソースを割り当て、各サブセット内でパフォーマンスを柔軟に向上させる機能を開発者に提供します。

  • ユーザー定義のシャーディングでは、個々のシャードへのデータのマッピングをユーザーが明示的に指定できます。これは、パフォーマンスや規制などの理由で、特定のデータを特定のシャードに格納する必要があり、管理者がシャード間のデータの移動を完全に制御する必要がある場合に使用します。

Oracle Shardingは表のパーティション化に基づいており、Oracle Databaseで提供されるすべてのサブパーティション方法がシャーディングでもサポートされます。

シャーディングは、シャード・データベース・アーキテクチャに適したアプリケーションを対象としています。具体的には、次のことに注意してください。

  • アプリケーションには、シャーディング・キーを使用して最初にデータにアクセスする、明確に定義されたデータ・モデルおよびデータ分散戦略(システム管理(整合性ハッシュ)またはコンポジット)が必要です。シャーディング・キーの例には、顧客ID、アカウント番号、country_idなどがあります。

  • データ・モデルは、単一のルート表を持つ階層ツリー構造である必要があります。Oracle Shardingは任意のレベル数の階層をサポートします。

  • システム管理のシャーディング方法の場合、シャーディング・キーはカーディナリティが高い列に基づいている必要があります。この列の一意の値の数は、シャードの数より大幅に多い必要があります。たとえば、顧客IDはシャーディング・キーのよい候補ですが、米国の州名は適していません。

  • シャーディング・キーが非常に安定していて、その値がほとんど変更されることがない必要があります。

  • シャーディング・キーはすべてのシャード表に存在する必要があります。これにより、シャーディング・キーに基づく等価パーティション表のファミリを作成できます。シャーディング・キーは、ルート表の主キーの最初の列である必要があります。

  • 表ファミリ内の表の結合は、シャーディング・キーを使用して実行する必要があります。

  • コンポジット・シャーディングを使用すると、2つのレベルのシャーディング(リストまたは範囲によるシャーディングとコンシステント・ハッシュによるシャーディング)を行うことができます。これは、2つのキー(スーパー・シャーディング・キーおよびシャーディング・キー)を提供するアプリケーションによって実現されます。 

  • 高いパフォーマンスおよび障害分離を必要とするすべてのデータベース・リクエストは、単一の値のシャーディング・キーに関連付けられているデータにのみアクセスする必要があります。データベース接続を確立するときに、アプリケーションはシャーディング・キーを渡す必要があります。これに該当する場合、リクエストは適切なシャードに直接ルーティングされます。

    複数のリクエストは、それらがすべて同じシャーディング・キーに関連しているかぎり、同じセッションで実行できます。通常、そのようなトランザクションは数十行または数百行にアクセスします。単一シャードのトランザクションの例としては、オーダー入力、顧客の請求書レコードの検索と更新、およびサブスクライバのドキュメントの検索と更新があります。

  • 複数の値のシャーディング・キーに関連付けられているデータ、またはシャーディング・キーの値が不明なデータにアクセスする必要があるデータベース・リクエストは、複数のシャードでの問合せのパラレル実行を調整する問合せコーディネータから実行する必要があります。

  • アプリケーションはOracleの統合接続プール(UCP、OCI、ODP.NET、JDBC)を使用して、シャード・データベースに接続します。

  • 直接ルーティングおよびプロキシ・ルーティングには、個別の接続プールを使用する必要があります。直接ルーティングの場合は、読取り書込みワークロードおよび読取り専用ワークロードのために、個別のグローバル・サービスを作成する必要があります。これは、Data Guardレプリケーションが使用されている場合にのみ当てはまります。プロキシ・ルーティングの場合は、シャード・カタログ・データベースでGDS$CATALOGサービスを使用します。