次の方法で共有


split-merge サービスをデプロイして、シャード化されたデータベース間でデータを移動する

適用対象: Azure SQL データベース

split-merge ツールを使用すると、シャード化されたデータベース間でデータを移動できます。 「スケールアウトされたクラウド データベース間のデータ移動]を参照してください。

Note

分割/マージ ツールは、Azure Web Apps を対象としています。 Cloud Services (クラシック) のサポート終了日は 2024 年 8 月 31 日です。 Cloud Services (クラシック) で分割/マージ ツールを使用していた場合は、2024 年 8 月 31 日より前に Azure Web Apps に移行してください。

前提条件

  1. Split-Merge ステータス データベースとして使用する SQL データベースを作成します。 Azure ポータルにアクセスします。 新しい SQL Databaseを作成します。 データベースに名前を付けて、新しい管理者とパスワードを作成します。 今後の使用のために、パスワードと名前を必ず記録しておいてください。

  2. Azure の論理サーバーで Azure サービスによる接続が許可されていることを確認します。 Azure ポータルの論理サーバーの [ファイアウォール設定] で、 [Azure サービスへのアクセスを許可する] 設定が [オン] に設定されていることを確認してください。 [Save](保存) アイコンを選択します。

  3. 診断の出力用の Azure Storage アカウントを作成します。

  4. パブリックの split/merge docker イメージを使用するか、split/merge Docker イメージを Azure Container Service または選択した Docker レジストリにプッシュします。

サービス用に 2 つの Azure Web Apps を作成する

2 つの Web アプリ (workerUI Web アプリ) を作成します。

Worker Web アプリ

  1. Azure portal で Web アプリを作成します。

  2. [公開] フィールドで、[コンテナー] を選択します。

  3. [オペレーティング システム] では [Windows] を選択します。

  4. [Docker] タブに進みます。

  5. 次の情報を入力します。
    画像ソース: Docker hub
    アクセスの種類: Public
    [Image and tag](イメージとタグ): mcr.microsoft.com/splitmerge/splitmergeworker:20240812.1

  6. [確認 + 作成] を使用して 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 アプリにアップロードし、証明書の使用を有効にします

workerUI Web Apps の両方について、次の手順を繰り返します。

  1. Azure ポータルにアクセスします。
  2. [App Services] を選択します。
  3. 上記で分割/マージ ツール用に作成した Web アプリを選択します。
  4. 一覧から 証明書 を選択します。
  5. [Bring your own certificates (.pfx)] を選択します。
  6. バーから [証明書の追加] を選択します。
  7. PFX ファイルを選択し、前述と同じパスワードを入力します。
  8. 完了したら、一覧内の新しいエントリから証明書の拇印をコピーします。
  9. [Web アプリ] メニューで、[設定] / [構成] を開きます。
  10. [Client certificate mode](クライアント証明書モード)Require に設定します。

Web アプリ構成

workerUI Web Apps の両方について、次の手順を繰り返します。

  1. 配置された Web アプリを開き、[設定]>[環境変数]>[アプリ設定] に移動します。 [追加] を選択します。

  2. 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

  3. 変数を追加します:

    名前
    WorkerRoleSynchronizationStorageAccountConnectionString 以前に作成した Azure ストレージへの有効な接続文字列。
    DataEncryptionPrimaryCertificateThumbprint 以前に生成された証明書のサムプリント。
    MetadataExpirationPeriodInMinutes 20160
    MaxRetryCount 5
    WEBSITE_LOAD_CERTIFICATES *
    WEBSITE_PULL_IMAGE_OVER_VNET 0
  4. [適用] を選択し、アプリケーションを再起動します。

  5. workerUI 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 ブラウザーへの接続

UIWeb アプリの [概要] に移動し、[参照] を選択します。 プロンプトが表示されたら、正しい認定資格証を選択します。

PowerShell スクリプトでのテスト

付属の PowerShell スクリプト サンプルを実行して、デプロイメントと環境をテストできます。

重要

このサンプル スクリプトは PowerShell 5.1 で実行してください。 現時点では、PowerShell 6 以降では実行できません。

付属のスクリプト ファイルは、次のとおりです。

  1. SetupSampleSplitMergeEnvironment.ps1 - split-merge のテスト データ層を設定します。

    1. シャードのマップ マネージャー データベースを作成します。
    2. 2 つのシャード データベースを作成します。
    3. これらのデータベース用のシャード マップを作成します (これらのデータベースに関する既存のシャード マップを削除します)。
    4. 両シャード上に小さいサンプル テーブルを作成し、いずれかのシャードで、このテーブルにデータを読み込みます。
    5. シャード化したテーブルの SchemaInfo を宣言します。
  2. ExecuteSampleSplitMerge.ps1 - テスト データ層に対してテスト操作を実行します。

    1. データを半分に分割して最初のシャードから 2 番目のシャードに渡す分割要求を Split-Merge サービスの Web フロントエンドに送信します。
    2. 分割要求の状態を Web フロントエンドに対してポーリングし、要求が完了するまで待機します。
    3. 2 番目のシャードから最初のシャードにデータを戻すための移動を求めるマージ要求を、Split-Merge サービスの Web フロントエンドに送信します。
    4. マージ要求の状態を Web フロントエンドに対してポーリングし、要求が完了するまで待機します。
  3. GetMappings.ps1 – シャード マッピングの現在の状態が表示される最上位のサンプル スクリプトです。

  4. ShardManagement.psm1 – ShardManagement API をラップするヘルパー スクリプトです。

  5. SqlDatabaseHelpers.psm1 – SQL Database のデータベースを作成および管理するためのヘルパー スクリプトです。

