この章では、高可用性セッション持続性の有効化と設定を行う方法について説明します。
Application Server は、HTTP セッションデータおよびステートフルセッション Bean (SFSB) セッションデータのフェイルオーバーを通して、高可用性セッション持続性を提供します。フェイルオーバーとは、サーバーインスタンスまたはハードウェアに障害が発生しても、別のサーバーインスタンスが分散セッションを引き継ぐことを意味します。
分散セッションは、次の条件が満たされた場合に、複数の Sun Java System Application Server インスタンスで動作できます。
各サーバーインスタンスが、同じ高可用性データベース (HADB) にアクセスできること。このデータベースを使用可能にする方法については、configure-ha-cluster(1)を参照してください。
各サーバーインスタンスに、同じ分散可能 Web アプリケーションが配備されていること。web.xml 配備記述子ファイルの web-app 要素に、distributable 要素が含まれている必要があります。
Web アプリケーションが、高可用性セッション持続性を使用していること。分散可能でない Web アプリケーションが、高可用性セッション持続性を使用するように設定されていると、サーバーはログファイルにエラーを書き込みます。
Web アプリケーションは、--availabilityenabled オプションが true に設定された deploy または deploydir コマンドを使用して配備されている必要があります。これらのコマンドの詳細については、deploy(1) および deploydir(1) を参照してください。
セッションが処理を継続すると、ファイルを開くための参照やネットワーク接続はすべて失われます。アプリケーションは、この制限を念頭においてコード化する必要があります。
フェイルオーバーをサポートする分散セッションには、特定のオブジェクトしかバインドできません。サーブレット 2.4 仕様とは異なり、Sun Java System Application Server は、フェイルオーバーがサポートされていないオブジェクト型が分散セッションにバインドされると IllegalArgumentException をスローしません。
フェイルオーバーをサポートする分散セッションには、次のオブジェクトをバインドできます。
すべての EJB コンポーネントに対するローカルホームおよびオブジェクト参照。
共存エンティティ Bean、ステートフルセッション Bean、および分散エンティティ Bean のリモートホーム参照、リモート参照
分散セッション Bean のリモートホームおよびリモート参照
InitialContext および java:comp/env に対する JNDI コンテキスト。
UserTransaction オブジェクト。ただし、失敗したインスタンスが再起動されない場合は、準備されたグローバルトランザクションはすべて失われ、正しくロールバックまたはコミットされない可能性もあります。
直列化可能な Java 型
フェイルオーバーをサポートする分散セッションには、次のオブジェクト型をバインドできません。
JDBC データソース
Java Message Service (JMS) の ConnectionFactory および Destination オブジェクト
JavaMail™ セッション
接続ファクトリ
管理対象オブジェクト
Web サービス参照
一般に、これらのオブジェクトに対して、フェイルオーバーは機能しません。ただし、オブジェクトが直列化可能な場合など、フェイルオーバーが機能する場合もあります。
次のディレクトリには、セッション持続性を示すサンプルアプリケーションが含まれています。
install_dir/samples/ee-samples/highavailability install_dir/samples/ee-samples/failover
次のサンプルアプリケーションでは、SFSB セッション持続性がデモンストレーションされます。
install_dir/samples/ee-samples/failover/apps/sfsbfailover
この節では、高可用性セッション持続性を設定する方法について、次のトピックとともに説明します。
高可用性セッション持続性は、動的配備、動的再読み込み、および自動配備とは互換性がありません。これらの機能は、本稼働環境ではなく開発環境を対象としているため、HA セッション持続性を有効にする前に無効にする必要があります。これらの機能を無効にする方法については、『Sun Java System Application Server Enterprise Edition 8.1 2005Q2 管理ガイド』の第 2 章「アプリケーションの配備」を参照してください。
Application Server クラスタを作成します。
詳細については、「クラスタを作成するには」を参照してください。
クラスタの HADB データベースを作成します。
詳細については、configure-ha-cluster(1) を参照してください。
クラスタの HTTP 負荷分散を設定します。
詳細については、「HTTP 負荷分散の設定」を参照してください。
目的のアプリケーションサーバーインスタンス、および Web または EJB コンテナの可用性を有効にします。
次に、セッション持続性の設定を行います。次の方法のうち 1 つを選択します。
管理コンソールを使用します。「サーバーインスタンスの可用性の有効化」を参照してください。
asadmin コマンド行ユーティリティーを使用します。set(1) および configure-ha-persistence(1) を参照してください。
クラスタ内の各サーバーインスタンスを再起動します。
インスタンスが現在要求を処理中の場合、インスタンスをいったん停止してから再起動して、インスタンスが要求を処理する時間が十分に取れるようにします。詳細については、「サーバーインスタンスまたはクラスタの無効化 (停止)」を参照してください。
可用性を必要とする特定の SFSB の可用性を有効にします。
セッション状態にチェックポイントを設定する必要のあるメソッドを選択します。「個々の Bean の可用性の設定」を参照してください。
配備中に、個々のアプリケーション、Web モジュール、または EJB モジュールの可用性を有効にします。
「個々のアプリケーションまたは EJB モジュールの可用性の設定」を参照してください。
管理コンソールで、可用性を有効にするチェックボックスをチェックするか、または --availabilityenabled オプションを true にして asadmin deploy コマンドを使用します。
セッション可用性は、次の 5 つの異なるスコープ (高いレベルから低いレベルへの順) で有効にすることができます。
デフォルトで有効になっているサーバーインスタンス手順については、次の節の 「サーバーインスタンスの可用性の有効化」を参照してください。
デフォルトで有効になっているコンテナ (Web または EJB)コンテナレベルでの可用性の有効化については、次の節を参照してください。
デフォルトで無効になっているアプリケーション
デフォルトで無効になっているスタンドアロンの Web または EJB モジュール
デフォルトで無効になっている個々の SFSB
可用性を指定されたスコープで有効にするには、それより上のすべてのレベルでも有効にする必要があります。たとえば、アプリケーションレベルで可用性を有効にするには、サーバーインスタンスレベルおよびコンテナレベルでも有効にする必要があります。
ある特定のレベルの可用性は、デフォルトでは 1 つ上のレベルに設定されます。たとえば、可用性がコンテナレベルで有効になっている場合、デフォルトではアプリケーションレベルで有効になります。
可用性がサーバーインスタンスレベルで無効になっている場合、ほかのすべてのレベルで有効にしても反映されません。可用性がサーバーインスタンスレベルで有効になっている場合、明示的に無効化しないかぎり、すべてのレベルで有効になります。
サーバーインスタンスの可用性を有効にするには、asadmin set コマンドを使用して、設定の availability-service.availability-enabled プロパティーを true に設定します。
たとえば、設定の名前が config1 の場合は、次のように指定します。
asadmin set --user admin --passwordfile password.txt --host localhost --port 4849 config1.availability-service.availability-enabled="true" |
ツリーコンポーネントで、「設定」ノードを展開します。
編集する設定のノードを展開します。
「可用性サービス」ノードを選択します。
「可用性サービス」ページで、「可用性サービス」ボックスにチェックマークを付けて、インスタンスレベルの可用性を有効にします。
無効にするには、このボックスのチェックマークを外します。
さらに、セッションの持続性のために HADB への接続に使用する JDBC リソースを変更した場合は、格納プール名を変更できます。詳細については、configure-ha-cluster(1) を参照してください。
「保存」ボタンをクリックします。
サーバーインスタンスを停止し、再起動します。
J2EE アプリケーションは一般に、大量のセッション状態データを保持しています。Web ショッピングカートは、セッション状態の古典的な例です。アプリケーションはまた、頻繁に必要になるデータをセッションオブジェクトにキャッシュすることもできます。実際、ユーザーとの対話が多いほぼすべてのアプリケーションには、セッション状態の保持が必要になります。
asadmin を使用して Web コンテナの可用性の有効化と設定を行うには、configure-ha-persistence(1) を参照してください。
あるいは、asadmin set コマンドを使用して、設定の availability-service.web-container-availability.availability-enabled プロパティーを true に設定し、次に configure-ha-persistence を使用して必要に応じてプロパティーを設定します。
たとえば、set コマンドを使用して次のように指定します。ここで、config1 は設定の名前です。
asadmin set --user admin --passwordfile password.txt --host localhost --port 4849 config1.availability-service.web-container-availability.availability-enabled="true" asadmin configure-ha-persistence --user admin --passwordfile secret.txt --type ha --frequency web-method --scope modified-session --store jdbc/hastore --property maxSessions=1000:reapIntervalSeconds=60 cluster1 |
ツリーコンポーネントで、目的の設定を選択します。
「可用性サービス」をクリックします。
「Web コンテナの可用性」タブを選択します。
「可用性サービス」ボックスにチェックマークを付けて、可用性を有効にします。無効にするには、このボックスのチェックマークを外します。
「可用性の設定」の説明に従って、ほかの設定を変更します。
サーバーインスタンスを再起動します。
「可用性サービス」の「Web コンテナの可用性」タブを使用すると、次の可用性設定を変更できます。
持続性のタイプ: 可用性が有効になっている SFSB のセッション持続性と不活性化メカニズムを指定します。使用できる値は、memory (持続性なし) file (ファイルシステム)、および ha (HADB) です。
ha セッション持続性を使用するには、HADB を設定し、有効にしておく必要があります。設定の詳細については、configure-ha-cluster(1) を参照してください。
Web コンテナの可用性が有効になっている場合、デフォルトは ha です。それ以外の場合、デフォルトは memory です。セッションの持続性が必要となる本稼動環境では、ha を使用します。最初の 2 つのタイプ (memory および file 持続性) では、高可用性セッション持続性は提供されません。
持続性の頻度: セッション状態を格納する頻度を指定します。持続性のタイプが ha の場合にのみ適用できます。使用できる値は次のとおりです。
web-method - セッション状態は、各 Web 要求の終了時に、クライアントに応答を返信する前に格納されます。このモードでは、障害発生時にセッション状態を完全に更新するための最良の保証が得られます。デフォルトです。
time-based - セッション状態が、reapIntervalSeconds ストアプロパティーによって設定された頻度でバックグラウンドに格納されます。このモードでは、セッション状態が完全に更新される保証はありません。ただし、各要求後に状態が格納されないので、パフォーマンスが大幅に向上します。
持続性のスコープ: 格納するセッションオブジェクトの範囲と、セッション状態を格納する頻度を指定します。持続性のタイプが ha の場合にのみ適用できます。使用できる値は次のとおりです。
session - 常にすべてのセッション状態が格納されます。このモードでは、セッションデータを分散可能な Web アプリケーションに正しく格納するための最良の保証が得られます。デフォルトです。
modified-session - セッション状態が変更された場合、すべてのセッション状態が格納されます。HttpSession.setAttribute() または HttpSession.removeAttribute() が呼び出された場合に、セッションが変更されたと見なします。属性が変更されるたびに、必ず setAttribute() を呼び出す必要があります。これは J2EE 仕様の要件ではありませんが、このモードを正しく動作させるために必要になります。
modified-attribute - 変更されたセッション属性だけが格納されます。このモードを正しく動作させるには、次のガイドラインに従う必要があります。
セッション状態が変更されるたびに、setAttribute() を呼び出します。
属性間で相互参照しないようにします。別個の各属性キーにあるオブジェクトグラフを直列化し、別々に格納します。別個の各キーにあるオブジェクト間に相互参照がある場合は、正常な直列化および非直列化は行われません。
複数の属性間、または少なくとも読み取り専用属性と変更可能な属性間でセッション状態を分散します。
シングルサインオン状態: シングルサインオン状態の持続性を有効にするには、このボックスにチェックマークを付けます。無効にするには、このボックスのチェックマークを外します。詳細については、「セッションフェイルオーバーでのシングルサインオンの使用」を参照してください。
HTTP セッションストア: セッションの持続性のために HADB への接続に使用する JDBC リソースを変更した場合は、HTTP セッションストアを変更できます。詳細については、configure-ha-cluster(1) を参照してください。
個々の Web アプリケーションの可用性の有効化と設定を行うには、アプリケーション配備記述子ファイル sun-web.xml を編集します。アプリケーションの配備記述子の設定は、Web コンテナの可用性の設定より優先されます。
session-manager 要素の persistence-type 属性によって、アプリケーションが使用するセッション持続性のタイプが決定されます。高可用性セッション持続性を有効にするには、この属性を ha に設定する必要があります。
sun-web.xml ファイルの詳細については、『Sun Java System Application Server Enterprise Edition 8.1 2005Q2 Developer’s Guide』の「The sun-web.xml File」を参照してください。
<sun-web-app> ... <session-config> <session-manager persistence-type=ha> <manager-properties> <property name=persistenceFrequency value=web-method /> </manager-properties> <store-properties> <property name=persistenceScope value=session /> </store-properties> </session-manager> ... </session-config> ...
単一のアプリケーションサーバーインスタンスにおいて、ユーザーがあるアプリケーションによって一度認証されると、同じインスタンス上で動作しているほかのアプリケーションに対する個別の再認証は必要ありません。これをシングルサインオンといいます。詳細については、『Sun Java System Application Server Enterprise Edition 8.1 2005Q2 Developer’s Guide』の「User Authentication for Single Sign-on」を参照してください。
HTTP セッションがクラスタ内のほかのインスタンスにフェイルオーバーした場合でも、シングルサインオンが機能し続けるようにするには、シングルサインオン情報が HADB に対して持続される必要があります。シングルサインオン情報を持続させるには、最初にサーバーインスタンスと Web コンテナの可用性を有効にし、次にシングルサインオン状態のフェイルオーバーを有効にします。
シングルサインオン状態のフェイルオーバーは、「可用性サービス」の「Web コンテナの可用性」タブにある管理コンソールを使用して有効にできます。「Web コンテナの可用性の設定」で説明しているように、asadmin set コマンドを使用して、設定の availability-service.web-container-availability.sso-failover-enabled プロパティーを true に設定します。
たとえば、set コマンドを使用して次のように指定します。ここで、config1 は設定の名前です。
asadmin set --user admin --passwordfile password.txt --host localhost --port 4849 config1.availability-service.web-container-availability. sso-failover-enabled="true"
単一の名前とパスワードの組み合わせによってアクセス可能なアプリケーションは、シングルサインオングループを構成します。シングルサインオングループに属するアプリケーションに対応する HTTP セッションでは、1 つのセッションがタイムアウトになった場合、ほかのセッションは無効化されず、引き続き有効となります。これは、1 つのセッションがタイムアウトしてもほかのセッションの可用性には影響しないからです。
この動作の当然の結果として、あるセッションがタイムアウトして、セッションを実行していた同じブラウザウィンドウから対応するアプリケーションにアクセスを試みる場合、再度認証を行う必要はありません。ただし、新しいセッションが作成されます。
シングルサインオングループに属するショッピングカートアプリケーションの例を挙げます。このグループにはほかに 2 つのアプリケーションが含まれます。ほかの 2 つのアプリケーションのセッションタイムアウト値は、ショッピングカートアプリケーションのセッションタイムアウト値を上回るものと仮定します。ショッピングカートアプリケーションのセッションがタイムアウトして、セッションを実行していた同じブラウザウィンドウからショッピングカートアプリケーションの実行を試みる場合、再度認証を行う必要はありません。ただし、以前のショッピングカートは失われていて、新しいショッピングカートを作成する必要があります。ほかの 2 つのアプリケーションは、ショッピングカートアプリケーションを実行していたセッションのタイムアウト後も変わらず動作し続けます。
同様に、ほかの 2 つのアプリケーションのどちらかに対応するセッションがタイムアウトしたとします。セッションを実行していた同じブラウザウィンドウからアプリケーションに接続している間は、再度認証を行う必要はありません。
この動作は、セッションがタイムアウトした場合にのみ当てはまります。シングルサインオンが有効になっていて、HttpSession.invalidate() を使用してセッションの 1 つを無効にする場合、シングルサインオングループに属するすべてのアプリケーションのセッションが無効になります。シングルサインオングループに属する任意のアプリケーションへのアクセスを試みる場合、再認証が必要であり、アプリケーションにアクセスするクライアントに対して新しいセッションが作成されます。
ステートフルセッション Bean (SFSB) には、クライアント固有の状態が含まれています。クライアントとステートフルセッション Bean の間には、一対一の関係が存在します。作成時、EJB コンテナは各 SFSB に、クライアントにバインドするための一意のセッション ID を割り当てます。
サーバーインスタンスの障害に備えて、SFSB の状態を持続的なストアに保存することができます。SFSB の状態は、そのライフサイクル内のあらかじめ定義された時点に、持続性ストアに保存されます。これを、チェックポイント設定と呼びます。有効になっている場合、チェックポイント設定は一般に、トランザクションがロールバックする場合でも、Bean がトランザクションを完了したあとに実行されます。
ただし、SFSB が Bean 管理によるトランザクションに参加している場合、そのトランザクションは Bean メソッドの実行の途中でコミットされる可能性があります。このメソッド呼び出しの結果、Bean の状態は遷移している途中である可能性があるため、これは Bean の状態にチェックポイントを設定するのに適切なタイミングではありません。この場合、EJB コンテナは、対応するメソッドの終了時に Bean の状態にチェックポイントを設定します。ただし、メソッドの終了時に、その Bean が別のトランザクションの範囲に入っていないことが前提です。Bean 管理によるトランザクションが複数のメソッドにまたがっている場合は、後続のメソッドの終了時にアクティブなトランザクションが存在しなくなるまで、チェックポイント設定が遅延されます。
SFSB の状態は必ずしもトランザクションではなく、非トランザクションビジネスメソッドの結果として大幅に変更される可能性もあります。SFSB がこれに当てはまる場合は、「チェックポイントを設定するメソッドの指定」で説明しているように、チェックポイントを設定するメソッドのリストを指定することができます。
分散可能な Web アプリケーションが SFSB を参照しており、その Web アプリケーションのセッションが処理を継続する場合は、EJB 参照の処理も継続されます。
Application Server インスタンスの停止中に、セッション持続性を使用している SFSB の配備が取り消されると、持続性ストア内のセッションデータがクリアされない可能性があります。これを回避するには、Application Server インスタンスが動作している間、SFSB の配備を取り消します。
「EJB コンテナの可用性」タブを選択します。
「可用性サービス」ボックスにチェックマークを付けます。
可用性を無効にするには、このボックスのチェックマークを外します。
「可用性の設定」の説明に従って、ほかの設定を変更します。
「保存」ボタンをクリックします。
サーバーインスタンスを再起動します。
EJB コンテナの可用性を有効にするには、asadmin set コマンドを使用して、設定に次の 3 つのプロパティーを設定します。
availability-service.ejb-container-availability. availability-enabled
availability-service.ejb-container-availability. sfsb-persistence-type
availability-service.ejb-container-availability. sfsb-ha-persistence-type
たとえば、設定の名前が config1 の場合は、次のコマンドを使用します。
asadmin set --user admin --passwordfile password.txt --host localhost --port 4849config1.availability-service.ejb-container-availability.availability-enabled="true"
asadmin set --user admin --passwordfile password.txt --host localhost --port 4849config1.availability-service.ejb-container-availability.sfsb-persistence-type="file"
asadmin set --user admin --passwordfile password.txt --host localhost --port 4849config1.availability-service.ejb-container-availability.sfsb-ha-persistence-type="ha"
「可用性サービス」の「EJB コンテナの可用性」タブを使用すると、次の設定を変更できます。
HA 持続性のタイプ: 可用性が有効になっている SFSB のセッション持続性と不活性化メカニズムを指定します。使用できる値は、file (ファイルシステム) と ha (HADB) です。セッションの持続性が必要となる本稼動環境では、デフォルトの ha を使用します。
SFSB 持続性のタイプ: 可用性が有効になっていない SFSB の不活性化メカニズムを指定します。使用できる値は、file (デフォルト) と ha です。
いずれかの持続性のタイプを file に設定すると、EJB コンテナによって非活性化されたセッション Bean が格納されるファイルシステムの場所が指定されます。ファイルシステムに対するチェックポイントはテストには有効ですが、本稼働環境には役立ちません。詳細については、『Sun Java System Application Server Enterprise Edition 8.1 2005Q2 管理ガイド』の「ストアプロパティーを設定する」を参照してください。
HA 持続性によって、どのサーバーインスタンスが失敗した場合でも、サーバーインスタンスのクラスタは SFSB 状態を復元できます。HADB はまた、不活性化とアクティベーションのストアとしても使用されます。SFSB 状態の持続性を必要とする本稼働環境では、このオプションを使用します。詳細については、configure-ha-cluster(1) を参照してください。
SFSB ストアプール名: セッションの持続性のために HADB への接続に使用する JDBC リソースを変更した場合は、SFSB ストアプール名を変更できます。詳細については、configure-ha-cluster(1) を参照してください。
可用性が無効になっている場合、ローカルファイルシステムは SFSB 状態の不活性化に使用されますが、持続性には使用されません。SFSB 状態が格納される場所を変更するには、EJB コンテナのセッション格納位置の設定を変更します。詳細については、『Sun Java System Application Server Enterprise Edition 8.1 2005Q2 管理ガイド』の「ストアプロパティーを設定する」を参照してください。
配備中に、個々のアプリケーションまたは EJB モジュールの SFSB の可用性を有効にすることができます。
管理コンソールを使用して配備している場合は、可用性を有効にするチェックボックスをチェックします。
asadmin deploy または asadmin deploydir コマンドを使用して配備している場合は、--availabilityenabled オプションを true に設定します。詳細については、deploy(1) および deploydir(1) を参照してください。
個々の SFSB について可用性を有効にし、チェックポイントを設定するメソッドを選択するには、sun-ejb-jar.xml 配備記述子ファイルを使用します。
高可用性セッション持続性を有効にするには、ejb 要素に availability-enabled="true" を設定します。SFSB キャッシュのサイズと動作を制御するには、次の要素を使用します。
max-cache-size : キャッシュに保持されるセッション Bean の最大数を指定します。キャッシュがオーバーフローする (Bean の数が max-cache-size を超える) 場合、コンテナは一部の Bean を非活性化するか、または Bean の直列化された状態をファイルに書き出します。ファイルを作成するディレクトリは、設定 API を使用して EJB コンテナから取得されます。
resize-quantity
cache-idle-timeout-in-seconds
removal-timeout-in-seconds
victim-selection-policy
sun-ejb-jar.xml の詳細については、『Sun Java System Application Server Enterprise Edition 8.1 2005Q2 Developer’s Guide』の「The sun-ejb-jar.xml File」を参照してください。
<sun-ejb-jar> ... <enterprise-beans> ... <ejb availability-enabled="true"> <ejb-name>MySFSB</ejb-name> </ejb> ... </enterprise-beans> </sun-ejb-jar>
有効になっている場合、チェックポイント設定は一般に、トランザクションがロールバックする場合でも、Bean がトランザクションを完了したあとに実行されます。Bean の状態に重要な変更をもたらす非トランザクションビジネスメソッドの終了時に、SFSB のオプションのチェックポイント設定を追加で指定するには、sun-ejb-jar.xml 配備記述子ファイルの ejb 要素にある checkpoint-at-end-of-method 要素を使用します。
checkpoint-at-end-of-method 要素内の非トランザクションメソッドは、次のいずれかになります。
SFSB のホームインタフェースで定義された create() メソッド。作成の直後に、SFSB の初期状態にチェックポイントを設定する場合に使用します。
コンテナ管理によるトランザクションのみを使用している SFSB の場合は、トランザクション属性 TX_NOT_SUPPORTED または TX_NEVER でマークされた Bean のリモートインタフェースのメソッド。
Bean 管理によるトランザクションのみを使用している SFSB の場合は、Bean 管理によるトランザクションが起動もコミットもされないメソッド。
このリストに記述されているその他のメソッドはすべて無視されます。これらの各メソッドの呼び出しの終了時に、EJB コンテナは SFSB の状態を持続性ストアに保存します。
SFSB がどのトランザクションにも参加しておらず、checkpoint-at-end-of-method 要素で明示的に指定されているメソッドがない場合は、この Bean に対して availability-enabled="true" が設定されていても、この Bean の状態にチェックポイントは設定されません。
パフォーマンスを向上させるには、メソッドの小さなサブセットを指定します。これらのメソッドは一般に、大量の処理を実行するか、または Bean の状態に重要な変更をもたらします。
<sun-ejb-jar> ... <enterprise-beans> ... <ejb availability-enabled="true"> <ejb-name>ShoppingCartEJB</ejb-name> <checkpoint-at-end-of-method> <method> <method-name>addToCart</method-name> </method> </checkpoint-at-end-of-method> </ejb> ... </enterprise-beans> </sun-ejb-jar>