Amazon Web Services ブログ

Amazon RDS for SQL Server でリージョン内リードレプリカを使用する

Amazon RDS for SQL Server は、リージョン内のリードレプリカをサポートするようになりました。これにより、読み取りワークロードをプライマリデータベースインスタンスからレプリカにオフロードできます。リードレプリカは内蔵の分散型可用性グループ機能を使用しており、Enterprise Edition でご利用いただけます。分散型可用性グループは、2 つの別個の可用性グループにまたがる可用性グループです。分散型可用性グループのメンバーは、それ自体が可用性グループです。Amazon RDS は、このアーキテクチャに、ドメインに依存しない Windows Server Failover Cluster (WSFC) を使用します。この記事では、リードレプリカのアーキテクチャ、リードレプリカの作成方法、およびそれをモニタリングする方法について説明します。

リードレプリカは、SQL Server 2016 Service Pack 2 Cumulative Update 3 (13.00.5216.0.v1) 以降のマルチ AZ 設定の Enterprise Edition でサポートされています。

リードレプリカのマルチ AZ 設定

リードレプリカのマルチ AZ 設定では、プライマリ DB インスタンスでコミットされたトランザクションは、高可用性を目的として同期的にセカンダリレプリカにレプリケートされ、読み取りのスケールアウトのためにリードレプリカに非同期的に送信されます。リードレプリカには、プライマリ DB インスタンスからのほぼリアルタイムのデータが含まれており、それらを使用して、読み取り専用ワークロードをプライマリ DB インスタンスからオフロードできます。そのワークロードには、たとえば、データ更新のレイテンシーをある程度許容できる分析タイプまたはレポートタイプのクエリがあります。さらに、リードレプリカをプライマリまたはセカンダリ DB インスタンスとは異なるアベイラビリティーゾーンでウォームスタンバイソリューションとして使用でき、ビジネスニーズに基づいてレプリカをシングル AZ インスタンスに昇格できます。Transparent Data Encryption (TDE) または AWS KMS を使用して、保管中のデータを保護できます。詳細については、「Amazon Relational Database Service (Amazon RDS) で AWS KMS を使用する方法」を参照してください。Secure Sockets Layer (SSL) または Native Network Encryption (NNE) により、転送中のデータを保護できます。

次の図は、Always On 可用性グループを使用したマルチ AZ 設定の RDS SQL Server の概要図です。プライマリ DB インスタンスとセカンダリ DB インスタンスは、同じ AWS リージョン内の異なるアベイラビリティーゾーンでホストされます。停止した場合、プライマリ DB インスタンスは自動的にセカンダリ DB インスタンスにフェイルオーバーします。データベースは、「RDSAG0」と呼ばれる Always On 可用性グループの一部です。プライマリ DB インスタンスに対するデータ変更は、同期方式でセカンダリ DB インスタンスにレプリケートされます。リスナーエンドポイントを使用してプライマリ DB インスタンスに接続できます。

リードレプリカを作成するとき、Amazon RDS はプライマリ DB インスタンスのスナップショットを作成し、そのスナップショットから新しい読み取り専用インスタンスを作成します。リードレプリカの作成または削除に、プライマリ DB インスタンスでのダウンタイムは必要ありません。最大 5 つのリードレプリカを作成できます。

次の図は、1 つのリードレプリカを追加したマルチ AZ 設定を示しています。この分散型可用性グループのセットアップには、同じ AWS リージョン内の異なるアベイラビリティーゾーンでホストされている 3 つの DB インスタンスがあります。プライマリ DB インスタンスとセカンダリ DB インスタンスは、「RDSAG0」と呼ばれる可用性グループの一部です。リードレプリカには、「READ REPLICA AG」と呼ばれる独自の可用性グループがあります。これらの可用性グループは、「DISTRIBUTED AG」と呼ばれる単一の分散型可用性グループのメンバーです。データの変更は、リードレプリカに非同期でコミットされます。プライマリ DB インスタンスとリードレプリカには、独自の固有のエンドポイントがあります。

