DO’s&DONT’s #15: やってはいけないこと - クラスタ SQL Server をサービスとして操作すること

神谷 雅紀
Escalation Engineer

 

MSCS または MSFC クラスタリソースとして動作している SQL Server や SQL Server Agent を net コマンドや sc コマンド、コントロールパネルの「サービス」 (services.msc MMC スナップイン) から停止したり、開始したりしてはいけません。

 

なぜ?

クラスタリソースとして動作している SQL Server や SQL Server Agent は、その実体はサービスであっても、クラスタサービスの管理下にあります。例えば、SQL Server クラスタリソースをオンラインまたはオフラインにしようとすると、その要求は、以下の図のように伝播します。SQL Server Agent の場合にはクラスタリソース DLL が SQL Server Agent 用になりますが、要求の伝播の仕方は全く同じです。要求の処理結果は、この経路を逆にたどって要求元に返されます。

cluster

では、net stop や sc stop で SQL Server サービスを停止した場合、どのようなことが起こるでしょうか?

その要求は、クラスタサービスを経由せず、直接サービスコントロールマネージャに送られます。そのような停止要求があったことは、クラスタリソース DLL もクラスタサービスも知りません。その要求によって SQL Server サービスが停止すると、クラスタサービスから見れば、SQL Server クラスタリソースは、要求していないにも関わらず停止したと見なされます。言い換えれば、クラスタリソースは失敗したと見なされます。その結果、クラスタリソースの状態としては「失敗」となり、クラスタサービスによってクラスタリソースを復旧させるためのオンライン要求が出されます。

これだけであれば、特に問題はないように思えます。しかし、実際には、これほど単純ではありません。なぜなら、これに、クラスタリソース間の依存関係やサービスの依存関係が加わるためです。

SQL Server Agent クラスタリソースは SQL Server クラスタリソースに依存しています。また、SQL Server Agent サービスは SQL Server サービスに依存しています。この状態で、SQL Server サービスを停止しようとしたとします。net stop コマンドで SQL Server サービスを停止しようとすると、SQL Server Agent サービスは SQL Server サービスに依存しているため、まず最初に SQL Server Agent サービスが停止します。その後、SQL Server サービスに停止要求が出されます。SQL Server Agent サービスが停止すると、クラスタサービスは SQL Server Agent クラスタリソースが失敗したと判断し、SQL Server Agent クラスタリソースをオンラインにしようとします。しかし、SQL Server Agent サービスが依存する SQL Server サービスの停止要求も既に出されています。SQL Server サービスが停止すると、SQL Server Agent サービスは開始できませんので、もし、SQL Server サービスが停止している場合には、SQL Server Agent サービスの開始は失敗し、SQL Server Agent クラスタリソースは失敗します。SQL Server サービスが停止することで、SQL Server クラスタリソースは失敗と見なされます。このような状況が連鎖的に発生するとフェールオーバー発生のしきい値を超えて「失敗」が発生し、フェールオーバーに至るなど、予期しない結果を招きます。

 

どうすべきか

クラスタリソースとして動作している SQL Server や SQL Server Agent の開始および停止は、クラスタに対応したツールで管理します。具体的には、以下のツールから実行します。

  • フェールオーバークラスターマネージャー GUI
  • SQL Server 構成マネージャ (SQL Server Configuration Manager) GUI
  • SQL Server Management Studio – オブジェクトエクスプローラー GUI
  • cluster resource コマンド

Cluster API や WMI などを使用したプログラミングによる開始停止も可能です。