

# Amazon RDS for Microsoft SQL Server のマルチ AZ 配置
<a name="USER_SQLServerMultiAZ"></a>

マルチ AZ 配置は、DB インスタンスの拡張された可用性、データ堅牢性、および耐障害性を提供します。予定されたデータベースメンテナンスまたは予期しないサービス障害時に、Amazon RDS は自動的に最新のセカンダリ DB インスタンスにフェイルオーバーします。この機能により、データベースオペレーションを手動介入なしで速やかに再開できます。プライマリインスタンスおよびスタンバイインスタンスは、同じエンドポイントを使用します。このエンドポイントの物理的なネットワークアドレスは、フェイルオーバープロセスの一環としてセカンダリレプリカに移行します。フェイルオーバーが発生した場合、アプリケーションを再構成する必要はありません。

Amazon RDS は、Microsoft SQL Server で SQL Server データベースミラーリング (DBM)、Always On 可用性グループ (AG)、またはブロックレベルレプリケーションによるマルチ AZ 配置をサポートしています。Amazon RDS は、マルチ AZ 配置のヘルス状態をモニタリングし、維持します。問題が発生した場合、RDS は異常のある DB インスタンスを自動的に修正し、同期を再確立して、フェイルオーバーをスタートします。フェイルオーバーは、スタンバイとプライマリが完全に同期している場合にのみスタートします。何も管理する必要はありません。

SQL Server マルチ AZ をセットアップすると、RDS は DBM、AG、またはブロックレベルレプリケーションを使用するよう、インスタンス上のすべてのデータベースを自動的に設定します。DBM または AG を設定すると、Amazon RDS では、プライマリ、モニタリング、およびセカンダリ DB インスタンスが処理されます。ブロックレベルレプリケーションの場合、RDS はプライマリ DB インスタンスとセカンダリ DB インスタンスを処理します。設定は自動的に行われるため、RDS はデプロイする SQL Server のバージョンに基づいて、DBM、Always On AG、またはブロックレベルレプリケーションを選択します。

Amazon RDS では、SQL Server の以下のバージョンおよびエディションの常時稼働 AG によるマルチ AZ がサポートされます。
+ SQL Server 2022:
  + Standard Edition
  + Enterprise Edition
+ SQL Server 2019:
  + Standard Edition 15.00.4073.23 以降
  + Enterprise Edition
+ SQL Server 2017:
  + Standard Edition 14.00.3401.7 以降
  + Enterprise Edition 14.00.3049.1 以降
+ SQL Server 2016: Enterprise Edition 13.00.5216.0 以降

Amazon RDS では、上述のバージョンを除き、SQL Server の以下のバージョンおよびエディションの DBM によるマルチ AZ がサポートされます。
+ SQL Server 2019: Standard Edition 15.00.4043.16
+ SQL Server 2017: Standard および Enterprise Edition
+ SQL Server 2016: Standard および Enterprise Edition 

Amazon RDS は、SQL Server 2022 Web Edition 16.00.4215.2 以降のブロックレベルレプリケーションでマルチ AZ をサポートしています。

**注記**  
16.00.4215.2 以降で作成された新しい DB インスタンスのみが、ブロックレベルレプリケーションによるマルチ AZ 配置をサポートします。既存の SQL Server 2022 Web Edition インスタンスには、次の制限が適用されます。  
バージョン 16.00.4215.2 の既存のインスタンスの場合、ブロックレベルレプリケーションを有効にするには、同じマイナーバージョン以上の新しいインスタンスにスナップショットを復元する必要があります。
古いマイナーバージョンを持つ SQL Server 2022 Web インスタンスは、マイナーバージョン 16.00.4215.2 以降にアップグレードして、ブロックレベルレプリケーションを有効にすることができます。

次の SQL クエリを使用して、SQL Server DB インスタンスがシングル AZ、DBM によるマルチ AZ、または Always On AGs によるマルチ AZ のいずれであるかを特定できます。このクエリは、SQL Server Web Edition でのマルチ AZ 配置には適用されません。

```
SELECT CASE WHEN dm.mirroring_state_desc IS NOT NULL THEN 'Multi-AZ (Mirroring)'
    WHEN dhdrs.group_database_id IS NOT NULL THEN 'Multi-AZ (AlwaysOn)'
    ELSE 'Single-AZ'
    END 'high_availability'
FROM sys.databases sd
LEFT JOIN sys.database_mirroring dm ON sd.database_id = dm.database_id
LEFT JOIN sys.dm_hadr_database_replica_states dhdrs ON sd.database_id = dhdrs.database_id AND dhdrs.is_local = 1
WHERE DB_NAME(sd.database_id) = 'rdsadmin';
```

