IsAliveで使用される“SELECT@@servername”は、IsAliveが実行しているわけではありません。実際にはOnlineThreadとよばれる別スレッドで60秒間隔で実行され、実行結果はキャッシュされます。IsAliveはキャッシュされた結果をチェックしWSFCに結果を返します。IsAliveの間隔はフェールオーバークラスターマネージャやcluster.exeを使用して変更できます。しかし、OnlineThreadから実行される“SELECT@@servername”の間隔は固定であり、変更することはできません。
また、OnlineThreadは“SELECT@@servername”が成功すると次の“SELECT@@servername”を実行するまでの60秒間は1秒ごとにLooksAliveと同様にSCMを使用して状態のチェックもしています。
SQL Server 2012では”SELECT @@servername”ではなく、ストアド プロシージャsp_server_diagnosticsが使用されます。sp_server_diagnosticsは滞在的な障害を検知するため5つのコンポーネントごとに診断データと正常性の状態を返します。コンポーネントの種類と診断データと正常性の状態については次のサイトをご確認ください。>> sp_server_diagnostics (Transact-SQL)
sp_server_diagnosticsは1度実行されると既定で20秒ごとに5つのコンポーネントの診断データと正常性の情報を返し、その結果はキャッシュされます。この間隔はSQL ServerリソースのプロパティHealthCheckTimeout(既定は60秒) の1/3の時間となります。
sp_server_diagnostics の各コンポーネントの正常性状態が”エラー”となる条件は次の表のとおりとなります。尚、これらはSQL Server 2012 RC0の時点でのものとなりますので、製品版では変更されている可能性もございます。予めご了承ください。
コンポーネント | エラーの条件 |
system |
次のいずれかに該当
|
resource |
|
query_processing |
次のいずれかに該当
|
io_subsystem |
|
events |
|
SQL Server 2008 R2まではSQL Serverサービス状態のチェックと“SELECT @@servername”の実行が成功するかどうかでSQL Serverの正常性状態がチェックされていたため、ユーザーがSQL Serverが再起動またはフェール―オーバーが行われる条件を変更することはできませんでした。
SQL Server 2012ではsp_server_diagnosticsの5つのコンポーネントの正常性状態から、再起度またはフェールオーバーが行われる条件(フェールオーバーポリシー)をユーザーが設定することができます。この条件はSQL ServerデータベースエンジンリソースのFailureConditionLevelプロパティで設定します。FailureConditionLevel プロパティは ALTER SERVRE CONFIGRATION コマンドかフェールオーバー クラスター マネージャーから 0 から 5 の範囲で設定します。
ALTER SERVER CONFIGURATION (Transact-SQL)
FailureConditionLevelプロパティの値に応じてIsAliveは再起動またはフェールオーバーの発生条件をチェックします。FailureConditionLevelのごとのSQL Server サービスの再起動またはフェールオーバーが行われる条件は次の表のとおりです。
FailureConditionLevel | 再起動またはフェールオーバーの発生条件 |
0 SQL Server |
サービスの再起動またはフェールオーバーは自動で行われません。 |
1 | SQL Server のサービスがダウン |
2 |
次のいずれかに該当
|
3(既定) |
次のいずれかに該当
|
4 |
次のいずれかに該当
|
5 |
次のいずれかに該当
|
SQL ServerのサービスがダウンしているかのチェックはSCMを使用して行われます。具体的にはWindowsのQueryServiceStatusEx APIを使用して最新のサービスの状態を取得します。
SQL Serverインスタンスが反応しないと判断される条件は、キャッシュされているsp_server_diagnosticsの結果が最後に更新された時刻から、SQL ServerリソースのHealthCheckTimeout プロパティに設定された時間以上経過している場合です。HealthCheckTimeoutの既定値は60秒ですので、60秒以上sp_server_diagnosticsから診断データと正常性状態の情報が返されていない場合、SQL Serverが反応しないと判断されます。
ここまでフェールオーバーポリシーと新しい正常性のチェックについてご紹介してきましたが、ページの都合上今回はここまでとさせていただきます。次回はひきつづきSQL Serverの正常性のチェックについてとその他の改良点についてご紹介します。