Windows Server AppFabric (Host Services) の入門

(2010/07/09 : RTM 版にあわせて記述を変更)

環境 :
Visual Studio 2010 (.NET Framework 4)
Windows Server AppFabric

Windows Server AppFabric 入門

こんにちは。

Tech Days 2010 の T2-304 セッションにご参加頂いた皆様、ありがとうございました。さいごに、「ブログで記載します」となってしまった Windows Server AppFabric の箇所について、以下に記載します。(今年もまた、この座間ですみません。。。)

 

Windows Server AppFabric とは ? (超概要)

奥主のセッションを聞かれた方はご存じと思いますが、Windows Server AppFabric は大きく 2 つの機能で構成されています。

1 つが、今回、私のセッションで紹介する予定であったホスティングサービス (Hosting Services, または Windows Application Server Extensions。以前、Dublin というコードネーム呼ばれていたもの) で、ワークフローサービスを含む WCF と WF サービスの管理をおこないます。これまでの .NET 3.5 では、監視や永続化をおこなう場合、管理用の設定を .config を編集して記述し、管理画面がほしい場合には開発者自身がプログラミングする必要がありましたが、このサービスによって、一般的に必要となるモニタリング (トラッキング、監視、追跡) と永続化の設定などはすべて専用の画面からおこなうことができます。
ここでは、このホスティングサービス (Hosting Services) について説明します。

もう 1 つが、主に奥主のセッションで紹介のあったキャッシュサービス (Cache Services、または分散キャッシュ (Distributed Caching)。以前、Velocity というコードネームで呼ばれていたもの) です。

 

ホスティングサービス (Windows Application Server Extensions) のインストール

ここでは、Windows Server AppFabric のホスティングサービスのインストールと設定方法について記載します。 

<< データベースの準備 >>

Windows Server AppFabric をインストールする前に、まず、データベース (SQL Server 2008) を用意して、以下の作業を実施してください。(ここでは、SQL Server 2008 Express Edition を使用しました。)
なお、キャッシュサービスのデータベースはここでは使用しないので、ホスティングサービス用のデータベースのみを用意しています。

  1. データベースの作成 :
    データベースは、任意の名前で準備して頂いて OK です。なお、ここでは、「ApplicationServerExtensions」という名称のデータベースを作成し、ここに、監視と永続化のすべての情報を入れることにします。
  2. ログイン / ユーザーの作成と権限付与 : (注 : ここですが、RTM 版では、後述するインストール時の構成で、自動的にグループへのユーザー設定と SQL Server への権限設定をおこなってくれるようなので、以下は必要ないかもしれません。。。)
    AppFabric が接続できるように、SQL Server に、以下のログインの作成と、上記のデータベース (ApplicationServerExtensions) へ (これらのログインの) ユーザー追加、さらにユーザーへの一般的な権限を付与します。ここでは、 権限として、ログイン権限、db_datareader ロール、db_datawriter ロール、execute 権限を付与 (grant) します。 

    NT AUTHORITYSYSTEM
    NT AUTHORITYLOCAL SERVICE
    NT AUTHORITYNETWORK SERVICE
    IIS APPPOOLDefaultAppPool

なお、IIS APPPOOLDefaultAppPool は、コマンドを使用してログインとユーザーを追加してください (UI からはできない模様です)。
上記の内容をすべてコマンドで記載すると、以下の通りになります。

— データベースの作成 (実際には、いろいろとオプションを設定してください . . .)
create database ApplicationServerExtensions
go

— ログインの作成
create login [NT AUTHORITYSYSTEM] from windows with default_database=[master]
create login [NT AUTHORITYLOCAL SERVICE] from windows with default_database=[master]
create login [NT AUTHORITYNETWORK SERVICE] from windows with default_database=[master]
create login [IIS APPPOOLDefaultAppPool] from windows with default_database=[master]
go

use [ApplicationServerExtensions]
go

— ユーザーの作成
create user [NT AUTHORITYSYSTEM] for login [NT AUTHORITYSYSTEM]
create user [NT AUTHORITYLOCAL SERVICE] for login [NT AUTHORITYLOCAL SERVICE]
create user [NT AUTHORITYNETWORK SERVICE] for login [NT AUTHORITYNETWORK SERVICE]
create user [IIS APPPOOLDefaultAppPool] for login [IIS APPPOOLDefaultAppPool]
go