出力は次のようになります。

```
high_availability
Multi-AZ (AlwaysOn)
```

## Microsoft SQL Server DB インスタンスへのマルチ AZ の追加
<a name="USER_SQLServerMultiAZ.Adding"></a>

AWS マネジメントコンソールを使用して新しい SQL Server DB インスタンスを作成する場合、データベースミラーリング (DBM)、Always On AG、またはブロックレベルレプリケーションによるマルチ AZ を追加できます。これを行うには、**[マルチ AZ 配置]** から **[はい (ミラーリング/常時/ブロックレベルレプリケーション)]** を選択します。詳細については、「[Amazon RDS DB インスタンスの作成](USER_CreateDBInstance.md)」を参照してください。

コンソールを使用して既存の SQL Server DB インスタンスを変更する場合、**[DB インスタンスを変更]** ページの **[マルチ AZ 配置]** から **[はい (ミラーリング/常時/ブロックレベルレプリケーション)]** を選択して、DBM、AG、またはブロックレベルレプリケーションによるマルチ AZ を追加できます。詳細については、「[Amazon RDS DB インスタンスを変更する](Overview.DBInstance.Modifying.md)」を参照してください。

**注記**  
DB インスタンスが Always On 可用性グループ (AG) ではなくデータベースのミラーリング (DBM) を実行している場合は、マルチ AZ を追加する前に、インメモリ最適化を無効にする必要が生じることがあります。DB インスタンスで SQL Server 2016、または 2017 Enterprise Edition が実行され、インメモリ最適化が有効になっている場合は、マルチ AZ を追加する前に DBM でのインメモリ最適化を無効にします。  
DB インスタンスで SQL Server Web Edition の AG またはブロックレベルレプリケーションを実行している場合、このステップは必要ありません。

## Microsoft SQL Server DB インスタンスからのマルチ AZ の削除
<a name="USER_SQLServerMultiAZ.Removing"></a>

AWS マネジメントコンソールを使用して既存の SQL Server DB インスタンスを変更する場合、DBM、AG、またはブロックレベルレプリケーションを使用してマルチ AZ を削除できます。これを行うには、**[DB インスタンスを変更]** ページで **[マルチ AZ 配置]** から **[いいえ (ミラーリング/常時/ブロックレベルレプリケーション)]** を選択します。詳細については、「[Amazon RDS DB インスタンスを変更する](Overview.DBInstance.Modifying.md)」を参照してください。

# Microsoft SQL Server マルチ AZ 配置の制限、注意事項、および推奨事項
<a name="USER_SQLServerMultiAZ.Recommendations"></a>