注意: プライマリ DB インスタンスを指すリスナーエンドポイントは、トラフィックをリードレプリカにルーティングするための読み取り対象の接続文字列として使用できないことに注意してください。

次の図は、2 つのリードレプリカを持つマルチ AZ 設定を示しています。2 つの分散型可用性グループが作成されます (各グループに 1 つのリードレプリカ)。可用性グループ「RDSAG0」は、対応するリードレプリカの可用性グループとともに、これらの分散型可用性グループのそれぞれのメンバーです。プライマリ DB インスタンスと各リードレプリカには、独自の固有のエンドポイントがあります。

プライマリ DB インスタンスは、読み取り/書き込みトラフィックの両方を受け入れることができるデータベースの唯一のコピーです。リードレプリカは読み取り専用トラフィックのみを受け入れることができます。Amazon RDS で Always On 可用性グループを使用する場合、アプリケーションは、プライマリ DB インスタンスを指すリスナーエンドポイントを読み取り対象の接続文字列として使用して、トラフィックをリードレプリカにルーティングできません。

前提条件

このチュートリアルを開始する前に、次の前提条件を満たしていることを確認してください。

  • リードレプリカは、プライマリ DB インスタンスと同じリージョンにあること。
  • DB インスタンスが 2016 Service Pack 2 Cumulative Update 3 以降の上にあること。
  • DB インスタンスは Enterprise Edition を使用していること。
  • DB インスタンスは、Always On 可用性グループを使ってマルチ AZ 設定になっていること。
  • プライマリ DB インスタンスの場合、自動バックアップを有効にする必要があります (たとえば、バックアップの保持期間は 1 日以上にする必要があります)。
  • ソース DB インスタンスとそのすべてのリードレプリカの SQL Server DB エンジンバージョンは同じである必要があります。Amazon RDS は、リードレプリカのメンテナンスウィンドウに関係なく、リードレプリカをアップグレードした直後にソース DB インスタンスをアップグレードします。DB エンジンバージョンのアップグレードの詳細については、「Microsoft SQL Server DB エンジンのアップグレード」を参照してください。

さらに、次の点に注意する必要があります。

  • リードレプリカは、プライマリ DB インスタンスとは異なる DB インスタンスファミリーまたはサイズになる場合があります (たとえば、プライマリ DB インスタンスは r5.2xlarge で、リードレプリカは t3.xlarge となる可能性があります)。
  • リードレプリカに新しいデータベースを作成することはできません。プライマリ DB インスタンスに作成する新しいデータベースは、リードレプリカに自動的に作成されます。
  • リードレプリカを作成するときにプライマリ DB インスタンスに存在するログイン、カスタムサーバーロール、SQL ジョブは、リードレプリカにコピーされます。そのようなサーバーレベルのオブジェクトをプライマリ DB インスタンスで後で作成する場合は、各リードレプリカで手動で再作成する必要があります。
  • リードレプリカに追加のログインと SQL ジョブを作成できます。これらの変更は、リードレプリカが削除されてプライマリ DB インスタンスから再作成されると失われます。
  • リードレプリカ設定は、ネイティブリストアをサポートしていません。ただし、すべてのリードレプリカを削除し、ネイティブリストアを実行して、リードレプリカを再作成できます。
  • リードレプリカは、プライマリ DB インスタンスと同じストレージサイズで始まります。ただし、プライマリ DB インスタンスでストレージをスケーリングする場合は、そのレプリカでも行う必要があります。

RDS SQL Server リードレプリカを作成する

AWS マネジメントコンソールまたは AWS CLI を介して、RDS SQL Server リードレプリカを作成できます。

SQL Server リードレプリカを作成しても、プライマリ DB インスタンスが停止することはありません。同じプライマリ DB インスタンスから複数のリードレプリカ (最大 5 つ) を作成できます。各リードレプリカには、接続のための独自のエンドポイントがあります。

AWS マネジメントコンソール