— executor ロールの作成
create role db_executor
grant execute to db_executor
go

— 必要な権限/ロールの付与
exec sp_grantlogin ‘NT AUTHORITYSYSTEM’
exec sp_grantlogin ‘NT AUTHORITYLOCAL SERVICE’
exec sp_grantlogin ‘NT AUTHORITYNETWORK SERVICE’
exec sp_grantlogin ‘IIS APPPOOLDefaultAppPool’
go

exec sp_addrolemember ‘db_datareader’,  ‘NT AUTHORITYSYSTEM’
exec sp_addrolemember ‘db_datareader’,  ‘NT AUTHORITYLOCAL SERVICE’
exec sp_addrolemember ‘db_datareader’,  ‘NT AUTHORITYNETWORK SERVICE’
exec sp_addrolemember ‘db_datareader’,  ‘IIS APPPOOLDefaultAppPool’
go

exec sp_addrolemember ‘db_datawriter’,  ‘NT AUTHORITYSYSTEM’
exec sp_addrolemember ‘db_datawriter’,  ‘NT AUTHORITYLOCAL SERVICE’
exec sp_addrolemember ‘db_datawriter’,  ‘NT AUTHORITYNETWORK SERVICE’
exec sp_addrolemember ‘db_datawriter’,  ‘IIS APPPOOLDefaultAppPool’
go

exec sp_addrolemember ‘db_executor’,  ‘NT AUTHORITYSYSTEM’
exec sp_addrolemember ‘db_executor’,  ‘NT AUTHORITYLOCAL SERVICE’
exec sp_addrolemember ‘db_executor’,  ‘NT AUTHORITYNETWORK SERVICE’
exec sp_addrolemember ‘db_executor’,  ‘IIS APPPOOLDefaultAppPool’
go

 

Windows Server AppFabric のインストール

Windows Server AppFabric のダウンロード をおこなってインストールをおこないます。  

モジュールの配置 (インストール) が終わると構成が開始されます。今回は分散キャッシュはインストールしないので、このウィザードで、下記の通り、ホスティングサービス (Hosting Services) のみを選択します。

 

インストールの下図のウィザードで、データベースの設定をおこないます。下図で、[構成] ボタンを押して、上記で作成した「ApplicationServerExtensions」のデータベースを選択することで、サービスの作成とアカウント設定、さらにデータベースへのスキーマ・オブジェクト (テーブルなど) の作成と権限設定をおこなってくれます。(なお、私の環境では、ドメインコントローラー (Domain Controller) に入れてしまったため、サービスアカウントとして、下図の Local Service ではなく、ドメインのユーザーを設定しました。。。)

ウィザードに従って、インストールを続ければ終了です ! (なお、上記の設定は、あとから変更することもできます。)

(前述の通り、下記は、RTM では、インストール時に構成されるため不要です)

<< データベースの初期化 >>

ここまでだと、実は、必要なサービスや構成などがインストールされた状態で、まだ上記の ApplicationServerExtensions データベースには、必要なデータベースやストアドプロシージャなどは何も作成されません。(試しに、IIS 管理マネージャでダッシュボードを表示しても、「Error(s) encountered 」と表示されます。)

そこで、必要なスキーマをインストールするため、IIS 管理マネージャ (inetmgr) を起動し、マシン名をクリックして、右のペインから [Monitoring Database Configuration] をクリックします。表示される画面で、[DefaultMonitoringConfigurationString] の右クリックをおこない、[Initialize Database …] を選択します (下図)。
従来までの WCF / WF では、データベースやストアドプロシージャをインストール用の SQL ファイルを実行して手動でインストールしましたが、このように、AppFabric では IIS 管理マネージャから設定できます。

同様に、IIS 管理マネージャで右のペインから [Persistence Database Configuration] をクリックして[DefaultMonitoringConfigurationString] の右クリックをおこない、[Initialize Database …] を選択します。

これで、必要なテーブルやストアドプロシージャなどがインストールされます。

<< その他の設定 >>

