
現在、Server 2008 R2 上の負荷分散された IIS クラスター (NLB) にアプリケーションがあります。このアプリケーションは、レガシー データベース アクセス コードを活用しており、ときどき失敗するとアプリケーション プールが無効になります。
アプリ プールの状態の変化を監視する WMI イベント ウォッチャーを配置し (他の提案も歓迎します)、アプリ プールが停止状態になった場合にアプリ プールを再起動できるようにしたいと思います。
これは、新しいコードをプッシュできるようになるまでの一時的な回避策ですが、Dev/QA/UAT サイクルを経る必要があります。
root\webadministration 名前空間には ApplicationPool の WMI クラスがありますが、ステータスを取得するには、そのオブジェクトの GetState メソッドを呼び出す必要があるため、WMI イベントでそれを監視する方法がわかりません。
答え1
組み込みのイベント ログ監視を使用してこれを実行できる可能性があります。
ラピッド フェール保護によりアプリケーション プールがシャットダウンしている場合は、システム イベント ログに次のようなイベント ID 5002 が記録されている可能性があります。
「アプリケーション プール 'AppPoolName' は、そのアプリケーション プールを提供するプロセスで発生した一連の障害のため、自動的に無効にされます。」
カスタム イベント ログ トリガーのスケジュールされたタスクを作成します。手動の XML クエリは次のようになります。
<QueryList>
<Query Id="0" Path="System">
<Select Path="System">*[System[Provider[@Name='Microsoft-Windows-WAS'] and (EventID=5002)]]
and *[EventData[Data[@Name='AppPoolID'] and (Data='YourAppPoolFriendlyName')]]</Select>
</Query>
</QueryList>
スケジュールされたタスク アクションは、appcmd を実行して特定のアプリケーション プールを再起動するスクリプトを実行することです。
appcmd recycle apppool /?
Recycle application pool
APPCMD recycle APPPOOL <identifier> <-parameter1:value1 ...>
Recycles the specified application pool, recycling its the worker processes.
The exact application pool identifier must be provided and must resolve to an
existing application pool.
Supported parameters:
identifier (required)
Application pool name of the application pool to recycle
/apppool.name
Application pool name of the application pool to recycle (same as
identifier)
Examples:
appcmd recycle apppool "MyAppPool"
Recycle the application pool "MyAppPool".
同じサーバーに複数のアプリケーション プールがある場合は、XML フィルターを調整してアプリケーション プール ID を指定する必要がある場合があります。次にイベント XML テキストのサンプルを示します。
- <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
- <System>
<Provider Name="Microsoft-Windows-WAS" Guid="{524B5D04-133C-4A62-8362-64E8EDB9CE40}" EventSourceName="WAS" />
<EventID Qualifiers="49152">5002</EventID>
<Version>0</Version>
<Level>2</Level>
<Task>0</Task>
<Opcode>0</Opcode>
<Keywords>0x80000000000000</Keywords>
<TimeCreated SystemTime="2012-10-01T19:41:43.000000000Z" />
<EventRecordID>408764</EventRecordID>
<Correlation />
<Execution ProcessID="0" ThreadID="0" />
<Channel>System</Channel>
<Computer>WEBSERVERNAME.company.com</Computer>
<Security />
</System>
- <EventData>
<Data Name="AppPoolID">YourAppPoolFriendlyName</Data>
<Binary />
</EventData>
</Event>
イベント ログの高度なフィルタリングに関する情報:
https://blogs.technet.com/b/askds/archive/2011/09/26/advanced-xml-filtering-in-the-windows-event-viewer.aspx
APPCMD を使用してアプリケーション プールをリサイクルします。
http://technet.microsoft.com/en-us/library/cc770764%28v=ws.10%29.aspx
答え2
参考までに、迅速なフェイルオーバー保護が原因で失敗する場合は、慎重に回避するのではなく、それを無効にすることができます。