読み取り専用レプリカを使用して読み取り専用クエリ ワークロードを負荷分散するUse read-only replicas to load-balance read-only query workloads

注意

この記事は、新しい Azure PowerShell Az モジュールを使用するために更新されました。This article has been updated to use the new Azure PowerShell Az module. AzureRM モジュールはまだ使用でき、少なくとも 2020 年 12 月までは引き続きバグ修正が行われます。You can still use the AzureRM module, which will continue to receive bug fixes until at least December 2020. Az モジュールと AzureRM の互換性の詳細については、「Introducing the new Azure PowerShell Az module (新しい Azure PowerShell Az モジュールの概要)」を参照してください。To learn more about the new Az module and AzureRM compatibility, see Introducing the new Azure PowerShell Az module. Az モジュールのインストール手順については、Azure PowerShell のインストールを参照してください。For Az module installation instructions, see Install Azure PowerShell.

高可用性アーキテクチャの一部として、Premium および Business Critical サービス レベルの各データベースは、1 つのプライマリ レプリカと複数のセカンダリ レプリカを使用して自動的にプロビジョニングされます。As part of the High Availability architecture, each database in the Premium and Business Critical service tier is automatically provisioned with a primary replica and several secondary replicas. セカンダリ レプリカは、プライマリ レプリカと同じコンピューティング サイズでプロビジョニングされます。The secondary replicas are provisioned with the same compute size as the primary replica. 読み取りスケールアウト機能では、読み取り/書き込みレプリカを共有する代わりに、読み取り専用レプリカのいずれか 1 つの処理能力を使用して SQL Database の読み取り専用ワークロードを負荷分散できます。The Read Scale-Out feature allows you to load-balance SQL Database read-only workloads using the capacity of one of the read-only replicas instead of sharing the read-write replica. これにより、読み取り専用のワークロードは、メインの読み取り/書き込みワークロードから分離され、パフォーマンスに影響を及ぼすことはありません。This way the read-only workload will be isolated from the main read-write workload and will not affect its performance. この機能は、分析などの論理的に分離された読み取り専用ワークロードを含むアプリケーション向けです。The feature is intended for the applications that include logically separated read-only workloads, such as analytics. Premium および Business Critical サービス レベルでは、余分なコストをかけることなく、この追加の処理能力を使用してパフォーマンス上のメリットをアプリケーションで得ることが可能です。In the Premium and Business Critical service tiers, applications could gain performance benefits using this additional capacity at no extra cost.

また、少なくとも 1 つのセカンダリ レプリカが作成されている場合は、ハイパースケール サービス レベルで読み取りスケールアウト機能を使用することもできます。The Read Scale-Out feature is also available in the Hyperscale service tier when at least one secondary replica is created. 読み取り専用ワークロードが 1 つのセカンダリ レプリカで利用可能なリソースよりも多くのリソースを必要とする場合は、複数のセカンダリ レプリカを使用できます。Multiple secondary replicas can be used if read-only workloads require more resources than available on one secondary replica. Basic、Standard、および General Purpose サービス レベルの高可用性アーキテクチャには、レプリカは一切含まれていません。The High Availability architecture of Basic, Standard, and General Purpose service tiers does not include any replicas. 読み取りスケールアウト機能は、これらのサービス レベルでは使用できません。The Read Scale-Out feature is not available in these service tiers.

次の図に、Business Critical データベースの使用例を示します。The following diagram illustrates it using a Business Critical database.

読み取り専用レプリカ

新しい Premium、Business Critical、および Hyperscale データベースでは、読み取りスケールアウト機能は既定で有効になっています。The Read Scale-Out feature is enabled by default on new Premium, Business Critical, and Hyperscale databases. ハイパースケールの場合、既定では、新しいデータベースに対して 1 つのセカンダリ レプリカが作成されます。For Hyperscale, one secondary replica is created by default for new databases. お使いの SQL 接続文字列が ApplicationIntent=ReadOnly で構成されている場合、アプリケーションは、ゲートウェイによって、データベースの読み取り専用レプリカにリダイレクトされます。If your SQL connection string is configured with ApplicationIntent=ReadOnly, the application will be redirected by the gateway to a read-only replica of that database. ApplicationIntent プロパティの使用方法の詳細については、「アプリケーションの目的を指定する」をご覧ください。For information on how to use the ApplicationIntent property, see Specifying Application Intent.

