次の方法で共有


シャード マルチテナント Azure SQL Database を使用した SaaS アプリケーションの新しいテナントのプロビジョニングとカタログ化

適用対象:Azure SQL Database

この記事では、マルチテナント シャード データベース モデルまたはパターンにおける新しいテナントのプロビジョニングとカタログ化について説明します。

この記事には、2 つの主要な部分があります。

  • 新しいテナントのプロビジョニングとカタログ化についての概念的な説明

  • プロビジョニングとカタログ化を実現する PowerShell スクリプト コードに注目したチュートリアル

    • チュートリアルでは、マルチテナント シャード データベース パターンに適合する Wingtip Tickets SaaS アプリケーションを使用します。

データベース パターン

このセクションと、後続のいくつかのセクションでは、マルチ テナント シャード データベース パターンの概念について説明します。

このマルチテナント シャード モデルでは、各データベース内のテーブル スキーマに、テナント データを格納するテーブルの主キー内のテナント キーが含まれます。 テナント キーは、各データベースが 0、1、または複数のテナントを格納できるようにします。 アプリケーション システムは、シャード データベースを使用することで、非常に多数のテナントを簡単にサポートできます。 1 つのテナントのすべてのデータは、1 つのデータベースに格納されます。 多数のテナントは、複数のシャード データベースに分散されます。 各テナントのデータベースへのマッピングは、カタログ データベースに格納されます。

分離とコスト削減

専用のデータベースがあるテナントは、分離の恩恵を享受できます。 このテナントは、他のテナントに対する影響によって制限されることなく、過去の日付に復元されるデータベースを持つことができます。 データベースのパフォーマンスを 1 つのテナント用に最適化するようにチューニングできます。この場合も、他のテナントを損なわずにそれを実行できます。 分離の問題は、他のテナントとのデータベースの共有に比べ、コストがかかることです。

新しいテナントをプロビジョニングするとき、データベースを他のテナントと共有することも、独自の新しいデータベースに配置することもできます。 後で考えが変わったときに、データベースを他の状況に移行させることができます。

複数のテナントがあるデータベースと 1 つのテナントがあるデータベースを同じ SaaS アプリケーション内で混在させて、各テナントのコストまたは分離を最適化できます。

Sharded multi-tenant database app with tenant catalog

テナント カタログ パターン

少なくとも 1 つのテナントが含まれる 2 つ以上のデータベースがある場合、アプリケーションは、現在関心のあるテナントがどのデータベースに格納されているかを検出する方法を備えている必要があります。 カタログ データベースは、このマッピングを格納します。

テナント キー

Wingtip アプリケーションは、テナントごとに一意のキーを派生でき、それがテナント キーになります。 アプリは、Web ページの URL からテナント名を抽出します。 アプリは、名前をハッシュしてキーを取得します。 アプリは、キーを使用してカタログにアクセスします。 カタログは、テナントが格納されているデータベースに関する情報を相互参照します。 アプリは、データベース情報を使用して接続します。 他のテナント キー スキームを使用することもできます。

カタログを使用すると、アプリケーションを中断することなく、プロビジョニング後でもテナント データベースの名前や場所を変更できます。 マルチテナント データベース モデルでは、カタログによってデータベース間のテナントの移動が可能になります。

場所を超えるテナントのメタデータ

カタログは、テナントがメンテナンスやその他のアクションのためにオフラインになっているかどうかを示すこともできます。 さらに、カタログは、他のテナントやデータベースのメタデータを格納するように拡張できます。次のような項目があります。

  • データベースのサービス レベルまたはエディション。
  • データベース スキーマのバージョン。
  • テナント名とその SLA (サービス レベル アグリーメント)。
  • アプリケーションの管理、顧客サポート、または DevOps プロセスを有効にする情報。

また、カタログを使用して、テナント間レポートの作成、スキーマ管理、分析目的のデータ抽出も可能です。

Elastic Database クライアント ライブラリ

Wingtip では、カタログは tenantcatalog データベース内に実装されます。 tenantcatalog は、Elastic Database クライアント ライブラリ (EDCL) のシャード管理機能を使用して作成されます。 このライブラリにより、アプリケーションはデータベースに格納される "シャード マップ" を作成、管理、使用できます。 シャード マップは、テナント キーをシャード、つまりシャード データベースと相互参照します。