PowerShell でのデプロイの確認

  1. 新しい PowerShell ウィンドウを開き、Split-Merge パッケージをダウンロードしたディレクトリに移動し、"PowerShell" ディレクトリに移動します。

  2. サーバーを作成 (または既存のサーバーを選択) します。ここでシャード マップ マネージャーとシャードが作成されます。

    注意

    SetupSampleSplitMergeEnvironment.ps1 スクリプトは、これらのデータベースをすべて同じサーバー上に既定で作成します。これはスクリプトの簡潔さを維持するためです。 Split-Merge サービス自体の制約ではありません。

    Split-Merge サービスでデータを移動してシャード マップを更新するためには、データベースへの読み取りと書き込みのアクセス権のある SQL 認証ログインが必要になります。 Split-Merge サービスはクラウドで実行するため、現時点では統合認証はサポートしていません。

    これらのスクリプトを実行するマシンの IP アドレスからのアクセスを許可するようにサーバーが構成されていることをご確認ください。 この設定は、[SQL サーバー]/[ファイアウォール] と [仮想ネットワーク]/[クライアント IP アドレス] の下で確認できます。

  3. SetupSampleSplitMergeEnvironment.ps1 スクリプトを実行して、サンプル環境を作成します。

    このスクリプトを実行すると、シャード マップ マネージャー データベース上にある既存のシャード マップ管理データ構造とシャードはすべて消去されます。 これは、シャード マップやシャードの再初期化を希望する場合、スクリプトを再実行するのに便利です。

    サンプルのコマンド ライン:

    .\SetupSampleSplitMergeEnvironment.ps1 ^
    -UserName 'mysqluser' -Password 'MySqlPassw0rd' -ShardMapManagerServerName 'abcdefghij.database.windows.net'
    
  4. サンプル環境に現在あるマッピングを表示するには、Getmappings.ps1 スクリプトを実行します。

    .\GetMappings.ps1 ^
    -UserName 'mysqluser' -Password 'MySqlPassw0rd' -ShardMapManagerServerName 'abcdefghij.database.windows.net'
    
  5. 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.
    
  6. 他のデータ型も試してみてください。 これらのすべてのスクリプトでは、オプションの -ShardKeyType パラメーターを使用してキーの種類を指定することができます。 既定値は Int32 ですが、Int64、Guid、またはバイナリも指定できます。

要求の作成

サービスは、Web UI を使用するか、インポートするか、Web ロールで要求を送信する SplitMerge.psm1 PowerShell モジュールを使用する方法のいずれかで利用できます。

サービスは、シャード化したテーブルと参照テーブルの両方にデータを移動できます。 シャード テーブルには、シャード キー列があり、シャードごとに異なる行データを保持します。 参照テーブルはシャードされないため、すべてのシャードに同じ行データが含まれています。 データを頻繁には変更しない場合に参照テーブルを使用すると便利です。また、これをクエリに使用してシャード化されたテーブルとの JOIN を行います。

分割やマージの操作を実行するには、移動の対象となるシャード化したテーブルと参照テーブルを宣言する必要があります。 これは SchemaInfo API で行います。 この API は、Microsoft.Azure.SqlDatabase.ElasticScale.ShardManagement.Schema 名前空間にあります。

  1. シャード化されたテーブルごとに、テーブルの親のスキーマ名 (オプション、既定値は "dbo")、テーブル名、シャーディング キーを含むテーブル内の列名が記述された、ShardedTableInfo オブジェクトを作成します。
  2. 参照テーブルごとに、テーブルの親のスキーマ名 (オプション、既定値は "dbo") とテーブル名が記述された ReferenceTableInfo オブジェクトを作成します。
  3. 新しい SchemaInfo オブジェクトに、前の TableInfo オブジェクトを追加します。
  4. ShardMapManager オブジェクトへの参照を取得し、GetSchemaInfoCollection を呼び出します。
  5. SchemaInfoCollectionSchemaInfo を追加し、シャード マップ名を入力します。

この例は、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 に関するフィードバック フォーラムで新しいアイデアを追加したり、既存のアイデアに投票したりしてください。