SQL 接続文字列の ApplicationIntent 設定に関係なく、アプリケーションがプライマリ レプリカに確実に接続されるようにする場合は、データベースを作成するとき、またはその構成を変更するときに、読み取りスケールアウトを明示的に無効にする必要があります。If you wish to ensure that the application connects to the primary replica regardless of the ApplicationIntent setting in the SQL connection string, you must explicitly disable read scale-out when creating the database or when altering its configuration. たとえばデータベースを Standard または General Purpose レベルから Premium、Business Critical、または Hyperscale レベルにアップグレードするときに、すべての接続が引き続きプライマリ レプリカに対して行われるようにするには、読み取りスケールアウトを無効にします。無効にする方法の詳細については、「読み取りスケールアウトの有効化と無効化」を参照してください。For example, if you upgrade your database from Standard or General Purpose tier to Premium, Business Critical or Hyperscale tier and want to make sure all your connections continue to go to the primary replica, disable Read Scale-out. For details on how to disable it, see Enable and disable Read Scale-Out.

注意

読み取り専用レプリカでは、クエリ データ ストア、拡張イベント、SQL Profiler、および監査の各機能はサポートされていません。Query Data Store, Extended Events, SQL Profiler and Audit features are not supported on the read-only replicas.

データの一貫性Data consistency

レプリカのメリットの 1 つは、レプリカが常にトランザクション上一貫性が保たれた状態となることですが、さまざまな時点で異なるレプリカ間に短い待機時間が発生する可能性があります。One of the benefits of replicas is that the replicas are always in the transactionally consistent state, but at different points in time there may be some small latency between different replicas. 読み取りスケールアウトは、セッション レベルの一貫性をサポートしています。Read Scale-Out supports session-level consistency. つまり、レプリカが使用できないことが原因で接続エラーが発生した後に読み取り専用セッションが再接続された場合、読み取り/書き込みレプリカによる更新が 100% ではないレプリカにリダイレクトされる可能性があります。It means, if the read-only session reconnects after a connection error caused by replica unavailability, it may be redirected to a replica that is not 100% up-to-date with the read-write replica. 同様に、アプリケーションが読み取り/書き込みセッションを使用してデータを書き込み、読み取り専用セッションを使用してすぐに読み取る場合、レプリカに最新の更新がすぐに表示されない可能性があります。Likewise, if an application writes data using a read-write session and immediately reads it using a read-only session, it is possible that the latest updates are not immediately visible on the replica. 待機時間は、非同期のトランザクション ログのやり直し操作が原因で生じます。The latency is caused by an asynchronous transaction log redo operation.

注意

領域内のレプリケーションの待機時間は短く、このような状況はまれです。Replication latencies within the region are low and this situation is rare.

読み取り専用レプリカに接続するConnect to a read-only replica

データベースの読み取りスケールアウトを有効にすると、クライアントによって提供された接続文字列の ApplicationIntent オプションにより、接続が書き込みレプリカと読み取り専用レプリカのどちらにルーティングされるかが指定されます。When you enable Read Scale-Out for a database, the ApplicationIntent option in the connection string provided by the client dictates whether the connection is routed to the write replica or to a read-only replica. 具体的には、ApplicationIntent 値が ReadWrite (既定値) の場合、接続はデータベースの読み取り/書き込みレプリカにリダイレクトされます。Specifically, if the ApplicationIntent value is ReadWrite (the default value), the connection will be directed to the database’s read-write replica. これは、既存の動作と同じです。This is identical to existing behavior. ApplicationIntent 値が ReadOnly の場合、接続は読み取り専用レプリカにルーティングされます。If the ApplicationIntent value is ReadOnly, the connection is routed to a read-only replica.

たとえば、次の接続文字列はクライアントを読み取り専用レプリカに接続します (山かっこ内の項目は環境内の適切な値に置き換え、山かっこは削除します)。For example, the following connection string connects the client to a read-only replica (replacing the items in the angle brackets with the correct values for your environment and dropping the angle brackets):

Server=tcp:<server>.database.windows.net;Database=<mydatabase>;ApplicationIntent=ReadOnly;User ID=<myLogin>;Password=<myPassword>;Trusted_Connection=False; Encrypt=True;

次の接続文字列はどちらもクライアントを読み取り/書き込みレプリカに接続します (山かっこ内の項目は環境内の適切な値に置き換え、山かっこは削除します)。Either of the following connection strings connects the client to a read-write replica (replacing the items in the angle brackets with the correct values for your environment and dropping the angle brackets):

Server=tcp:<server>.database.windows.net;Database=<mydatabase>;ApplicationIntent=ReadWrite;User ID=<myLogin>;Password=<myPassword>;Trusted_Connection=False; Encrypt=True;