テナントのプロビジョニング時に、アプリケーションまたは PowerShell スクリプトから EDCL 関数を使用して、シャード マップのエントリを作成できます。 その後、EDCL 関数を使用して適切なデータベースに接続できます。 EDCL は、接続情報をキャッシュすることで、カタログ データベースへのトラフィックを最小限に抑えて接続プロセスを高速化します。

重要

直接アクセスによるカタログ データベースのデータの編集は実行しないでください。 データ破損のリスクが高いため、直接更新はサポートされません。 代わりに、EDCL API のみを使用してマッピング データを編集してください。

テナントのプロビジョニング パターン

チェック リスト

新しいテナントを既存の共有データベースにプロビジョニングする場合は、共有データベースについて次の問題を考慮する必要があります。

  • 新しいテナントで使用できる十分な容量が残されているか。
  • 新しいテナントが必要とする参照データを含むテーブルがあるか、またはデータを追加できるか。
  • 新しいテナント向けの基本スキーマの適切なバリエーションがあるか。
  • 新しいテナントに近接する適切な場所であるか。
  • 新しいテナントにとって適切なサービス レベルであるか。

新しいテナントを独自のデータベースに分離する場合は、テナントの仕様に適合するデータベースを作成できます。

プロビジョニングが完了したら、カタログにテナントを登録する必要があります。 最後に、適切なシャードを参照するためにテナント マッピングを追加できます。

テンプレート データベース

SQL スクリプトの実行、bacpac のデプロイ、またはテンプレート データベースのコピーによって、データベースをプロビジョニングします。 Wingtip アプリは、テンプレート データベースをコピーして新しいテナント データベースを作成します。

他のアプリケーションと同じように、Wingtip も今後進化していきます。 Wingtip でデータベースの変更が必要になることがあります。 変更には、次の項目が含まれる可能性があります。

  • 新しいまたは変更されたスキーマ。
  • 追加または変更された参照データ。
  • 最適なアプリのパフォーマンスを得るための日常的なデータベース保守タスク。

SaaS アプリケーションにより、これらの変更は、大容量になる可能性のあるテナント データベース全体に体系的な方法でデプロイされる必要があります。 これらの変更が将来のテナント データベースに含まれるようにするには、プロビジョニング プロセスに変更を組み込む必要があります。 この課題については、スキーマの管理に関するチュートリアルで、詳しく検討しています。

スクリプト

このチュートリアルのテナント プロビジョニング スクリプトは、次のシナリオの両方をサポートします。

  • 他のテナントと共有している既存のデータベースにテナントをプロビジョニングする。
  • 独自のデータベースにテナントをプロビジョニングする。

次に、テナント データは初期化され、カタログ シャード マップに登録されます。 サンプル アプリでは、複数のテナントを含むデータベースには、汎用的な名前 (tenants1tenants2 など) が付けられます。 1 つのテナントを含むデータベースには、テナントの名前が付けられます。 カタログを使用すればデータベースに任意の名前を割り当てることができるため、このサンプルで使用されている名前付け規則は、このパターンの重要事項ではありません。

チュートリアルを開始する

このチュートリアルでは、以下の内容を学習します。

  • マルチテナント データベースにテナントをプロビジョニングする
  • シングルテナント データベースにテナントをプロビジョニングする
  • マルチテナント データベースとシングルテナント データベースにテナントをまとめてプロビジョニングする
  • カタログにデータベースとテナント マッピングを登録する

前提条件

このチュートリアルを完了するには、次の前提条件を満たしておく必要があります。

他のテナントと共有しているデータベースにテナントをプロビジョニングする

このセクションでは、PowerShell スクリプトによって実行されるプロビジョニングの主要なアクションの一覧を確認します。 その後、PowerShell ISE デバッガーを使用してスクリプトをステップ実行して、コード内のアクションを確認します。

プロビジョニングの主要なアクション

これから行うプロビジョニング ワークフローの主な要素を次に示します。

  • 新しいテナント キーの計算:ハッシュ関数を使用して、テナント名からテナント キーが作成されます。

  • テナント キーが既に存在するかどうかの確認:キーがまだ登録されていないことを確認するため、カタログがチェックされます。

  • 既定のテナント データベース内でのテナントの初期化:新しいテナント情報を追加するため、テナント データベースが更新されます。

  • カタログへのテナントの登録:新しいテナント キーと既存の tenants1 データベースとの間のマッピングがカタログに追加されます。

  • カタログの拡張テーブルへのテナント名の追加:カタログ内の Tenants テーブルに会場名が追加されます。 この追加は、アプリケーション固有の追加データをサポートするようにカタログ データベースを拡張できる仕組みを示しています。

  • 新しいテナントのイベント ページの表示:ブラウザーで Bushwillow Blues イベント ページが開きます。

    Screenshot that shows the Events page for a new tenant.