コンソールから RDS SQL サーバーを作成するには、次の手順を実行します。

  1. Amazon RDS コンソールで、[Databases] を選択します。
  2. ソースインスタンスを検索します。
    DB インスタンスは、Always On 可用性グループを使用してマルチ AZ 設定にする必要があります。
  3. ソースインスタンスを選択します。
  4. [Actions] では、[Create read replica] を選択します。
  5. [Instance specifications] セクションの [DB instance class] で、[db.m5.xlarge] を選択します。
  6. [Storage type] では、[Provisioned IOPS (SSD)] を選択します。
  7. [Provisioned IOPS] には、5000 と入力します。
    ソースインスタンスの IOPS 値よりも大きい IOPS 値を選択すると、操作が完了するまでパフォーマンスに影響を与える可能性があります。
  8. [Nework & Security] の [Availability zone] で、[No preference] を選択します。
  9. [Publicly accessible] では、[No] を選択します。
  10. [Encryption] では、[Disable encryption] を選択します。
    暗号化されていないプライマリ DB インスタンスから暗号化されたリードレプリカを作成することはできません。
  11. [Settings] の [Read replica source] で、[rds-sql-prod-inst-01] を選択します。
  12. [DB instance identifier] には、rds-sql-prod-inst-01-replica-01 と入力します。
  13. [Database options] の [Database port] では、デフォルト値 (1433) のままにします。
  14. [Microsoft SQL Server Windows Authentication] の [Directory] で、[None] を選択します。
  15. [Monitoring] で、[Disable enhanced monitoring] を選択します。
  16. [Log exports] で、[Error log] を選択します。
  17. [IAM role] では、まだ選択していない場合は、ログを Amazon CloudWatch Logs に発行するために使用する IAM ロールを入力します。
  18. [Performance Insights] では、[Enable Performance Insights] を選択します。
    Performance Insights を有効にする必要はありませんが、最大 7 日間は無料で利用できるため、このチュートリアルでは使用することをお勧めします。
  19. 設定値を確認し、[Create read replica] を選択します。

AWS CLI

AWS CLI を介してリードレプリカを作成することもできます。次のコードを参照してください。

aws rds create-db-instance-read-replica 
      --db-instance-identifier <SOURCE INSTANCE NAME>
      --source-db-instance-identifier <READ REPLICA NAME>
      --region us-west-2 
      --publicly-accessible 

新しく作成されたリードレプリカに接続する

エンドポイントとポート番号を使用して、プライマリ DB インスタンスとリードレプリカインスタンスに接続できます。Amazon RDS は、リードレプリカ用に 2 セットのエンドポイントを提供しています。1 つはプライマリ DB インスタンスを指し、もう 1 つはリードレプリカを指します。プライマリ DB インスタンスは、読み書きのトラフィックを受け入れることができるデータベースの唯一のコピーです。リードレプリカは読み取り専用トラフィックのみを受け入れることができます。

次のスクリーンショットは、エンドポイント情報と、それを SQL Server Management Studio (SSMS) で使用して DB インスタンスに接続する方法を示しています。

RDS SQL Server リードレプリカをスタンドアロンインスタンスに昇格させる

リードレプリカをスタンドアロン DB インスタンスに昇格できます。リードレプリカをシングル AZ インスタンスに昇格させても、他のリードレプリカ (存在する場合) には影響がなく、マルチ AZ 設定のプライマリ DB インスタンスや同期コピーにも影響しません。

コンソールまたは AWS CLI を使用して、リードレプリカを Single-AZ DB インスタンスに昇格できます。

AWS マネジメントコンソール

コンソールを使用してリードレプリカを昇格するには、次の手順を実行します。

  1. Amazon RDS コンソールで、[Databases] を選択します。
  2. リードレプリカインスタンスを検索します。
  3. リードレプリカインスタンスを選択します。
  4. [Actions] では、[Promote] を選択します。
  5. [Preferences] の [Enable automatic backups] では、[Yes] を選択します。
  6. [Backup retention period] では、[7 days] を選択します。
  7. [Backup window] では、[No preference] を選択します。
  8. [Continue] をクリックします。

AWS CLI

