Azure 仮想マシン上で SQL Server AlwaysOn 可用性グループを構築する場合の推奨事項
高原 伸城
Support Escalation Engineer
皆さん、こんにちは。 BI Data Platform サポートチームの 高原 です。
今回は、Azure 仮想マシン上で SQL Server AlwaysOn 可用性グループを構築する場合の推奨事項について紹介します。
Azure 仮想マシンをホストしているホスト仮想マシンでは定期的にメンテナンス作業が実施されており、ホスト仮想マシンの完全な再起動を必要としないメカニズムを使用してメンテナンス作業が行われています。
しかしながら、上記の作業の際、Azure 仮想マシンは 数十秒 から 30秒程度、一時停止状態になります。
そのため、Azure 仮想マシンの一時停止状態時間よりも、フェールオーバー クラスターの監視間隔が短い場合、フェールオーバーが発生する可能性があります。
この様な Azure プラットフォーム特有の動作に対応するため、フェールオーバークラスター、SQL Server 、さらに、アプリケーションクライアントにおけるタイムアウト値の延長をお勧めしています。
[推奨設定]
1) フェールオーバー クラスターのハートビート設定 (クラスタ側の設定)
SameSubnetDelay (単位:ミリ秒) * SameSubnetThreshold (単位:回数) が、30000 ミリ秒 (30 秒) 以上に設定する。
[例]
SameSubnetDelay = 1000
SameSubnetThreshold = 30
Azure 上でフェールオーバークラスターを構築する際の留意事項について
+ ハートビートの閾値の変更手順 参照
[機能] : クラスターサービス間の死活監視。既定値 5 秒。
[影響] : 時間内に応答がないと、応答がなかったノードはクラスターから除外され、除外されるノードがアクティブであった場合、フェールオーバーが発生する。
2) LeaseTimeout 設定 (SQL Server AlwaysOn 可用性グループ 側の設定)
LeaseTimeout 値を 30000 ミリ秒 (30 秒) 以上に設定する。
Lease Timeout の閾値の変更手順
----------------------------------
1) フェールオーバー クラスター マネージャーを起動します。
2) 左ペインのツリーから対象のクラスタ内の [役割] を選択します。
3) 右ペインに表示された役割の一覧から、対象の可用性グループの役割を選択します。
4) 右ペイン下の [リソース] タブを開きますs。
5) [その他のリソース] として対象の可用性グループのリソースが存在しますので、右クリックで [プロパティ] を開きます。
6) [プロパティ] 画面内 でさらに [プロパティ] タブを開き、[LeaseTimeout] の値をミリ秒単位で指定します。
7) [OK] ボタンを押下し適用します。
8) リソースを一旦オフラインにした後オンラインにし、変更を反映させます。(可用性グループがオフライン中には、データベースにアクセスできなくなります)
※LeaseTimeout の既定値は、20,000 ミリ秒(20秒)であり、最大値は 100000 ミリ秒(100秒)です。
[補足]
Lease Timeout の閾値を変更した場合、HealthCheckTimeout の閾値も変更ください。
また、HealthCheckTimeout の閾値は、Lease Timeout の閾値よりも大きな値を指定ください。
※ HealthCheckTimeout の既定値は、30,000ミリ秒(30秒)であり、最大値は 4294967295 ミリ秒です。
+ 正常性チェックのタイムアウトしきい値 (HealthCheckTimeout)
[機能] : 同一ノードのクラスターサービスと SQL Server が、「リース」と呼ばれるオブジェクトを更新する。リースが更新されれば、相手は正常、時間内に更新されなければ間は異常と判断。既定 20 秒。
[影響] : SQL Server が時間内にリースの更新が行われないと、クラスタリソース DLL は SQL Server を失敗と見なすため、クラスターにより再起動もしくはフェールオーバーが発生する。
クラスター (リソース DLL) が時間内にリースの更新を行わないと、SQL Server はスプリットブレインの可能性があるとみなし、データベースへの更新を行わせないようにする。
3) 接続タイムアウト値 (アプリケーション 側の設定)
アプリケーションで使用しているインタフェース (ODBC, System.Data.SqlClient など) の接続文字列やプロパティで、接続タイムアウト値を 30 秒以上に設定します。
[機能] : クライアントアプリケーションが SQL Server へ接続する際に、接続完了までに許容される時間。
[影響] : タイムアウトすると、SQL Server に接続できない。
SqlConnection.ConnectionTimeout プロパティ 接続文字列 (Entity Framework)
※ 本Blogの内容は、2017年8月現在の内容となっております。