デバッガー手順

Wingtip アプリが共有データベースに新しいテナントのプロビジョニングを実装する方法を理解するには、ブレークポイントを追加し、ワークフローをステップ実行します。

  1. PowerShell ISE で、...\Learning Modules\ProvisionTenants\Demo-ProvisionTenants.ps1 を開き、次のパラメーターを設定します。

    • $TenantName = Bushwillow Blues (新しい会場の名前)。
    • $VenueType = blues (事前に定義しておいた会場の種類のいずれか: blues、classicalmusic、dance、jazz、judo、motorracing、multipurpose、opera、rockmusic、soccer (小文字、スペースなし))。
    • $DemoScenario = 1 (他のテナントと共有しているデータベースにテナントをプロビジョニングします)。
  2. ブレークポイントを追加します。追加するためには、38 行目(New-Tenant ` と記述されている行) のどこかにカーソルを置いて、F9 キーを押します。

    Screenshot that highlights the line that includes New Tenant.

  3. F5 キーを押してスクリプトを実行します。

  4. ブレークポイントでスクリプトの実行が停止したら、F11 キーを押してコードにステップ インします。

    Screenshot shows the Windows PowerShell ISE with the Debug menu open and Step Into selected.

  5. 呼び出された関数にステップ オーバーしたりステップ インしたりする F10 キーや F11 キーなどのデバッグのメニュー オプションを使用して、スクリプトの実行をトレースします。

PowerShell スクリプトのデバッグの詳細については、「PowerShell スクリプトの使用とデバッグに関するヒント」を参照してください。

独自のデータベース内にテナントをプロビジョニングする

プロビジョニングの主要なアクション

スクリプトをトレースする間に行うプロビジョニング ワークフローの主な要素を次に示します。

  • 新しいテナント キーの計算:ハッシュ関数を使用して、テナント名からテナント キーが作成されます。

  • テナント キーが既に存在するかどうかの確認:キーがまだ登録されていないことを確認するため、カタログがチェックされます。

  • 新しいテナント データベースの作成:Resource Manager テンプレートを使用して basetenantdb データベースをコピーすることで、データベースが作成されます。 新しいデータベースの名前はテナント名に基づきます。

  • カタログへのデータベースの追加:新しいテナント データベースが、カタログ内にシャードとして登録されます。

  • 既定のテナント データベース内でのテナントの初期化:新しいテナント情報を追加するため、テナント データベースが更新されます。

  • カタログへのテナントの登録:新しいテナント キーと sequoiasoccer データベースとの間のマッピングがカタログに追加されます。

  • カタログへのテナント名の追加:カタログ内のテナント拡張テーブルに会場名が追加されます。

  • 新しいテナントのイベント ページの表示:ブラウザーで Sequoia Soccer イベント ページが開きます。

    events

デバッガー手順

ここで、独自のデータベースにテナントを作成する場合のスクリプト プロセスを説明します。

  1. 引き続き ...\Learning Modules\ProvisionTenants\Demo-ProvisionTenants.ps1 内で、次のパラメーターを設定します。

    • $TenantName = Sequoia Soccer (新しい会場の名前)。
    • $VenueType = soccer (事前に定義しておいた会場の種類のいずれか: blues、classicalmusic、dance、jazz、judo、motorracing、multipurpose、opera、rockmusic、soccer (小文字、スペースなし))。
    • $DemoScenario = 2 (独自のデータベースにテナントをプロビジョニングします)。
  2. 57 行目 (& $PSScriptRoot\New-TenantAndDatabase ` と記述されている行) の任意の場所にカーソルを置いて、F9 キーを押し、新しいブレークポイントを追加します。

    break point

  3. F5 キーを押してスクリプトを実行します。

  4. ブレークポイントでスクリプトの実行が停止したら、F11 キーを押してコードにステップ インします。 F10 キーや F11 キーを使用し、関数にステップ オーバーおよびステップ インして実行をトレースします。

テナントのバッチをプロビジョニングする