AWS CLI を介して、リードレプリカをシングル AZ インスタンスに昇格させることもできます。次のコード例を参照してください。

aws rds promote-read replica 
   --db-instance-identifier <READ REPLICA NAME> 

リードレプリカをモニタリングする

リードレプリカのレプリケーションステータスは、次のいずれかになります。

  • Replicating –リードレプリカは期待どおりにレプリケートしています。
  • Replication degraded – レプリカはプライマリ DB インスタンスからデータを受信していますが、1 つ以上のデータベースが更新を取得していない可能性があります。これは、たとえば、レプリカが新しく作成されたデータベースをセットアップしている時に発生する可能性があります。劣化状態でエラーが発生しない限り、ステータスは [Replication degraded] から [Error] に移行しません。
  • [Error] – レプリケーションでエラーが発生しました。正確なエラーを特定するには、Amazon RDS コンソールまたはイベントログの [Replication Error] フィールドを確認します。

レプリケーション状況を表示するには、以下の手順を実行します。

  1. Amazon RDS コンソールで、[Databases] を選択します。
  2. リードレプリカインスタンスを検索します。
  3. リードレプリカインスタンスを選択します。
  4. [Replication status] 列でステータスを確認します。

プライマリ DB インスタンスとリードレプリカの間のレプリケーションラグに関する情報は、Amazon CloudWatch で入手できます。この情報には、コンソールまたは AWS CLI からアクセスできます。プライマリ DB インスタンスに対して SQL クエリを実行して、現在のレプリケーションラグを確認することもできます。

レプリケーションラグは、レプリケーションの状態が Replicating または Replication degraded の場合にのみ有効です。

AWS マネジメントコンソール

コンソールを介してリードレプリカラグメトリクスを監視するには、次の手順を実行します。

  1. Amazon RDS コンソールで、[Databases] を選択します。
  2. リードレプリカインスタンスを検索します。
  3. リードレプリカインスタンスを選択します。
  4. [Monitoring] タブを選択します。
  5. タイトルが Replica Lag のグラフを見つけます。

AWS CLI

AWS CLI を使用して CloudWatch からレプリカラグをクエリすることもできます。次に例を示します。

aws cloudwatch get-metric-statistics 
   --namespace "AWS/RDS" 
   --metric-name ReplicaLag 
   --start-time 2020-03-30T00:00:00Z 
   --end-time 2020-04-01T00:00:00Z 
   --period 3600 
   --dimensions Name=DBInstanceIdentifier,Value=<READ REPLICA NAME>
   --statistics Maximum 

使用できるコマンドの詳細については、CloudWatch を参照してください。

SQL クエリ

SQL クエリを使用して、プライマリ DB インスタンスに対するリードレプリカのラグをモニタリングすることもできます。次に例を示します。

SELECT AR.replica_server_name
	, DB_NAME (ARS.database_id) '<DATABASE NAME>'
	, AR.availability_mode_desc
	, ARS.synchronization_health_desc
	, ARS.last_hardened_lsn
	, ARS.last_redone_lsn
	, ARS.secondary_lag_seconds
FROM sys.dm_hadr_database_replica_states ARS
INNER JOIN sys.availability_replicas AR ON ARS.replica_id = AR.replica_id
WHERE DB_NAME(ARS.database_id) = '<DATABASE NAME>'
ORDER BY AR.replica_server_name;

まとめ

Amazon RDS for SQL Server のリードレプリカを使用すると、最大 5 つのレプリカを作成して、読み取り対象のワークロードをスケールアウトできます。この記事では、リードレプリカを作成してモニタリングする方法について説明しました。リードレプリカの詳細については、「リードレプリカの操作」を参照してください。Amazon RDS for SQL Server リードレプリカを今すぐお試しください。何かご意見やご質問がある場合は、コメント欄にご記入ください。

 


著者について

 

Junu Thankappan は、アマゾン ウェブ サービスのデータベースエンジニアです。彼は AWS RDS チームと協力して、商用データベースエンジンと SQL Server に力を入れています。