サーブレットとJSPのクラスタリング
サーブレットとJSPのクラスタリング
WebLogic Serverでは、HTTPサーバとプラグインを利用してロードバランシングを実現します。そしてWebLogic Serverのレプリケーション機能を利用することにより、フェールオーバが実現されます。まず、WebLogic ServerがサポートしているHTTPサーバとプラグインの組み合わせを確認します。
| HTTPサーバ | プラグイン |
|---|---|
| Netscape Enterprise Server | Netscapeプラグイン |
| Apache | Apache Serverプラグイン |
| Microsoft Internet Information Server | Microsoft-IISプラグイン |
これらのプラグインは、HTTPクライアントのリクエストをWebLogic Serverインスタンスに転送します。転送されたWebLogic Serverインスタンスとクライアントの間にはセッションが確立され、クライアントのブラウザにはプライマリとセカンダリのWebLogic Serverインスタンスの位置がCookieに保存されます。
プライマリで障害が発生するとクライアントのセッション情報を利用して、プラグインがセカンダリのWebLogic Serverにリダイレクトします。そして、正常な処理結果をクライアントに返します。
クライアントはサーバの障害の影響を受けることなく処理を継続できます。クラスタ内のWebLogic Serverインスタンスが3台以上存在する場合には、今後のフェールオーバに備えて、更新されたプライマリとセカンダリの情報がCookieに保存され ます。
クラスタ内の管理対象サーバが2台の場合は障害の発生したサーバが復旧しない限り、レプリケーションされません。障害の発生したサーバが復旧すると、セカンダリとしてクラスタに参加します。
Cookieが使えない場合
Cookieが無効(HttpServletRequest.isRequestedSessionIdFromCookie()メソッドで確認できる)になっていたり、Wireless Access Protocolに対応したアプリケーションでCookieが使えなかったりする場合には、プライマリとセカンダリの位置がURLに挿入される「URL書き換え」が利用できます。
この方式では、セッションIDがWebページのハイパーリンクにエンコードされ、WebLogic ServerはURLに埋め込まれているIDを利用して、HttpSessionオブジェクトを特定します。この仕組みを利用するためには、"weblogic.xml"の「
この機能が有効になっていて、HttpServletResponse.encodeURL()メソッドを使用していると、URLが書き換えられてセッションIDが追加されます。リダイレクトする場合にも、HttpServletResponse.encodeRedirectUrl()メソッドを 使用しているとセッションIDがURLに追加されます。以下に例を示します。
"Sample"
加えてURLの長さが制限されている場合には、"weblogic.xml"の「
URLRewritingEnabled
true
WAPEnabled
true
WAPEnabledを設定するとセッションIDのサイズが52文字までに制限され、WAPデバイスでは処理できない特殊文字が使用禁止となりま す。このオプションを有効にすると、WebアプリケーションがWebLogic Serverのクラスタ機能を使用できなくなることに注意してください。
HttpSessionのレプリケーション
WebLogic Serverでは、HttpSessionオブジェクトの永続化方式が複数用意されています。"weblogic.xml"の「
クラスタ構成にする場合は、「インメモリレプリケーション」を永続化方式として選択します。WebLogic Serverのレプリケーションは、プライマリとセカンダリのサーバ間で行われるprimary-secondary方式です(「第2回:Tomcatのクラスタ設定」参照)。レプリケーション時の動作を以下に解説します。

図1:レプリケーション時の動作
- HttpSessionオブジェクトが生成され、プライマリの管理対象サーバを確定します
- HttpSessionオブジェクトがプライマリからセカンダリにレプリケーションされます
- HttpSessionオブジェクトに対して、setAttribute()メソッドやremoveAttribute()メソッドが呼び出されると、service()メソッドが終了した時点で、プライマリからセカンダリにレプリケーションが行われます
- プライマリの処理中に障害が発生して停止すると、セカンダリが処理を継続して、クライアントに正常に処理をした結果を返します(クラスタリングしていなければ、クライアントにはHTTPエラーが返ります)
- このときセカンダリとサーバは、すべてのHttpSessionオブジェクトのプライマリとなります
- 先ほどの障害が発生したサーバは復旧すると、既存のHttpSessionオブジェクトのセカンダリとなり、新規にリクエストを受け付けた場合には、そのリクエストのプライマリとなります