この演習では、17 のテナントのバッチをプロビジョニングします。 他の Wingtip Tickets チュートリアルを開始する前に、このテナントをまとめてプロビジョニングして、多くのデータベースを操作できるようにしておくことをお勧めします。

  1. PowerShell ISE で ...\Learning Modules\ProvisionTenants\Demo-ProvisionTenants.ps1 を開き、$DemoScenario パラメーターを 4 に変更します。

    • $DemoScenario = 4 (テナントをまとめて共有データベースにプロビジョニングします)。
  2. F5 キーを押して、スクリプトを実行します。

テナントのデプロイ済みセットを確認する

この段階で、共有データベースにデプロイされたテナントと、独自のデータベースにデプロイされたテナントが混在しています。 Azure Portal を使用して、作成したデータベースを検査できます。 Azure Portal で、SQL サーバーの一覧を表示して tenants1-mt-<USER> サーバーを開きます。 SQL データベースの一覧には、tenants1 共有データベースと、独自データベース内のテナントのデータベースが含まれているはずです。

Screenshot of the tenants1-mt-USER server Overview page that highlights the databases.

Azure Portal でテナント データベースを表示しても、共有データベースの内部のテナントは表示されません。 テナントの全リストは、Wingtip の Events Hub ページでカタログを閲覧することで確認できます。

Wingtip Tickets イベント ハブ ページの使用

ブラウザーで Events Hub ページを開きます (http:events.wingtip-mt.<USER>.trafficmanager.net)

カタログ データベースの使用

テナントの全リストと各テナントに対応するデータベースをカタログで確認できます。 テナント名をデータベース名に結び付ける SQL ビューが用意されています。 このビューは、カタログに格納されているメタデータを拡張するのが有用であることを示す好例です。

  • tenantcatalog データベースで SQL ビューを使用できます。
  • テナント名はテナント テーブルに格納されます。
  • データベース名はシャード管理テーブルに格納されます。
  1. SQL Server Management Studio (SSMS) で、[ログイン] = developer、[パスワード] = P@ssword1 を使用して、catalog-mt.<USER>.database.windows.net にあるテナント サーバーに接続します

    SSMS connection dialog

  2. SSMS オブジェクト エクスプローラーで、tenantcatalog データベースのビューに移動します。

  3. TenantsExtended ビューを右クリックして、[上位 1000 行の選択] を選択します。 別のテナントのテナント名とデータベースとの間のマッピングに注意してください。

    ExtendedTenants view in SSMS

プロビジョニングのその他のパターン

このセクションでは、その他の興味深いプロビジョニング パターンについて説明します。

エラスティック プールでのデータベースの事前プロビジョニング

事前プロビジョニング パターンは、エラスティック プールを使用する際にデータベースではなくプールが課金対象となることを利用します。 そのため、追加コストを発生させることなく、データベースが必要になる前にデータベースをエラスティック プールに追加できます。 この事前プロビジョニングは、データベースにテナントをプロビジョニングするためにかかる時間を大幅に短縮します。 事前にプロビジョニングされるデータベースの数は、予想されるプロビジョニング速度に応じて適切なバッファーを維持できるよう、必要に応じて調整できます。

自動プロビジョニング

自動プロビジョニング パターンでは、専用のプロビジョニング サービスを使用して、必要に応じてサーバー、プール、およびデータベースを自動的にプロビジョニングします。 この自動化には、エラスティック プールへのデータベースの事前プロビジョニングも含まれます。 データベースの使用を停止して削除した場合、それによって発生するエラスティック プール間のずれは、必要に応じてプロビジョニング サービスによって補われます。

この種の自動化サービスは、単純である場合も、複雑になる場合もあります。 たとえば、自動化によって複数の地域にまたがるプロビジョニングが処理され、ディザスター リカバリーのための geo レプリケーションが設定されることがあります。 自動プロビジョニング パターンでは、プロビジョニング サービスによって処理されるプロビジョニング要求がクライアント アプリケーションまたはスクリプトからキューに送信されます。 その後、スクリプトは、完了を検出すためのポーリングを実行します。 事前プロビジョニングを使用した場合、要求はすばやく処理されますが、代替データベースのプロビジョニングはバックグラウンド サービスによって管理されます。

その他のリソース

次のステップ

このチュートリアルで学習した内容は次のとおりです。

  • 1 つの新しいテナントをマルチテナント共有データベースおよび独自のデータベースにプロビジョニングする方法
  • バッチを使って追加のテナントをプロビジョニングする方法
  • テナントをプロビジョニングしてカタログに登録するまでの流れを詳しく確認する方法

パフォーマンスの監視に関するチュートリアルを試してください。