(下記は、RTM 版で修正されました . . .)

もう 1 つ、ベータ版 (Beta 1) ならではの作業があるので注意してください。
上記のインストールによって、[Application Server Event Collector] という Windows サービスがインストールされますが、この起動方法を [自動 (遅延開始)] にしておいてください。
再起動をおこなうと、本来ならばこのサービスが起動するはずですが、ベータ版ではこのように設定しないと正しく起動しないためです。(このため、この設定をおこなわないと、マシンの再起動以降はイベントが収集されません。)

 

構成 (.config) を理解する

いきなり使いはじめても良いですが、中で何がおこなわれているか理解しておけないと気持ち悪いと思いますので、内部でどのような構成がおこなわれるか簡単に理解しておきましょう。 

まず、以前このブログで記載した「Workflow Extensions と永続化、トラッキング」を軽く読んでみてください。ここに記載した内容で、今回関係するポイントを以下に再度まとめておきます。

  • WCF のトラッキング (モニタリング、追跡)、ワークフローサービスの永続化は、すべて構成 (.config) を使って設定できます。 
  • モニタリング (トラッキング) をおこなうには、TrackingParticipant が使用されます。モニタリング (トラッキング) 情報をファイルで管理するなど、独自な TrackingParticipant を設定できますが、AppFabric のトラッキングでは、.NET Framework 4 に標準で入っている EtwTrackingParticipant が使用されます。(※1)
  • TrackingParticipant に対して、トラッキングの対象を何にするか、どのようなトラッキング情報を収集するか (例 : ステータス情報を収集する、など)、といった内容は TrackingProfile を使って設定します。
  • 実行中のワークフローの永続化をおこなうには、InstanceStore を指定します。例えば、ファイルへの永続化をおこなうような独自の InstanceStore を指定できますが、AppFabric では、SQL Server 用の InstanceStore である SqlWorkflowInstanceStore が使用されます。(※2)
    なお、この SqlWorkflowInstanceStore ですが、今回から、単なる状態保持だけではなく、負荷分散のシナリオなどにも対応できるように、細かな制御がおこなわれています。

※1 :  ETW は Windows が持っているイベント管理のためのフレームワークで、アプリケーション自体に負荷をかけないように、 共通的にイベント収集と管理をおこなうことができます。

※2 : なお、この SqlWorkflowInstanceStore ですが、今回から、単なる状態保持だけではなく、負荷分散 (ロードバランス) のシナリオなどにも対応できるようになっています。(こちら にも記載していますが、以前の WF の永続化では、そもそもロードバランスを想定した仕組みではなく、パフォーマンス・オーバーヘッドや、別マシン間で使用する場合などにいろいろと細かな課題がありました。)

つまり、こうした設定を web.config に記載することによって、上記でインストールされたホスティングサービスを使った監視 (Tracking) や永続化 (Persistence) をおこなうことができます。 

ここで一点注意していただきたいのは、上記のインストール作業によって、既に、ルートの web.config (%systemroot%Microsoft.NETFramework<バージョン番号>Configweb.config) に、必要な設定がおこなわれている という点です。
インストール後にこのファイルの中を見て頂くとわかりますが、既定では、ここに監視の基本的な設定がおこなわれているため、すべてのサービスについて、既定では「正常性の監視」がおこなわれ、トラッキング (監視) 情報がデータベースに保存されます。

 

ホスティングサービスのサービス

昨日のスライド (T2-304 セッションのスライド) に記載していたのですが、ホスティングサービス (または、Windows Application Server Extensions) の監視と永続化では、それぞれ、以下の 2 つの Windows サービスが使用されています。

  • AppFabric イベント コレクション サービス (AppFabric Event Collection Service)
  • AppFabric ワークフロー管理サービス (AppFabric Workflow Management Service)

  

前者は、ETW のイベントをデータベースに収集するサービスで、後者は、永続化されたインスタンスに対するタイマー実行、期限切れロック (残ってしまったインスタンス) の監視と解除、蓄積されたコマンド (インスタンスの中断、再開等) の実行などをおこなうワークフロー管理のためのサービスです。(※3)