Server=tcp:<server>.database.windows.net;Database=<mydatabase>;User ID=<myLogin>;Password=<myPassword>;Trusted_Connection=False; Encrypt=True;

接続先が読み取り専用レプリカであることを確認するVerify that a connection is to a read-only replica

次のクエリを実行することにより、読み取り専用レプリカに接続しているかどうかを確認することができます。You can verify whether you are connected to a read-only replica by running the following query. 読み取り専用レプリカに接続している場合は、READ_ONLY が返されます。It will return READ_ONLY when connected to a read-only replica.

SELECT DATABASEPROPERTYEX(DB_NAME(), 'Updateability')

注意

ReadOnly セッションでアクセスできる AlwaysON レプリカは、どの時点においても 1 つのみです。At any given time only one of the AlwaysON replicas is accessible by the ReadOnly sessions.

読み取り専用レプリカの監視とトラブルシューティングMonitoring and troubleshooting read-only replica

読み取り専用レプリカに接続すると、sys.dm_db_resource_stats DMV を使用してパフォーマンス メトリックにアクセスできます。When connected to a read-only replica, you can access the performance metrics using the sys.dm_db_resource_stats DMV. クエリ プランの統計情報にアクセスするには、sys.dm_exec_query_statssys.dm_exec_query_plan、および sys.dm_exec_sql_text DMV を使用します。To access query plan statistics, use the sys.dm_exec_query_stats, sys.dm_exec_query_plan and sys.dm_exec_sql_text DMVs.

注意

論理マスター データベース内の DMV sys.resource_stats は、プライマリ レプリカの CPU 使用率とストレージ データを返します。The DMV sys.resource_stats in the logical master database returns CPU usage and storage data of the primary replica.

読み取りスケールアウトの有効化と無効化Enable and disable Read Scale-Out

Premium、Business Critical、および Hyperscale サービス レベルでは、読み取りスケールアウトは既定で有効になっています。Read Scale-Out is enabled by default on Premium, Business Critical and Hyperscale service tiers. Basic、Standard、または General Purpose サービス レベルで読み取りスケールアウトを有効にすることはできません。Read Scale-Out cannot be enabled in Basic, Standard, or General Purpose service tiers. レプリカ数 0 で構成された Hyperscale データベースでは、読み取りスケールアウトは自動的に無効になります。Read Scale-Out is automatically disabled on Hyperscale databases configured with 0 replicas.

Premium または Business Critical サービス レベルの単一データベースとエラスティック プール データベースの読み取りスケールアウトは、次の方法で無効にして再び有効にすることができます。You can disable and re-enable Read Scale-Out on single databases and elastic pool databases in Premium or Business Critical service tier using the following methods.

注意

読み取りスケールアウトを無効にする能力は、下位互換性を維持するために提供されています。The ability to disable Read Scale-Out is provided for backward compatibility.

Azure ポータルAzure portal

読み取りスケールアウトの設定は、 [構成] データベース ブレードで管理できます。You can manage the Read Scale-out setting on the Configure database blade.

PowerShellPowerShell

Azure PowerShell で読み取りスケールアウトを管理するには、2016 年 12 月以降のリリースの Azure PowerShell が必要です。Managing Read Scale-Out in Azure PowerShell requires the December 2016 Azure PowerShell release or newer. 最新の PowerShell リリースについては、Azure PowerShell に関するページを参照してください。For the newest PowerShell release, see Azure PowerShell.

Azure PowerShell で Set-AzSqlDatabase コマンドレットを呼び出し、-ReadScale パラメーターに目的の値 (Enabled または Disabled) を渡すことで、読み取りスケールアウトを無効にし、再び有効にできます。You can disable or re-enable Read Scale-Out in Azure PowerShell by invoking the Set-AzSqlDatabase cmdlet and passing in the desired value – Enabled or Disabled -- for the -ReadScale parameter.

既存のデータベースの読み取りスケールアウトを無効にするには (山かっこ内の項目を自分の環境用の適切な値に置き換え、山かっこを削除してください):To disable read scale-out on an existing database (replacing the items in the angle brackets with the correct values for your environment and dropping the angle brackets):

Set-AzSqlDatabase -ResourceGroupName <myresourcegroup> -ServerName <myserver> -DatabaseName <mydatabase> -ReadScale Disabled

新しいデータベースの読み取りスケールアウトを無効にするには (山かっこ内の項目を自分の環境用の適切な値に置き換え、山かっこを削除してください):To disable read scale-out on a new database (replacing the items in the angle brackets with the correct values for your environment and dropping the angle brackets):

