―BEA WebLogic Server編―

   WebLogic Serverのセッション管理(応用編)

  2. クラスタリングの実現(session replication)

 WebLogic Serverでは、セッションを外部の媒体へ永続化し複数のサーバでこれを共有することで高可用性(High Availability)を実現する仕組みを提供しています。セッションの永続化(session persistence)にはRDBかファイルのいずれかを使用することができます。この RDB やファイルを複数サーバで共有することで、セッションのフェイル・オーバーを行うことができます(http://www.beasys.co.jp/weblogic/docs/admindocs/http.html#persistence)。

 ここまではどのアプリケーション・サーバでも提供している機能ですが、WebLogic Serverではさらにセッションのin-memory replicationを提供しています。in-memory replicationとはほかのサーバのメモリ内にセッションのレプリカを作成してセッションのフェイル・オーバーを実現する機能です。

 in-memory replicationを使用するには下記の構成をとる必要があります。

 複数(2〜3が一般的)のインスタンスを立ち上げ、クラスタを構成します。クラスタ・メンバーのweblogic.propertiesに下記の設定を追加することでクラスタを構成することができます(起動スクリプトでjavaコマンドに-Dweblogic.cluster.enable=true ... として与えた方が何かと便利です)。なお、クラスタ・メンバーはすべて同じポート番号 (weblogic.system.listenPort および SSLListenPort)を使用しなければなりません(*2)

weblogic.cluster.enable=true
weblogic.cluster.name=...
weblogic.cluster.multicastAddress=...

 各クラスタ・メンバーのweblogic.propertiesに以下の設定を追加します(*3)

weblogic.httpd.clustering.enable=true
weblogic.httpd.session.persistence=true
weblogic.httpd.session.persistentStoreType=replicated

 クラスタの前にプロキシを立て、WebLogic plug-in を適用します。プロキシとしては下記のWebサーバを使用することができます(*4)

  • Apache (plug-in)
  • iPlanet (plug-in)
  • IIS (plug-in)
  • WebLogic Server (HttpClusterServlet)

 上記のいずれのplug-inや組み込みServletを使用しても等価な機能を利用できますが、サーバがライセンス・フリーでマルチ・プラットフォーム対応であるApacheを使用することをお勧めしています。

 in-memory replication では、おおよそ次のような仕組みで高可用性を実現しています。

(1) セッションを開始したクラスタ・メンバー(以下サーバ)のメモリ内にセッション・オブジェクトが生成されます。このサーバを“プライマリ”と呼びます。

(2)
ほかのいずれか1台のサーバのメモリ上に (1) のセッション・オブジェクトのレプリカが作成・維持されます。このサーバを“バックアップ”と呼びます。

(3)
(1)のセッションに関するリクエストは、“プライマリ”がUPしている間はproxyのplug-inによって常に"プライマリ"に転送されます。

(4)
万一“プライマリ”がダウンした場合、リクエストはplug-in によって自動的に“バックアップ”に転送されます。“バックアップ”では、セッション・オブジェクトのレプリカを使用して処理を継続することができます。

(5)
この時点で、"バックアップ"がそのセッションの新たな“プライマリ”になり、生き残っているサーバがあればほかのいずれか1台が新たな“バックアップ”になります。

 上記の“プライマリ”や“バックアップ”はセッションごとに異なるサーバに割り当てられるという点に注意してください。あるセッションの“プライマリ”になっているサーバが別のセッションの“バックアップ”になっている可能性もあるということです。

 さて、セッションのin-memory replicationを使用すると、次のようにsession idの後ろにクラスタリングのための情報が付加されます。

OmaIxZ228eN3gmewQSFaRUhnmQQRfmq27fWi6Q8qhdyI1hyDgU5G|
74249178206928292 98/-926997315/6/7001/7001/7002/7002/7001/-1|1472327805053927978/-926997316/6/7001/7001/7002/7002/7001/-1|7424917820692829299
(編注:上記の文字列は連続しています)

 この場合 session id は次のような構成になっています。

session-id|プライマリ・サーバ情報|バックアップ・サーバ情報|セッション・オブジェクトのOID

 in-memory replication では、plug-inがsession idの後ろのプライマリ/バックアップ情報を参照してリクエストの転送を行う仕組みになっています。

 また、URL rewriting ではこのようにプライマリ/バックアップ情報が付加された session id をエンコードしなくてはなりません。したがって、in-memory replicationを使用するとencodeURL ()の結果が極端に長くなります。クラスタ情報だけで約140bytes(*5)、session id自身が最短で10bytes、元のURLとsession id 名まで含めると180bytesくらいになります。これにリクエスト・パラメータを加えると携帯コンテンツでのin-memory replicationの適用に不安を感じられることでしょう。以下、i-mode、EZweb、J-Sky向けのコンテンツにin-memory replication を適用した際の経験をお伝えしておきます。

●i-mode
 公式にはURL長200bytesまでとなっていますので、URL自身をコンパクトにするよう心がければ問題ありません。formでは method="post"が使えます。

●EZweb
 EZweb(HDML)にはpostの概念がありません。しかし、実システムでは、元のURLとリクエスト・パラメータを含めて最長で300bytesくらいになりましたが、リクエスト情報が欠落するといった問題は発生しませんでした。ただし、ページサイズの制限が厳しいEZwebでは、エンコードされたURLの大きさがページ・デザインに与える影響は決して少なくありません。

●J-Sky
 J-Sky(MML、CHTML)もpost が使えません。リクエストのURL長に関しては、EZweb と同じく300bytesくらいになりましたが問題はありませんでした。ただし、formで使用するhidden fieldの有効長が 数十bytesと極端に短い機種が存在します (詳細は J-Sky のサポートにお問い合わせください)。これらの機種についてはサポートをあきらめるか、脚注(*1)に記したようにWebLogic Server 6.0で対応していただくしかありません。

 携帯向けコンテンツ全般に言えることですが、端末機種によって思わぬところで機能自体やサそのポートの範囲に差があるのは頭の痛いところです。テスト段階で全機種試すことは不可能ですから、機種限定の障害は運用開始後に明らかになります。各キャリアには、機種別の制限事項について情報の公開を望みたいところです。

セッションのタイムアウト

BEA WebLogic Server編「WebLogic Serverのセッション管理(応用編)」
  1. URL rewritingによるセッション管理
2. クラスタリングの実現(session replication)
  3. セッションのタイムアウト

本稿に関するご質問やご意見は下記のメールアドレスまでお願いします。

info@atmarkit.co.jp

 今後の予定
WebLogic Serverのセッション管理(基礎編)
WebLogic Serverのセッション管理(応用編)
Web Applicationのデプロイメント

Web Application TIPS

Web Applicationのセキュリティ

JSPカスタム・タグ
EJB 2.0 のデプロイメント
WebLogic Server固有のEJB設定項目 (1)
WebLogic Server固有のEJB設定項目 (2)

Javaプログラミング・ワンポイントレクチャー INDEX



脚注:WebLogic Server 6.0での変更点

(*1) 前回、Cookieの場合session id名が “JSESSIONID” になったと説明しましたが、URL rewriting の場合 session id はリクエスト・パラメータとしてではなく、servlet 2.2 仕様に準拠した、';'をセパレータに“jsessionid”という名前でエンコードされるようになりました。

/order/Submit.jsp;jsessionid=OqXn3Ab9!-3044480099678014536!-926997315!7001!7002!-2679308213499512072!-926997316!7001!7002

 このため、formでmethod="get"を使用する場合もsession idをhidden fieldで渡す必要がなくなりました。つまり、以下のように素直に encodeURL()を使用すればよいわけです。

<form action="<%= response.encodeURL (request.getContextPath () + "/order/Submit.jsp") %>" method="get">
    ...
</form>

(*2) クラスタの設定は、管理サーバ(Administration Server)上で一括して管理されるようになりました。

(*3)
このようなセッション関係の設定はすべてweblogic.xml(WebLogic Server固有のWeb Applicationデプロイメント・ディスクリプタ)で行うよう変更されています(http://www.beasys.co.jp/e-docs/wls60e/programming/weblogic_xml.html)。

(*4)
Webサーバの代わりに、スティッキング機能を備えたスイッチやロード・バランサーなどのハードウェアを前に立ててクラスタリングさせることもできるようになりました (in-cluster routing)。

(*5)
(*1)のエンコードされたURLの例はクラスタリングした場合のものですが、5.1に比べコンパクト(クラスタ情報だけで約85bytes)になったのがお分かりいただけると思います。




Java Agile フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Java Agile 記事ランキング

本日 月間