※ 3 : 昨日のセッションで、WCF の「標準エンドポイント」 (Standard Endpoint) の話をしましたが、そのときのスライドで、 1 つだけ WorkflowControlEndpoint というものが入っていたのをおぼえていますか ? ワークフロー管理サービスは、このエンドポイントを使って、外部からワークフローの制御 (コントロール) をおこなっています。

上記でも記載しましたが、これらのサービスが動いていないと AppFabric における収集や管理などの処理がおこなえないので、念のため、ちゃんと動作していることを確認しておいてください。

また、このサービスで使用されているユーザーが、以下のグループに属しているか確認しておいてください。
特に、私の環境のように、ドメインコントローラー (Domain Controller) にインストールした場合、グループ名は、<マシン名>AS_Administrators ではなく、<ドメイン名>AS_Administrators、<ドメイン名>AS_Observers となるため、インストール時に既定の NT AUTHORITYLocal Service がこれらのグループに所属しておらず、正しくイベントが収集されないというケースが発生したりします。その場合は、ちゃんとユーザーをグループに追加するか、[すべてのプログラム] – [Windows Server AppFabric] – [構成] で再度構成しなおす (例えば、サービスのユーザーを変更する) などして、サービスユーザーが下記のグループに属するように設定してください。

「AppFabric イベント コレクション サービス」のユーザーが属するグループ

  • AS_Administrators
  • AS_Observers

「AppFabric ワークフロー管理サービス」のユーザーが属するグループ

  • AS_Administrators
  • AS_Observers
  • BUILTINIIS_IUSRS

 

アプリケーションの構成

では、上記を踏まえ、簡単に動作を確認してみましょう。 

WCF サービスや、ワークフローサービスなどを適当に構築して、IIS にアプリケーションとして追加します。(ディレクトリをまるごとアプリケーションに追加しても良いですが、.NET Framework 4 からは、.zip ファイルにパッケージ化して、このパッケージをインポートするといった展開方法なども可能です。)

下図の通り、追加したアプリケーションを右クリックして、[WCF サービスと WF サービスの管理] – [構成 …] を選択します。

以降、ウィザードが表示されて、モニタリングや永続化の設定をおこなうことができます。
もうここまで読んだ方には説明の必要はないと思いますが、ここで設定した内容は、要はそのアプリケーションの web.config に構成が追加されるだけです。(ただし、設定内容によっては、別の場所に記述されるものもあります。)
また、上述したように、既定では、監視が有効になっていますので (上述の通り、ルートの web.config で設定されています)、不要ならこれらの設定を無効にしてください。

例えば、下図の通り、モニタリングのレベルを [エンドツーエンド監視] (End-to-End Monitoring) というより細かなトレースレベルに変更してみましょう。

また、ワークフローサービスで永続化をおこなうには、上図で [ワークフローの永続化] タブを選択して、ドロップダウンから、既定の永続化用のデータベース接続文字列を選択するのみです。(今回の場合、上述のインストール手順に記載した通り、「ApplicationServerExtensions」という名前のデータベースに永続化された情報が入ります。)

設定が終わったら、このアプリケーションの web.config を見て、どのような設定変更がおこなわれたか確認してみると良いでしょう。

 

アプリケーションの状態と監視イベントの確認

では、クライアントからサービスに接続をおこない、収集されたイベントデータなどを確認してみましょう。

IIS 管理マネージャでアプリケーションを選択し、右のペインから [AppFabric ダッシュボード] をクリックします。

すると、下記の通り、モニタリングの結果のサマリー情報が表示されます。

例えば、昨日説明した Correlation を持ったワークフローサービスを登録して、(呼び出しを最後までおこなわずに) 最初の呼び出しだけをおこなうと、WF のインスタンスが作成されて完了していないため、上図で [WF のインスタンスの履歴] の [アクティブ化] がカウントアップされますが、[完了] はカウントアップされません。(すべての操作を終了した場合に、[完了] が 1 つ増えることになります。)

また、上図の [アクティブ化]、[完了] などのリンクをクリックすると、イベントの具体的な情報 (データ) を確認できます。また、(上図にはありませんが) 右端の [追跡対象のイベント] のリンクをクリックすると、収集されたイベントデータをすべて確認できます。さらに、表示されたイベントを特定の検索条件で絞り込む (Query) こともできます。