New-AzSqlDatabase -ResourceGroupName <myresourcegroup> -ServerName <myserver> -DatabaseName <mydatabase> -ReadScale Disabled -Edition Premium

既存のデータベースの読み取りスケールアウトを再び有効にするには (山かっこ内の項目を自分の環境用の適切な値に置き換え、山かっこを削除してください):To re-enable read scale-out on an existing database (replacing the items in the angle brackets with the correct values for your environment and dropping the angle brackets):

Set-AzSqlDatabase -ResourceGroupName <myresourcegroup> -ServerName <myserver> -DatabaseName <mydatabase> -ReadScale Enabled

REST APIREST API

読み取りスケールアウトが無効なデータベースを作成する、または既存のデータベースの設定を変更するには、次の方法を使用して、次の要求の例に示すように readScale プロパティを Enabled または Disabled に設定します。To create a database with read scale-out disabled, or to change the setting for an existing database, use the following method with the readScale property set to Enabled or Disabled as in the below sample request.

Method: PUT
URL: https://management.azure.com/subscriptions/{SubscriptionId}/resourceGroups/{GroupName}/providers/Microsoft.Sql/servers/{ServerName}/databases/{DatabaseName}?api-version= 2014-04-01-preview
Body:
{
   "properties":
   {
      "readScale":"Disabled"
   }
}

詳細については、「データベース - 作成または更新」を参照してください。For more information, see Databases - Create or Update.

読み取り専用レプリカでの TempDB の使用Using TempDB on read-only replica

TempDB データベースは読み取り専用レプリカにはレプリケートされません。The TempDB database is not replicated to the read-only replicas. 各レプリカには、レプリカの作成時に作成された独自のバージョンの TempDB データベースがあります。Each replica has its own version of TempDB database that is created when the replica is created. これにより、TempDB が更新可能となり、クエリの実行時に変更できるようになります。It ensures that TempDB is updateable and can be modified during your query execution. 読み取り専用ワークロードが TempDB オブジェクトの使用に依存している場合は、これらのオブジェクトをクエリ スクリプトの一部として作成する必要があります。If your read-only workload depends on using TempDB objects, you should create these objects as part of your query script.

geo レプリケートされたデータベースで読み取りスケールアウトを使用するUsing Read Scale-Out with geo-replicated databases

(たとえば、フェールオーバー グループのメンバーとして) geo レプリケートされたデータベース上の読み取り専用ワークロードを、読み取りスケールアウトを使用して負荷分散する場合は、プライマリ データベース上および geo レプリケートされたセカンダリ データベース上の両方で、読み取りスケールアウトが有効になっていることを確認します。If you are using Read Scale-Out to load-balance read-only workloads on a database that is geo-replicated (for example, as a member of a failover group), make sure that read scale-out is enabled on both the primary and the geo-replicated secondary databases. この構成により、フェールオーバー後にアプリケーションが新しいプライマリに接続したときに、同じ負荷分散エクスペリエンスが継続されます。This configuration will ensure that the same load-balancing experience continues when your application connects to the new primary after failover. 読み取りスケールが有効な、geo レプリケートされたセカンダリ データベースに接続している場合、ApplicationIntent=ReadOnly が設定されたセッションは、プライマリ データベース上で接続をルーティングするのと同じ方法で、レプリカの 1 つにルーティングされます。If you are connecting to the geo-replicated secondary database with read-scale enabled, your sessions with ApplicationIntent=ReadOnly will be routed to one of the replicas the same way we route connections on the primary database. ApplicationIntent=ReadOnly が設定されていないセッションは、geo レプリケートされたセカンダリのプライマリ レプリカ (これも読み取り専用) にルーティングされます。The sessions without ApplicationIntent=ReadOnly will be routed to the primary replica of the geo-replicated secondary, which is also read-only. geo レプリケートされたセカンダリ データベースのエンドポイントは、プライマリ データベースとは異なります。そのため、これまでは、セカンダリにアクセスするために、ApplicationIntent=ReadOnly を設定する必要はありませんでした。Because geo-replicated secondary database has a different endpoint than the primary database, historically to access the secondary it wasn't required to set ApplicationIntent=ReadOnly. 下位互換性を確保するため、sys.geo_replication_links DMV には、secondary_allow_connections=2 (すべてのクライアント接続を許可) が示されています。To ensure backward compatibility, sys.geo_replication_links DMV shows secondary_allow_connections=2 (any client connection is allowed).

注意

セカンダリ データベースのローカル レプリカ間でラウンド ロビンやその他の負荷分散ルーティングはサポートされていません。Round-robin or any other load-balanced routing between the local replicas of the secondary database is not supported.

次の手順Next steps