以下は、RDS for SQL Server DB インスタンスでマルチ AZ 配置を使用する際の、いくつかの制限事項です。
+ クロスリージョンマルチ AZ はサポートされていません。
+ マルチ AZ 配置の RDS for SQL Server DB インスタンスはサポートされていません。
+ データベースの読み取りアクティビティを受け入れるように、セカンダリ DB インスタンスを設定することはできません。
+ Always On 可用性グループ (AG) を備えたマルチ AZ は、メモリ内最適化をサポートします。
+ Always On 可用性グループ (AG) を使用するマルチ AZ は、可用性グループリスナーでの Kerberos 認証をサポートしていません。これは、リスナーにサービスプリンシパル名 (SPN) がないためです。
+ ブロックレベルレプリケーションを使用するマルチ AZ は現在、SQL Server Web Edition インスタンスでのみサポートされています。
+ SQL Server マルチ AZ 配置内の SQL Server DB インスタンス上のデータベースの名前を変更することはできません。そのようなインスタンスのデータベースの名前を変更する必要がある場合、まず DB インスタンスのマルチ AZ を無効にし、それから名前を変更します。最後に、DB インスタンスのマルチ AZ を再び有効にします。
+ 完全な復旧モデルを使用してバックアップされているマルチ AZ DB インスタンスのみ復元できます。
+ マルチ AZ 配置は、SQL Server エージェントジョブの数が 10,000 に制限されています。

  制限の引き上げが必要な場合は、サポート に連絡して緩和をリクエストしてください。[AWS サポート センター](https://console.aws.amazon.com/support/home#/)のページを開き、必要に応じてサインインし、[**ケースの作成**] を選択します。**[Service Limit increase]** (サービス制限の緩和) を選択します。フォームに入力して送信します。
+ SQL Server マルチ AZ 配置内の SQL Server DB インスタンス上にオフラインのデータベースを配置することはできません。
+ RDS for SQL Server は、MSDB データベースのアクセス許可をセカンダリインスタンスにレプリケートしません。これらのアクセス許可がセカンダリインスタンスで必要な場合は、手動で再作成する必要があります。
+ ボリュームメトリクスは、ブロックレベルレプリケーションを使用するインスタンスのセカンダリホストでは使用できません。

以下は、RDS for SQL Server DB インスタンスでマルチ AZ 配置を使用する際の、いくつかの注意事項です。
+ Amazon RDS は常時稼働 AG [可用性グループのリスナーエンドポイント](https://docs.microsoft.com/en-us/sql/database-engine/availability-groups/windows/listeners-client-connectivity-application-failover)を公開します。エンドポイントはコンソールに表示され、`DescribeDBInstances` API オペレーション によってエンドポイントフィールドのエントリとして返されます。
+ Amazon RDS は [可用性グループのマルチサブネットフェイルオーバー](https://docs.microsoft.com/en-us/sql/database-engine/availability-groups/windows/listeners-client-connectivity-application-failover)をサポートします。
+ 仮想プライベートクラウド (VPC) 内の SQL Server DB インスタンスで SQL Server のマルチ AZ を使用するには、まず、少なくとも 2 つの異なるアベイラビリティーゾーンにサブネットを持つ DB サブネットグループを作成します。次に、その DB サブネットグループを SQL Server DB インスタンスのプライマリレプリカに割り当てます。
+ マルチ AZ 配置にするために DB インスタンスが変更されている場合、変更中は、[**変更中**] のステータスになります。Amazon RDS によりスタンバイが作成され、プライマリ DB インスタンスのバックアップが作成されます。このプロセスが完了した後で、プライマリ DB インスタンスのステータスが [**利用可能**] になります。
+ マルチ AZ 配置では、すべてのデータベースが同じノードにあります。プライマリホストのデータベースがフェイルオーバーする場合は、すべての SQL Server データベースが 1 つのアトミックユニットとしてスタンバイホストにフェイルオーバーします。Amazon RDS により新しい正常なホストがプロビジョニングされ、異常なホストに置き換わります。
+ DBM、AG、またはブロックレベルレプリケーションを使用したマルチ AZ は、単一のスタンバイレプリカをサポートします。
+ ユーザー、ログイン、アクセス許可はセカンダリに自動的にレプリケートされます。それらを再作成する必要はありません。ユーザー定義のサーバーロールは マルチ AZ 配置で Always On AG またはブロックレベルレプリケーションを使用する DB インスタンスでレプリケーションされます。
+ マルチ AZ 配置では、RDS for SQL Server は SQL Server ログインを作成して Always On AG またはデータベースミラーリングを許可します。RDS が作成するログインのパターンは、`db_<dbiResourceId>_node1_login`、`db_<dbiResourceId>_node2_login`、`db_<dbiResourceId>_witness_login` です。
+ RDS for SQL Server は、リードレプリカへのアクセスを許可する SQL Server ログインを作成します。RDS が作成するログインのパターンは、`db_<readreplica_dbiResourceId>_node_login` です。
+ マルチ AZ 配置では、ジョブのレプリケーション機能がオンになっているとき、SQL Server エージェントジョブは、プライマリホストからセカンダリホストにレプリケートされます。詳しくは、「[SQL Server エージェントジョブレプリケーションをオンにする](Appendix.SQLServer.CommonDBATasks.Agent.md#SQLServerAgent.Replicate)」を参照してください。
+ 同期的データレプリケーションのため、1 つのアベイラビリティーゾーン内のスタンダード DB インスタンスのデプロイと比較した場合、レイテンシーが長くなる可能性があります。
+ フェイルオーバー時間は、復旧プロセスの完了までにかかる時間の影響を受けます。大量のトランザクションがあると、フェイルオーバー時間はより長くなります。
+ SQL Server マルチ AZ 配置では、フェイルオーバー再起動でプライマリ DB インスタンスのみを再起動します。フェイルオーバー後、プライマリ DB インスタンスは新しいセカンダリ DB インスタンスになります。マルチ AZ インスタンスのパラメータは更新されない可能性があります。フェイルオーバーなしの再起動の場合、プライマリ DB インスタンスとセカンダリ DB インスタンスの両方が再起動し、再起動後にパラメータが更新されます。DB インスタンスが応答しない場合は、フェイルオーバーなしで再起動することをお勧めします。

以下は、RDS for Microsoft SQL Server DB インスタンスでマルチ AZ 配置を使用するときのいくつかのレコメンデーションです。
+ 本稼働または本稼働前に使用するデータベースでは、以下のオプションを使用することをお勧めします。
  + 高可用性を重視したマルチ AZ 配置
  + 高速で安定したパフォーマンスを実現する「プロビジョンド IOPS」
  + 「汎用」ではなく「メモリ最適化」
+ セカンダリ用のインスタンスにはアベイラビリティーゾーン (AZ) を選択することができません。アプリケーションホストをデプロイするときには、この点を考慮してください。データベースが別の AZ にフェイルオーバーする可能性があるため、アプリケーションホストがデータベースと同じ AZ に含まれない場合があります。このため、特定の AWS リージョン内のすべての AZ 間で、アプリケーションホストのバランスをとることをお勧めします。
+ 最高のパフォーマンスのために、大量のデータをロードするオペレーション中はデータベースミラーリング、Always On AG、またはブロックレベルレプリケーションを有効にしないでください。できる限り高速でデータを更新する必要がある場合は、DB インスタンスをマルチ AZ 配置に変換する前にデータの更新を終了します。
+ SQL Server データベースにアクセスするアプリケーションには、接続エラーを見つける例外処理が必要です。以下のコード例では、通信エラーを見つける try/catch ブロックを示しています。この例では、接続が成功した場合に `break` ステートメントは `while` ループを終了しますが、例外がスローされた場合は最大 10 回再試行します。

  ```
  int RetryMaxAttempts = 10;
  int RetryIntervalPeriodInSeconds = 1;
  int iRetryCount = 0;
  while (iRetryCount < RetryMaxAttempts)
  {
     using (SqlConnection connection = new SqlConnection(DatabaseConnString))
     {
        using (SqlCommand command = connection.CreateCommand())
        {
           command.CommandText = "INSERT INTO SOME_TABLE VALUES ('SomeValue');";
           try
           {
              connection.Open();
              command.ExecuteNonQuery();
              break;
           }
           catch (Exception ex) 
           {
              Logger(ex.Message);
              iRetryCount++;
           }
           finally {
              connection.Close();
           }
        }
     }
     Thread.Sleep(RetryIntervalPeriodInSeconds * 1000);
  }
  ```
+ DBM または AG を使用してマルチ AZ インスタンスを操作する場合は、`Set Partner Off` コマンドを使用しないでください。このコマンドは、ブロックレベルレプリケーションを使用するインスタンスではサポートされていません。例えば、以下は実行しないでください。

  ```
  --Don't do this
  ALTER DATABASE db1 SET PARTNER off
  ```
+ 復旧モードを `simple` に設定しないでください。例えば、以下は実行しないでください。

  ```
  --Don't do this
  ALTER DATABASE db1 SET RECOVERY simple
  ```
+ 高可用性のためにブロックレベルレプリケーションを使用しない限り、マルチ AZ DB インスタンスに新しいログインを作成するときは、`DEFAULT_DATABASE` パラメータは使用しないでください。これらの設定は、スタンドバイ用ミラーには適用できないためです。例えば、以下は実行しないでください。

  ```
  --Don't do this
  CREATE LOGIN [test_dba] WITH PASSWORD=foo, DEFAULT_DATABASE=[db2]
  ```

  また、以下の操作をしないでください。

  ```
  --Don't do this
  ALTER LOGIN [test_dba] WITH DEFAULT_DATABASE=[db3]
  ```

# セカンダリの場所を確認する
<a name="USER_SQLServerMultiAZ.Location"></a>

AWS マネジメントコンソール を使用して、セカンダリレプリカの場所を調べることができます。VPC 内のプライマリ DB インスタンスを設定する場合は、セカンダリの場所がわかっている必要があります。

![\[セカンダリ AZ\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/images/SQLSvr-MultiAZ.png)


AWS CLI の `describe-db-instances` コマンド、または RDS API の `DescribeDBInstances` オペレーションを使用して、セカンダリのアベイラビリティーゾーンを表示することもできます。その出力には、スタンバイミラーが配置されているセカンダリ AZ が表示されます。

# データベースミラーリングから Always On 可用性グループへの移行
<a name="USER_SQLServerMultiAZ.Migration"></a>

Microsoft SQL Server Enterprise Edition のバージョン 14.00.3049.1 では、Always On 可用性グループ (AG) はデフォルトで有効になっています。

データベースミラーリング (DBM) から AG に移行するには、まずバージョンを確認します。Enterprise Edition 13.00.5216.0 より前のバージョンの DB インスタンスを使用している場合は、インスタンスにパッチを適用して 13.00.5216.0 以降に変更します。Enterprise Edition 14.00.3049.1 より前のバージョンの DB インスタンスを使用している場合は、インスタンスにパッチを適用して 14.00.3049.1 以降に変更します。

AG を使用するようにミラーリングされた DB インスタンスをアップグレードする場合は、初期にアップグレードを実行し、インスタンスを変更して マルチ AZ を削除してから、もう一度変更してマルチ AZ を追加します。これにより、インスタンスは Always On AG を使用するように変換されます。