split-merge サービスをデプロイして、シャード化されたデータベース間でデータを移動する
適用対象: Azure SQL データベース
split-merge ツールを使用すると、シャード化されたデータベース間でデータを移動できます。 「スケールアウトされたクラウド データベース間のデータ移動]を参照してください。
Note
分割/マージ ツールは、Azure Web Apps を対象としています。 Cloud Services (クラシック) のサポート終了日は 2024 年 8 月 31 日です。 Cloud Services (クラシック) で分割/マージ ツールを使用していた場合は、2024 年 8 月 31 日より前に Azure Web Apps に移行してください。
前提条件
Split-Merge ステータス データベースとして使用する SQL データベースを作成します。 Azure ポータルにアクセスします。 新しい SQL Databaseを作成します。 データベースに名前を付けて、新しい管理者とパスワードを作成します。 今後の使用のために、パスワードと名前を必ず記録しておいてください。
Azure の論理サーバーで Azure サービスによる接続が許可されていることを確認します。 Azure ポータルの論理サーバーの [ファイアウォール設定] で、 [Azure サービスへのアクセスを許可する] 設定が [オン] に設定されていることを確認してください。 [Save](保存) アイコンを選択します。
診断の出力用の Azure Storage アカウントを作成します。
パブリックの split/merge docker イメージを使用するか、split/merge Docker イメージを Azure Container Service または選択した Docker レジストリにプッシュします。
サービス用に 2 つの Azure Web Apps を作成する
2 つの Web アプリ (worker
と UI
Web アプリ) を作成します。
Worker Web アプリ
Azure portal で Web アプリを作成します。
[公開] フィールドで、[コンテナー] を選択します。
[オペレーティング システム] では [Windows] を選択します。
[Docker] タブに進みます。
次の情報を入力します。
画像ソース:Docker hub
アクセスの種類:Public
[Image and tag](イメージとタグ):mcr.microsoft.com/splitmerge/splitmergeworker:20240812.1
[確認 + 作成] を使用して Web アプリを作成します。
UI Web アプリ
UI Web アプリを作成するには、1 つ違う点を除いて、Worker Web アプリの作成に使用したのと同じ手順に従います。
- [Image と tag] フィールド内の別の Docker イメージ:
mcr.microsoft.com/splitmerge/splitmergeweb:20240812.1
Split-Merge Web アプリを構成する
セキュリティを構成する
サービスのセキュリティを構成する詳細な手順については、「Split-Merge セキュリティ構成」を参照してください。
このチュートリアルの簡単なテスト デプロイのため、最小限の構成の手順セットを行ってサービスを起動および実行します。 以下の手順では、サービスを実行する 1 つのコンピューター/アカウントのみがサービスと通信できます。
自己署名証明書と PFX ファイルを作成する
PowerShell を使用して、自己署名証明書と PFX ファイルを作成します。
まず、新しいディレクトリを作成します。 次に、それに応じてインライン値を置き換え、新しいディレクトリから次の PowerShell コマンドを実行します。
$cert = New-SelfSignedCertificate -Subject "CN=*.cloudapp.net" -CertStoreLocation "Cert:\CurrentUser\My" -KeyExportPolicy Exportable -KeySpec Signature -KeyLength 2048 -KeyAlgorithm RSA -HashAlgorithm SHA256
$mypwd = ConvertTo-SecureString -String "{myPassword}" -Force -AsPlainText ## Replace {myPassword}
Export-PfxCertificate -Cert $cert -FilePath "C:\Users\admin\Desktop\$certname.pfx" -Password $mypwd ## Specify your preferred location
PFX ファイルを Web アプリにアップロードし、証明書の使用を有効にします
worker
と UI
Web Apps の両方について、次の手順を繰り返します。
- Azure ポータルにアクセスします。
- [App Services] を選択します。
- 上記で分割/マージ ツール用に作成した Web アプリを選択します。
- 一覧から 証明書 を選択します。
- [Bring your own certificates (.pfx)] を選択します。
- バーから [証明書の追加] を選択します。
- PFX ファイルを選択し、前述と同じパスワードを入力します。
- 完了したら、一覧内の新しいエントリから証明書の拇印をコピーします。
- [Web アプリ] メニューで、[設定] / [構成] を開きます。
- [Client certificate mode](クライアント証明書モード) を
Require
に設定します。
Web アプリ構成
worker
と UI
Web Apps の両方について、次の手順を繰り返します。
配置された Web アプリを開き、[設定]>[環境変数]>[アプリ設定] に移動します。 [追加] を選択します。
ElasticScaleMetadata という名前の変数と、以前に配置した状態データベースの接続文字列を含む値を追加します。
重要
現時点では、状態データベースでラテン語の照合順序 (
SQL\_Latin1\_General\_CP1\_CI\_AS
) を使用する必要があります。 詳細については、「Windows 照合順序名」を参照してください。Azure SQL Database では、通常、接続文字列の形式は次のようになります。
Server=<serverName>.database.windows.net; Database=<databaseName>;User ID=<userId>; Password=<password>; Encrypt=True; Connection Timeout=30
変数を追加します:
名前 値 WorkerRoleSynchronizationStorageAccountConnectionString 以前に作成した Azure ストレージへの有効な接続文字列。 DataEncryptionPrimaryCertificateThumbprint 以前に生成された証明書のサムプリント。 MetadataExpirationPeriodInMinutes 20160 MaxRetryCount 5 WEBSITE_LOAD_CERTIFICATES * WEBSITE_PULL_IMAGE_OVER_VNET 0 [適用] を選択し、アプリケーションを再起動します。
worker
とUI
Web アプリについて、同じ手順を繰り返します。
デプロイのトラブルシューティング
Web ロールのオンライン化に失敗した場合は、セキュリティの構成に問題があると考えられます。 TLS/SSL が前の説明どおりに構成されていることをご確認ください。
worker ロールのオンライン化に失敗した場合に最も考えられるのは、先に作成した状態データベースへの接続に問題があることです。
接続文字列が正確であることを確認してください。
サーバーとデータベースが存在し、ユーザー ID とパスワードが正しいことを確認します。
Azure SQL Database の場合、接続文字列の形式は次のようにする必要があります。
Server=<serverName>.database.windows.net; Database=<databaseName>;User ID=<user>; Password=<password>; Encrypt=True; Connection Timeout=30
サーバー名が
https://
で始まっていないことを確認します。サーバーで Azure サービスからの接続が許可されていることを確認します。 これを行うには、ポータルでご自身のデータベースを開き、[Azure サービスへのアクセスを許可する] 設定が [オン] に設定されていることを確認してください。
サービス デプロイのテスト
Web ブラウザーへの接続
UI
Web アプリの [概要] に移動し、[参照] を選択します。 プロンプトが表示されたら、正しい認定資格証を選択します。
PowerShell スクリプトでのテスト
付属の PowerShell スクリプト サンプルを実行して、デプロイメントと環境をテストできます。
重要
このサンプル スクリプトは PowerShell 5.1 で実行してください。 現時点では、PowerShell 6 以降では実行できません。
付属のスクリプト ファイルは、次のとおりです。
SetupSampleSplitMergeEnvironment.ps1
- split-merge のテスト データ層を設定します。- シャードのマップ マネージャー データベースを作成します。
- 2 つのシャード データベースを作成します。
- これらのデータベース用のシャード マップを作成します (これらのデータベースに関する既存のシャード マップを削除します)。
- 両シャード上に小さいサンプル テーブルを作成し、いずれかのシャードで、このテーブルにデータを読み込みます。
- シャード化したテーブルの SchemaInfo を宣言します。
ExecuteSampleSplitMerge.ps1
- テスト データ層に対してテスト操作を実行します。- データを半分に分割して最初のシャードから 2 番目のシャードに渡す分割要求を Split-Merge サービスの Web フロントエンドに送信します。
- 分割要求の状態を Web フロントエンドに対してポーリングし、要求が完了するまで待機します。
- 2 番目のシャードから最初のシャードにデータを戻すための移動を求めるマージ要求を、Split-Merge サービスの Web フロントエンドに送信します。
- マージ要求の状態を Web フロントエンドに対してポーリングし、要求が完了するまで待機します。
GetMappings.ps1
– シャード マッピングの現在の状態が表示される最上位のサンプル スクリプトです。ShardManagement.psm1
– ShardManagement API をラップするヘルパー スクリプトです。SqlDatabaseHelpers.psm1
– SQL Database のデータベースを作成および管理するためのヘルパー スクリプトです。
PowerShell でのデプロイの確認
新しい PowerShell ウィンドウを開き、Split-Merge パッケージをダウンロードしたディレクトリに移動し、"PowerShell" ディレクトリに移動します。
サーバーを作成 (または既存のサーバーを選択) します。ここでシャード マップ マネージャーとシャードが作成されます。
注意
SetupSampleSplitMergeEnvironment.ps1
スクリプトは、これらのデータベースをすべて同じサーバー上に既定で作成します。これはスクリプトの簡潔さを維持するためです。 Split-Merge サービス自体の制約ではありません。Split-Merge サービスでデータを移動してシャード マップを更新するためには、データベースへの読み取りと書き込みのアクセス権のある SQL 認証ログインが必要になります。 Split-Merge サービスはクラウドで実行するため、現時点では統合認証はサポートしていません。
これらのスクリプトを実行するマシンの IP アドレスからのアクセスを許可するようにサーバーが構成されていることをご確認ください。 この設定は、[SQL サーバー]/[ファイアウォール] と [仮想ネットワーク]/[クライアント IP アドレス] の下で確認できます。
SetupSampleSplitMergeEnvironment.ps1
スクリプトを実行して、サンプル環境を作成します。このスクリプトを実行すると、シャード マップ マネージャー データベース上にある既存のシャード マップ管理データ構造とシャードはすべて消去されます。 これは、シャード マップやシャードの再初期化を希望する場合、スクリプトを再実行するのに便利です。
サンプルのコマンド ライン:
.\SetupSampleSplitMergeEnvironment.ps1 ^ -UserName 'mysqluser' -Password 'MySqlPassw0rd' -ShardMapManagerServerName 'abcdefghij.database.windows.net'
サンプル環境に現在あるマッピングを表示するには、Getmappings.ps1 スクリプトを実行します。
.\GetMappings.ps1 ^ -UserName 'mysqluser' -Password 'MySqlPassw0rd' -ShardMapManagerServerName 'abcdefghij.database.windows.net'
ExecuteSampleSplitMerge.ps1
スクリプトを実行して、分割操作を実行 (データの半分を最初のシャードから 2 番目のシャードに移動) し、次にマージ操作を実行 (データを最初のシャードに戻すために移動) します。 TLS が構成済みで、http エンドポイントが無効のままになっている場合は、代わりに https:// のエンドポイントを使用します。サンプルのコマンド ライン:
.\ExecuteSampleSplitMerge.ps1 ^ -UserName 'mysqluser' -Password 'MySqlPassw0rd' ^ -ShardMapManagerServerName 'abcdefghij.database.windows.net' ^ -SplitMergeServiceEndpoint 'https://mysplitmergeservice.cloudapp.net' ^ -CertificateThumbprint '0123456789abcdef0123456789abcdef01234567'
次のエラーが表示された場合、Web エンドポイントの証明書に問題がある可能性が高いです。 任意の Web ブラウザーを使用して Web エンドポイントに接続を試み、証明書エラーになるかご確認ください。
Invoke-WebRequest : The underlying connection was closed: Could not establish trust relationship for the SSL/TLSsecure channel.
成功したら、その出力は次のような出力になるはずです:
.\ExecuteSampleSplitMerge.ps1 -UserName 'mysqluser' -Password 'MySqlPassw0rd' -ShardMapManagerServerName 'abcdefghij.database.windows.net' -SplitMergeServiceEndpoint 'http://mysplitmergeservice.cloudapp.net' -CertificateThumbprint 0123456789abcdef0123456789abcdef01234567 Sending split request Began split operation with id dc68dfa0-e22b-4823-886a-9bdc903c80f3 Polling split-merge request status. Press Ctrl-C to end Progress: 0% | Status: Queued | Details: [Informational] Queued request Progress: 5% | Status: Starting | Details: [Informational] Starting split-merge state machine for request. Progress: 5% | Status: Starting | Details: [Informational] Performing data consistency checks on target shards. Progress: 20% | Status: CopyingReferenceTables | Details: [Informational] Moving reference tables from source to target shard. Progress: 20% | Status: CopyingReferenceTables | Details: [Informational] Waiting for reference tables copy completion. Progress: 20% | Status: CopyingReferenceTables | Details: [Informational] Moving reference tables from source to target shard. Progress: 44% | Status: CopyingShardedTables | Details: [Informational] Moving key range [100:110) of Sharded tables Progress: 44% | Status: CopyingShardedTables | Details: [Informational] Successfully copied key range [100:110) for table [dbo].[MyShardedTable] ... ... Progress: 90% | Status: Completing | Details: [Informational] Successfully deleted shardlets in table [dbo].[MyShardedTable]. Progress: 90% | Status: Completing | Details: [Informational] Deleting any temp tables that were created while processing the request. Progress: 100% | Status: Succeeded | Details: [Informational] Successfully processed request. Sending merge request Began merge operation with id 6ffc308f-d006-466b-b24e-857242ec5f66 Polling request status. Press Ctrl-C to end Progress: 0% | Status: Queued | Details: [Informational] Queued request Progress: 5% | Status: Starting | Details: [Informational] Starting split-merge state machine for request. Progress: 5% | Status: Starting | Details: [Informational] Performing data consistency checks on target shards. Progress: 20% | Status: CopyingReferenceTables | Details: [Informational] Moving reference tables from source to target shard. Progress: 44% | Status: CopyingShardedTables | Details: [Informational] Moving key range [100:110) of Sharded tables Progress: 44% | Status: CopyingShardedTables | Details: [Informational] Successfully copied key range [100:110) for table [dbo].[MyShardedTable] ... ... Progress: 90% | Status: Completing | Details: [Informational] Successfully deleted shardlets in table [dbo].[MyShardedTable]. Progress: 90% | Status: Completing | Details: [Informational] Deleting any temp tables that were created while processing the request. Progress: 100% | Status: Succeeded | Details: [Informational] Successfully processed request.
他のデータ型も試してみてください。 これらのすべてのスクリプトでは、オプションの -ShardKeyType パラメーターを使用してキーの種類を指定することができます。 既定値は Int32 ですが、Int64、Guid、またはバイナリも指定できます。
要求の作成
サービスは、Web UI を使用するか、インポートするか、Web ロールで要求を送信する SplitMerge.psm1
PowerShell モジュールを使用する方法のいずれかで利用できます。
サービスは、シャード化したテーブルと参照テーブルの両方にデータを移動できます。 シャード テーブルには、シャード キー列があり、シャードごとに異なる行データを保持します。 参照テーブルはシャードされないため、すべてのシャードに同じ行データが含まれています。 データを頻繁には変更しない場合に参照テーブルを使用すると便利です。また、これをクエリに使用してシャード化されたテーブルとの JOIN を行います。
分割やマージの操作を実行するには、移動の対象となるシャード化したテーブルと参照テーブルを宣言する必要があります。 これは SchemaInfo API で行います。 この API は、Microsoft.Azure.SqlDatabase.ElasticScale.ShardManagement.Schema
名前空間にあります。
- シャード化されたテーブルごとに、テーブルの親のスキーマ名 (オプション、既定値は "dbo")、テーブル名、シャーディング キーを含むテーブル内の列名が記述された、ShardedTableInfo オブジェクトを作成します。
- 参照テーブルごとに、テーブルの親のスキーマ名 (オプション、既定値は "dbo") とテーブル名が記述された ReferenceTableInfo オブジェクトを作成します。
- 新しい SchemaInfo オブジェクトに、前の TableInfo オブジェクトを追加します。
- ShardMapManager オブジェクトへの参照を取得し、GetSchemaInfoCollection を呼び出します。
- SchemaInfoCollection に SchemaInfo を追加し、シャード マップ名を入力します。
この例は、SetupSampleSplitMergeEnvironment.ps1 スクリプトで確認できます。
Split-Merge サービスはターゲット データベース (またはデータベースにある任意のテーブル用のスキーマ) を作成しません。 サービスに要求を送信する前に作成しておく必要があります。
既知のエラー
サンプル PowerShell スクリプトの実行中に、次のメッセージが表示されることがあります:
Invoke-WebRequest : The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.
このエラーは、TLS/SSL 証明書が正しく構成されていないことを意味しています。 「Web ブラウザーを使って接続する」のセクションの手順に従ってください。
要求を送信できない場合、次の内容が表示される可能性があります:
[Exception] System.Data.SqlClient.SqlException (0x80131904): Could not find stored procedure 'dbo.InsertRequest'.
この場合は、構成ファイル、特に WorkerRoleSynchronizationStorageAccountConnectionString
の設定を確認します。 このエラーは、通常、Worker ロールがメタデータ データベースを初回使用時に正常に初期化できなかったことを示しています。
関連するコンテンツ
まだ弾力性データベース ツールを使用していない場合は、 ファースト ステップ ガイドを参照してください。 ご質問がある場合は、SQL Database に関する Microsoft Q&A 質問ページを参照してください。機能に関するご要望は、SQL Database に関するフィードバック フォーラムで新しいアイデアを追加したり、既存のアイデアに投票したりしてください。