適用対象:Windows 上の SQL Server
このトピックでは、SQL Server で Transact-SQL または PowerShell を使用して Always On 可用性グループの柔軟なフェールオーバー ポリシーを構成する方法について説明します。 柔軟なフェールオーバー ポリシーを使用すると、可用性グループの 自動フェールオーバー を実行する条件をきめ細かく制御できます。 自動フェールオーバーを実行するエラー条件および正常性チェックの頻度を変更することで、自動フェールオーバーの確率値を増減して高可用性の SLA をサポートできます。
可用性グループの柔軟なフェールオーバー ポリシーは、そのエラー条件レベルと正常性チェックのタイムアウトしきい値によって定義されます。 可用性グループがエラー条件レベルまたはその正常性チェックのタイムアウトしきい値を超えていることを検出すると、可用性グループのリソース DLL が Windows Server フェールオーバー クラスタリング (WSFC) クラスターに応答を送り返します。 その後、WSFC クラスターは、セカンダリ レプリカに対する自動フェールオーバーを開始します。
注
可用性グループの柔軟なフェールオーバー ポリシーは、 SQL Server Management Studioを使用して構成できません。
自動フェールオーバーの制限
自動フェールオーバーが行われるには、現在のプライマリ レプリカおよび 1 つのセカンダリ レプリカが自動フェールオーバーを使用する同期コミット可用性モード用に構成され、セカンダリ レプリカがプライマリ レプリカと同期している必要があります。
SQL Server 2019 (15.x) では同期レプリカの最大数が SQL Server 2017 (14.x) での 3 から 5 へと増加しました。 この 5 つのレプリカのグループを、グループ内で自動フェールオーバーするように構成できます。 1 つのプライマリ レプリカと、4 つの同期セカンダリ レプリカがあります。
WSFC クラスターでは、可用性グループが WSFC のエラーしきい値を超えると、自動フェールオーバーはその可用性グループに対して実行されません。 また、クラスター管理者が失敗したリソース グループを手動でオンラインにするか、データベース管理者が可用性グループの手動フェールオーバーを実行するまで、可用性グループの WSFC リソース グループはエラー状態のままになります。 WSFC のエラーしきい値 は、特定の期間に可用性グループに対して許容されるエラーの最大数として定義されています。 既定の期間は 6 時間であり、この期間のエラーの最大数の既定値は n-1 です ( n は WSFC ノードの数です)。 特定の可用性グループのエラーしきい値を変更するには、WSFC フェールオーバー マネージャー コンソールを使用します。
前提条件
- プライマリ レプリカをホストするサーバー インスタンスに接続されている必要があります。
アクセス許可
| タスク | アクセス許可 |
|---|---|
| 新しい可用性グループの柔軟なフェールオーバー ポリシーを構成する | sysadmin 固定サーバー ロールのメンバーシップと、CREATE AVAILABILITY GROUP サーバー権限、ALTER ANY AVAILABILITY GROUP 権限、または CONTROL SERVER 権限が必要です。 |
| 既存の可用性グループのポリシーを変更する | 可用性グループに対する ALTER AVAILABILITY GROUP 権限、CONTROL AVAILABILITY GROUP 権限、ALTER ANY AVAILABILITY GROUP 権限、または CONTROL SERVER 権限が必要です。 |
ヘルスチェックのタイムアウトしきい値
可用性グループの WSFC リソース DLL では、プライマリ レプリカをホストする SQL Server のインスタンスで sp_server_diagnostics ストアド プロシージャを呼び出して、プライマリ レプリカの 正常性チェック を実行します。 sp_server_diagnostics は、可用性グループの正常性チェックのタイムアウトしきい値の 3 分の 1 の間隔で結果を返します。 既定の正常性チェックのタイムアウトしきい値は 30 秒であるので、 sp_server_diagnostics では 10 秒間隔で結果が返されます。 sp_server_diagnostics が低速であるか、情報を返さない場合、リソース DLL は正常性チェックのタイムアウトしきい値の間隔が完全に経過するのを待ってから、プライマリ レプリカが無応答であると判断します。 プライマリ レプリカが応答しない場合、自動フェールオーバー (現在サポートされている場合) が開始されます。
重要
sp_server_diagnostics では、データベース レベルでの正常性チェックは実行されません。
エラー条件レベル
sp_server_diagnostics から返される診断データと正常性の情報によって自動フェールオーバーが保証されるかどうかは、可用性グループのエラー条件レベルによって異なります。 エラー条件レベル は、自動フェールオーバーを実行するエラー条件を指定します。 エラー条件レベルの範囲は、最も制限が緩いものから (レベル 1)、最も制限の厳しい指定 (レベル 5) まで 5 つあります。 任意のレベルは、それより制限が緩いすべてのレベルを含みます。 したがって、最も制限の厳しいレベル 5 にはそれより制限が緩い 4 つの条件が含まれます。以下同様です。
重要
破損したデータベースおよび問題があると考えられるデータベースは、すべてのエラー条件レベルで検出されません。 そのため、破損したデータベースや問題があると考えられるデータベースによって、(その原因がハードウェア障害、データ破損、またはその他の問題であるかにかかわらず) 自動フェールオーバーがトリガーされることはありません。
次の表では、各レベルに対応するエラー状態について説明します。
| レベル | 失敗条件 | Transact-SQL 値 | PowerShell の値 |
|---|---|---|---|
| 1 つ | サーバーダウン時。 次のいずれかが発生した場合に自動フェールオーバーを開始することを指定します。 SQL Server サービスがダウンした。 WSFC クラスターに接続するための可用性グループのリースが、サーバー インスタンスから ACK を受信しないために期限切れになった。 詳細については、「How It Works:SQL Server Always On Lease Timeout」 (動作方法: SQL Server Always On のリース タイムアウト) を参照してください。 これは最も制限の緩いレベルです。 |
1 | OnServerDown |
| 二 | サーバーが応答しない場合。 次のいずれかが発生した場合に自動フェールオーバーを開始することを指定します。 SQL Server のインスタンスがクラスターに接続していず、可用性グループのユーザー指定の正常性チェック タイムアウトしきい値を超えた。 可用性レプリカがエラー状態である。 |
2 | OnServerUnresponsive |
| 3 | 重大なサーバー エラー。 孤立したスピンロック、重大な書き込みアクセス違反、短い時間内での過剰なメモリ ダンプの生成など、重大な SQL Server の内部エラーに対して自動フェールオーバーを開始することを指定します。 これは既定のレベルです。 |
3 | OnCriticalServerError |
| 4 | 中程度のサーバー エラー。 SQL Server 内部リソース プールに永続的なメモリ不足の状態があるなど中程度の SQL Server 内部エラーが発生した場合に自動フェールオーバーを開始することを指定します。 | 4 | OnModerateServerError |
| 5 | 任意の限定されたエラー条件。 以下のような任意の限定されたエラー条件に対して自動フェールオーバーを開始することを指定します。 スケジューラ デッドロックの検出。 解決不可能なデッドロックが検出された。 これは最も制限の厳しいレベルです。 |
5 | OnAnyQualifiedFailureConditions |
注
クライアント要求に対して SQL Server のインスタンスが応答しないことは、可用性グループには関係ありません。
Transact-SQL の使用
柔軟なフェールオーバー ポリシーを構成するには
プライマリ レプリカをホストするサーバー インスタンスに接続します。
新しい可用性グループの場合は、 CREATE AVAILABILITY GROUPTransact-SQL ステートメントを使用します。 既存の可用性グループを変更する場合は、 ALTER AVAILABILITY GROUPTransact-SQL ステートメントを使用します。
フェールオーバーの条件レベルを設定するには、FAILURE_CONDITION_LEVEL = n オプションを使用します。ここで、 n は 1 ~ 5 の整数です。
たとえば、次の Transact-SQL ステートメントでは、既存の可用性グループ
AG1のエラー条件レベルをレベル 1 に変更します。ALTER AVAILABILITY GROUP AG1 SET (FAILURE_CONDITION_LEVEL = 1);これらの整数値とエラー条件レベルの関係は次のとおりです。
Transact-SQL 値 レベル 自動フェールオーバーはいつ開始されるのか… 1 1 つ サーバーダウン時。 フェールオーバーまたは再起動のため、SQL Server サービスが停止した場合。 2 二 サーバーが応答しない場合。 下限値の任意の条件が満たされた場合、SQL Server サービスがクラスターに接続され正常性チェックのタイムアウトしきい値を超えた場合、または現在のプライマリ レプリカがエラー状態になった場合。 3 3 重大なサーバー エラー。 下限値の任意の条件が満たされるか、重大な内部サーバー エラーが発生した場合。
これは既定のレベルです。4 4 中程度のサーバー エラー。 下限値の任意の条件が満たされるか、中程度のサーバー エラーが発生した場合。 5 5 任意の限定されたエラー条件。 より低い値のいずれかの条件が満たされるか、該当する障害条件が発生した場合。 フェールオーバー条件レベルの詳細については、「可用性グループの自動フェールオーバーのための柔軟なフェールオーバー ポリシー (SQL Server)」を参照してください。
正常性チェックのタイムアウトしきい値を構成するには、HEALTH_CHECK_TIMEOUT = n オプションを使用します。ここで n は 15000 ミリ秒 (15 秒) ~ 4294967295 ミリ秒の整数です。 既定値は 30000 ミリ秒 (30 秒) です。
たとえば、次の Transact-SQL ステートメントでは、既存の可用性グループ
AG1の正常性チェックのタイムアウトしきい値が 60,000 ミリ秒 (1 分) に変更されます。ALTER AVAILABILITY GROUP AG1 SET (HEALTH_CHECK_TIMEOUT = 60000);
PowerShell の使用
柔軟なフェールオーバー ポリシーを構成するには
既定 (cd) を、プライマリ レプリカをホストするサーバー インスタンスに設定します。
可用性グループに可用性レプリカを追加する場合は、 New-SqlAvailabilityGroup コマンドレットを使用します。 既存の可用性レプリカを変更する場合は、 Set-SqlAvailabilityGroup コマンドレットを使用します。
フェールオーバーの条件レベルを設定するには、 FailureConditionLevellevel パラメーターを使用します。この level は次の値のいずれかになります。
値 レベル 自動フェールオーバーはいつ開始されるのか… OnServerDown 1 つ サーバーダウン時。 フェールオーバーまたは再起動のため、SQL Server サービスが停止した場合。 OnServerUnresponsive 二 サーバーが応答しない場合。 下限値の任意の条件が満たされた場合、SQL Server サービスがクラスターに接続され正常性チェックのタイムアウトしきい値を超えた場合、または現在のプライマリ レプリカがエラー状態になった場合。 OnCriticalServerError 3 重大なサーバー エラー。 下限値の任意の条件が満たされるか、重大な内部サーバー エラーが発生した場合。
これは既定のレベルです。OnModerateServerError 4 中程度のサーバー エラー。 下限値の任意の条件が満たされるか、中程度のサーバー エラーが発生した場合。 OnAnyQualifiedFailureConditions 5 任意の限定されたエラー条件。 より低い値のいずれかの条件が満たされるか、該当する障害条件が発生した場合。 フェールオーバー条件レベルの詳細については、「可用性グループの自動フェールオーバーのための柔軟なフェールオーバー ポリシー (SQL Server)」を参照してください。
たとえば、次のコマンドでは、既存の可用性グループ
AG1のエラー条件レベルをレベル 1 に変更します。Set-SqlAvailabilityGroup ` -Path SQLSERVER:\Sql\PrimaryServer\InstanceName\AvailabilityGroups\MyAg ` -FailureConditionLevel OnServerDown正常性チェックのタイムアウトしきい値を設定するには、 HealthCheckTimeoutn パラメーターを使用します。ここで n は 15000 ミリ秒 (15 秒) ~ 4294967295 ミリ秒の整数です。 既定値は 30000 ミリ秒 (30 秒) です。
たとえば、次のコマンドでは、既存の可用性グループ
AG1の正常性チェックのタイムアウトしきい値が 120,000 ミリ秒 (2 分) に変更されます。Set-SqlAvailabilityGroup ` -Path SQLSERVER:\Sql\PrimaryServer\InstanceName\AvailabilityGroups\MyAG ` -HealthCheckTimeout 120000
注
コマンドレットの構文を表示するには、 PowerShell 環境で Get-Help SQL Server コマンドレットを使用します。 詳細については、「 Get Help SQL Server PowerShell」を参照してください。
SQL Server PowerShell プロバイダーを設定して使用するには
関連タスク
自動フェールオーバーを設定するには
可用性レプリカの可用性モードの変更 (SQL Server) (自動フェールオーバーには同期コミット可用性モードが必要)