

# 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 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 配置では、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` です。
+ 同期的データレプリケーションのため、1 つのアベイラビリティーゾーン内のスタンダード DB インスタンスのデプロイと比較した場合、レイテンシーが長くなる可能性があります。
+ フェイルオーバー時間は、復旧プロセスの完了までにかかる時間の影響を受けます。大量のトランザクションがあると、フェイルオーバー時間はより長くなります。
+ SQL Server マルチ AZ 配置では、フェイルオーバー再起動でプライマリ DB インスタンスのみを再起動します。フェイルオーバー後、プライマリ DB インスタンスは新しいセカンダリ DB インスタンスになります。マルチ AZ インスタンスのパラメータは更新されない可能性があります。フェイルオーバーなしの再起動の場合、プライマリ DB インスタンスとセカンダリ DB インスタンスの両方が再起動し、再起動後にパラメータが更新されます。DB インスタンスが応答しない場合は、フェイルオーバーなしで再起動することをお勧めします。

次の表は、RDS for SQL Server マルチ AZ 配置において、データベースミラーリング (DBM) または Always On 可用性グループ (AG) を使用する場合と、ブロックレベルのレプリケーションを使用する場合とで、サーバーレベルのオブジェクトがどのようにレプリケートされるかを比較したものです。


**オブジェクトタイプ別のレプリケーション動作**  

| オブジェクト | データベースミラーリング/Always On AG | ブロックレベルのレプリケーション | 
| --- | --- | --- | 
| ログイン | はい – Amazon RDS によってレプリケートされます。DEFAULT\_DATABASE プロパティはレプリケートされません。DBM または Always On AG インスタンスでログインを作成または変更する際は、DEFAULT\_DATABASE を使用しないでください。 | はい – DEFAULT\_DATABASE を含みます (制限なし)。 | 
| データベースのユーザーとアクセス許可 | はい – SQL Server ネイティブレプリケーション (ユーザーデータベースに保存) によってレプリケートされます。 | はい。 | 
| ユーザー定義のサーバーロール | Always On AG: はい – レプリケートされます。DBM: いいえ – レプリケートされません。 | はい。 | 
| リンクサーバー | いいえ – AG またはミラーの外部にある master データベースに保存されます。マルチ AZ を有効にする前にリンクサーバーを作成するか、フェイルオーバー後に手動で再作成します。 | はい – システムデータベースを含むボリューム全体がレプリケートされます。 | 
| SQL Server Audit | 部分的 – データベース監査仕様 (ユーザーデータベース内) がレプリケートされます。サーバー監査およびサーバー監査仕様は、レプリケートされません。プライマリと一致するように、AUDIT\_GUID パラメータを使用してセカンダリでこれらを手動で作成する必要があります。 | はい – すべての監査オブジェクトはボリュームレベルでレプリケートされます。 | 
| tempdb の設定 | オプション – 次のストアドプロシージャを使用した同期を有効にします。<pre>EXECUTE msdb.dbo.rds_set_system_database_sync_objects<br />    @object_types = 'TempDbFile';</pre> 一時的なオブジェクトとデータはレプリケートされません。 | はい – 設定はボリュームレベルでレプリケートされます。 | 
| SQL Server エージェントジョブ | オプション – 次のストアドプロシージャを使用した同期を有効にします。<pre>EXECUTE msdb.dbo.rds_set_system_database_sync_objects<br />    @object_types = 'SQLAgentJob';</pre> サポートされているカテゴリの T-SQL ジョブステップのみがレプリケートされます。SSIS、SSRS、レプリケーション、PowerShell、およびデータベースメールのステップタイプはレプリケートされません。 | はい – すべてのジョブはボリュームレベルでレプリケートされます。 | 
| CDC (変更データキャプチャ) | 部分的 – CDC メタデータと変更テーブル (ユーザーデータベース内) がレプリケートされます。キャプチャジョブとクリーンアップジョブ (msdb 内) は、直接レプリケートされません。Amazon RDS は、フェイルオーバー後に、以前に記録されたパラメータを使用して、新しいプライマリでそれらを削除して再作成します。rds\_set\_configuration を使用して、セカンダリに CDC パラメータをプリセットします。 | はい – すべての CDC オブジェクトはボリュームレベルでレプリケートされます。 | 
| リソースガバナー | はい – Amazon RDS によってレプリケートされます。同期を確認するには、次のクエリを実行します。<pre>SELECT * FROM msdb.dbo.rds_fn_server_object_last_sync_time();</pre>  | はい。 | 
| データベースの所有者 | いいえ – セカンダリインスタンスでは、データベース所有者は NT AUTHORITY\\SYSTEM に設定されます。フェイルオーバー後、msdb.dbo.rds\_changedbowner\_to\_rdsa を使用して所有権をリセットします。 | はい – 所有者は保持されます。 | 
| msdb のアクセス許可 | いいえ – RDS for SQL Server は、msdb データベースのアクセス許可をセカンダリインスタンスにレプリケートしません。手動で再作成する必要があります。 | はい – ボリュームレベルでレプリケートされます。 | 

以下は、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]
  ```