今回の場合、上記の通り、エンド・ツー・エンド監視の設定をおこなったので、かなり細かなイベントが収集されると思いますが、監視 (モニタリング) のレベル (Level) を変えると、使用される監視プロファイル (TrackingProfile) が異なっているだけであり、このカスタマイズ方法などについて、また別途の機会にでもご説明しましょう。(実際の本番環境では、エラーのみをトラックしたり、パフォーマンスを重視して一時的にトラッキングを停止するなどの設定をおこなうことになるでしょう。)

今回は、監視 (モニタリング) を主体に説明しましたが、WF の永続化インスタンスの管理では、Idle 中のインスタンスをキャンセルするなど、ちょっとした管理もこの画面から実施できます。

 

コマンド (PowerShell) による管理と自動化

奥主のセッションを聞かれた方はその中で説明があったと思いますが、 AppFabric は、PowerShell によるコマンドラインペースの管理機能をベースに UI が構築されています。このため、画面だけではなく、コマンドを使って簡易機能を作りこむこともできます。(例えば、ホスティングサービスのログの定期的な確認や、管理を自動化したい場合など)

例えば、インスタンスが実行途中 (アイドル) の状態で、Get-ASAppServiceInstance コマンドを実行すると、以下の通り、そのインスタンスや状態などの情報が取得できます。(なお、AppFabric ダッシュボード (AppFabric Dashboard) と同じような監視イベント (Tracked Event) を取得する場合には、Invoke-Sqlcmd でデータベースに対して直接クエリをかける必要があります。ちょっと、そこだけは面倒ですね。。。)

import-module applicationserver
Get-ASAppServiceInstance -root  | format-table InstanceId, Status, VirtualPath

InstanceId                                                               Status VirtualPath
———-                                                               —— ———–
60302de4-91ed-417b-b585-a64625e68534                                    Running /DemoWorkflow/Service1.xamlx

 

また、よく使うコマンドとして、上記のように、いろいろと実験した後で、Persistence DB や Monitoring DB のデータを削除 (初期化) したくなると思いますが、そうした場合にも、PowerShell を使って以下の通りコマンドを実行すれば、すべてクリアされます。

import-module applicationserver

$ConfirmPreference = “None”

# Persintence DB の初期化
Remove-ASPersistenceSqlDatabase -Force -Server “.sqlexpress” -Database “ApplicationServerExtensions”

Initialize-ASPersistenceSqlDatabase -Admins $env:computernameAS_Administrators -Readers $env:computernameAS_Observers -Users “BUILTINIIS_IUSRS” -Database “ApplicationServerExtensions” -Server “.sqlexpress”

# Monitoring DB の初期化
Clear-ASMonitoringSqlDatabase -Database “ApplicationServerExtensions” -Server “.sqlexpress”

この他にも、新たに監視 (Set-ASAppMonitoring) を追加するなど、さまざまな設定作業の自動化をコマンドラインシェルでおこなうことができます。

 

まとめ

これまで、WCF / WF を使った監視 (モニタリング)、永続化などでは、必要な構成 (.config) を手で編集して、管理用の画面なども自前で用意する必要がありました。(特に、ETW を使用した場合には、こちら に記載しているように、トレース用のリスナーなどもすべて自作する必要がありました。) 無論、新しい WCF でもベースの技術は変わっていないため、今まで通り、自前の機能で管理などをおこなうことはできますし、そのほうが “技術者名利に尽きる” と思われるかもしれません。しかし、.NET Framework 4 の WCF / WF からは、基本的な管理機能は、上記のホスティングサービスに含まれていますので、これからは、必要な機能だけを作りこめばよく、基本的な管理は上記の機能をそのまま使用することができます。

ここでは、Dublin の管理 UI、スクリプトなどを説明しましたが、この他にも、障害発生時のタイマー呼び出しやワークフロー サービスのリカバリーなど、Dublin には “現実のサービス提供” で必要な魅力的な機能がいくつも含まれています。これらのメカニズムについては、Tech Ed 2010 Japan で解説します。

 

関連ナンバー

 

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s