既存のデータベースを移行してスケール アウト

適用対象:Azure SQL Database

ツール (Elastic Database クライアント ライブラリなど) を使用して、既存のスケールアウトされたシャード化されたデータベースを簡単に管理できます。 最初に、 シャード マップ マネージャーを使用するように既存のデータベース セットを変換します。

概要

既存のシャード化されたデータベースを移行するには:

  1. シャード マップ マネージャー データベースを準備します。
  2. シャード マップを作成します。
  3. 個々のシャードを準備します。
  4. シャード マップにマッピングを追加します。

これらの方法は、.NET Framework クライアント ライブラリまたは Azure SQL Database - Elastic Database ツール スクリプトに関するページにある PowerShell スクリプトを使用して実装できます。 この例では、PowerShell スクリプトを使用します。

ShardMapManager の詳細については、「 シャード マップの管理」を参照してください。 Elastic Database ツールの概要については、Elastic Database 機能の概要に関するページを参照してください。

シャード マップ マネージャー データベースを準備する

シャード マップ マネージャーは、スケールアウトされたデータベースを管理するためのデータを格納する特殊なデータベースです。 既存のデータベースを使用するか、新しいデータベースを作成できます。 シャード マップ マネージャーとして機能するデータベースは、シャードと同じデータベースにすることはできません。 PowerShell スクリプトではデータベースが自動的に作成されません。

手順 1:シャード マップ マネージャーを作成する

# Create a shard map manager
New-ShardMapManager -UserName '<user_name>' -Password '<password>' -SqlServerName '<server_name>' -SqlDatabaseName '<smm_db_name>'
#<server_name> and <smm_db_name> are the server name and database name
# for the new or existing database that should be used for storing
# tenant-database mapping information.

シャード マップ マネージャーを取得するには

作成した後は、次のコマンドレットでシャード マップ マネージャーを取得できます。 この手順は、ShardMapManager オブジェクトを使用する必要があるたびに必要です。

# Try to get a reference to the Shard Map Manager  
$ShardMapManager = Get-ShardMapManager -UserName '<user_name>' -Password '<password>' -SqlServerName '<server_name>' -SqlDatabaseName '<smm_db_name>'

手順 2:シャード マップを作成する

作成するシャード マップの種類を選択します。 何を選択するかはデータベースのアーキテクチャによって異なります。

  1. データベースごとに 1 つのテナント (用語については「 用語集」を参照)
  2. データベースごとに複数のテナント (2 種類):
    1. リスト マッピング
    2. 範囲マッピング

シングルテナント モデルの場合は、 リスト マッピング シャード マップを作成します。 シングルテナント モデルでは、テナントごとに 1 つのデータベースが割り当てられます。 これは、管理が簡単なので、SaaS 開発者に有効なモデルです。

List mapping

マルチテナント モデルでは、個々のデータベースに複数のテナントが割り当てられます (そして、テナントのグループを複数のデータベースに分散させることができます)。 各テナントで必要なデータが少ない場合は、このモデルを使用します。 このモデルでは、範囲マッピングを使用してデータベースにテナントの範囲を割り当てます。

Range mapping

または、リスト マッピングを使用して複数のテナントを個々のデータベースに割り当てることにより、マルチテナント データベース モデルを実装できます。 たとえば、ID が 1 と 5 のテナントに関する情報を DB1 に格納し、DB2 にテナント 7 と 10 のデータを格納する、といったことができます。

Multiple tenants on single DB

以上の選択を基にして、次のいずれかのオプションを選択します。

オプション 1: リスト マッピングのシャード マップを作成する

ShardMapManager オブジェクトを使用してシャード マップを作成します。

# $ShardMapManager is the shard map manager object
$ShardMap = New-ListShardMap -KeyType $([int]) -ListShardMapName 'ListShardMap' -ShardMapManager $ShardMapManager

オプション 2:範囲マッピングのシャード マップを作成する

このマッピング パターンを使用する場合は、テナント ID の値が連続した範囲である必要があります。データベースを作成するときに範囲をスキップすることで、範囲にギャップが存在していてもかまいません。

# $ShardMapManager is the shard map manager object
# 'RangeShardMap' is the unique identifier for the range shard map.  
$ShardMap = New-RangeShardMap -KeyType $([int]) -RangeShardMapName 'RangeShardMap' -ShardMapManager $ShardMapManager

オプション 3:単一データベースでのリスト マッピング

このパターンを設定するには、手順 2、オプション 1 で示したようなリスト マップも作成する必要があります。

手順 3:個々のシャードを準備する

各シャード (データベース) をシャード マップ マネージャーに追加します。 これは、マッピング情報を格納するための個々のデータベースの準備です。 各シャードで次のメソッドを実行します。

Add-Shard -ShardMap $ShardMap -SqlServerName '<shard_server_name>' -SqlDatabaseName '<shard_database_name>'
# The $ShardMap is the shard map created in step 2.

手順 4:マッピングを追加する

マッピングの追加は、作成したシャード マップの種類によって異なります。 リスト マップを作成した場合は、リスト マッピングを追加します。 範囲マップを作成した場合は、範囲マッピングを追加します。

オプション 1: リスト マッピングのデータをマップする

各テナントのリスト マッピングを追加することで、データをマップします。

# Create the mappings and associate it with the new shards
Add-ListMapping -KeyType $([int]) -ListPoint '<tenant_id>' -ListShardMap $ShardMap -SqlServerName '<shard_server_name>' -SqlDatabaseName '<shard_database_name>'

オプション 2:範囲マッピングのデータをマップする

すべてのテナント ID 範囲の範囲マッピングを追加します (データベースの関連付け)。

# Create the mappings and associate it with the new shards
Add-RangeMapping -KeyType $([int]) -RangeHigh '5' -RangeLow '1' -RangeShardMap $ShardMap -SqlServerName '<shard_server_name>' -SqlDatabaseName '<shard_database_name>'

手順 4、オプション 3:単一データベースの複数テナントのデータをマップする

各テナントに対し、Add-ListMapping を実行します (オプション 1)。

マッピングの確認

既存のシャードおよびそれらに関連付けられているマッピングに関する情報は、次のコマンドを使用してクエリできます。

# List the shards and mappings
Get-Shards -ShardMap $ShardMap
Get-Mappings -ShardMap $ShardMap

まとめ

セットアップが完了すると、Elastic Database クライアント ライブラリの使用を開始できます。 データ依存ルーティングおよびマルチシャード クエリを使用することもできます。

次のステップ

Azure Elastic Database ツール スクリプトから PowerShell スクリプトを取得します。

Elastic Database Tools クライアント ライブラリは、GitHub の Azure/elastic-db-tools で入手できます。

マルチテナント モデルとシングルテナント モデルの間でデータを移動するには、分割/マージ ツールを使用します。 分割/マージ ツールを参照してください。

その他のリソース

マルチテナント SaaS (サービスとしてのソフトウェア) データベース アプリケーションの一般的なデータ アーキテクチャ パターンについては、Azure SQL Database を使用するマルチテナント SaaS アプリケーションの設計パターンに関する記事を参照してください。

質問と機能に関する要望

ご質問がある場合は、SQL Database に関する Microsoft Q&A 質問ページを参照してください。機能に関するご要望は、SQL Database に関するフィードバック フォーラムにお寄せください。