第8章 Web アプリケーションのクラスター化

8.1. セッションレプリケーション

8.1.1. HTTP セッションレプリケーションについて

セッションレプリケーションにより、分散可能なアプリケーションのクライアントセッションがクラスター内のノードのフェイルオーバーなどで中断されないようにします。クラスター内の各ノードは実行中のセッションの情報を共有するため、もともと関連していたノードが消えた場合も作業を引き継ぐことができます。
セッションレプリケーションは、mod_cluster、mod_jk、mod_proxy、ISAPI、NSAPI クラスターにより高可用性を確保する仕組みのことです。

8.1.2. Web セッションキャッシュについて

Web セッションキャッシュは、standalone-ha.xml プロファイルを含むいずれかの HA プロファイル、管理対象ドメインプロファイル ha または full-ha を使用するときに設定できます。最も一般的に設定される要素は、キャッシュモードと分散キャッシュのキャッシュオーナーの数です。
キャッシュモード

キャッシュモードは、REPL (デフォルト値) または DIST のいずれかになります。

REPL
REPL モードでは、クラスターの他のノードそれぞれにキャッシュ全体がレプリケートされます。これは、最も安全なオプションですが、オーバーヘッドが増加します。
DIST
DIST モードは、以前の実装で提供されたバディモードに似ています。このモードでは、owners パラメーターで指定された数のノードにキャッシュを分散することによりオーバーヘッドが削減されます。オーナーのこの数のデフォルト値は 2 です。
オーナー

owners パラメーターは、セッションのレプリケートされたコピーを保持するクラスターノード数を制御します。デフォルト値は、2 です。

8.1.3. Web セッションキャッシュの設定

Web セッションキャッシュのデフォルト値は REPL です。DIST モードを使用する場合は、管理 CLI で次の 2 つのコマンドを実行します。異なるプロファイルを使用する場合は、コマンドでプロファイル名を変更します。スタンドアロンサーバーを使用する場合は、コマンドの /profile=ha 部分を削除します。

手順8.1 Web セッションキャッシュの設定

  1. デフォルトキャッシュモードを DIST に変更します。

    /profile=ha/subsystem=infinispan/cache-container=web/:write-attribute(name=default-cache,value=dist)
    
  2. 分散キャッシュのオーナー数を設定します。

    以下のコマンドでは、5 オーナーが設定されます。デフォルト値は 2 です。
    /profile=ha/subsystem=infinispan/cache-container=web/distributed-cache=dist/:write-attribute(name=owners,value=5)
    
  3. デフォルトキャッシュモードを REPL に戻します。

    /profile=ha/subsystem=infinispan/cache-container=web/:write-attribute(name=default-cache,value=repl)
    
  4. サーバーの再起動

    Web キャッシュモードの変更後は、サーバーを再起動する必要があります。
結果

サーバーでセッションレプリケーションが設定されます。独自のアプリケーションでセッションレプリケーションを使用するには、「アプリケーションにおけるセッションレプリケーションの有効化」を参照してください。

8.1.4. アプリケーションにおけるセッションレプリケーションの有効化

概要

JBoss Enterprise Application Platform の高可用性 (HA) 機能を利用するには、アプリケーションが配布可能になるよう設定する必要があります。ここでは配布可能にする手順を説明した後、使用可能な高度な設定オプションの一部について解説します。

手順8.2 アプリケーションを配布可能にする

  1. 要件: アプリケーションが配布可能であることを示します。

    アプリケーションが配布可能とマークされていないとセッションが配布されません。アプリケーションの web.xml 記述子ファイルの <web-app> タグ内に <distributable /> 要素を追加します。例は次の通りです。

    例8.1 配布可能なアプリケーションの最低限の設定

    <?xml version="1.0"?>
    <web-app  xmlns="http://java.sun.com/xml/ns/j2ee"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
              xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
                                  http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" 
              version="2.4">
              
          <distributable/>
        
    </web-app>
    				
    
    
  2. 希望する場合はデフォルトのレプリケーション動作を変更します。

    セッションレプリケーションに影響する値を変更したい場合は、<jboss-web> 要素の子要素である <replication-config> 要素内で値を上書きします。デフォルトを上書きしたい場合のみ指定の要素が含まれるようにします。以下の例に、全デフォルト設定の一覧と、最も一般的に変更されるオプションを説明する表を示します。

    例8.2 デフォルトの <replication-config>

    <!DOCTYPE jboss-web PUBLIC
        "-//JBoss//DTD Web Application 5.0//EN"
        "http://www.jboss.org/j2ee/dtd/jboss-web_5_0.dtd">
    
    <jboss-web>
       
       <replication-config>
          <cache-name>custom-session-cache</cache-name>
          <replication-trigger>SET</replication-trigger>
          <replication-granularity>ATTRIBUTE</replication-granularity>
          <use-jk>false</use-jk>
          <max-unreplicated-interval>30</max-unreplicated-interval>
          <snapshot-mode>INSTANT</snapshot-mode>
          <snapshot-interval>1000</snapshot-interval>
          <session-notification-policy>com.example.CustomSessionNotificationPolicy</session-notification-policy>
      </replication-config>
    
    </jboss-web>
    				
    
    

表8.1 セッションレプリケーションの一般的なオプション

オプション
説明
<replication-trigger>
クラスター全体でセッションデータのレプリケーションが引き起こされるのはどのような状態であるか制御します。セッション属性として保存された可変オブジェクトがセッションからアクセスされた後、メソッド setAttribute() が直接呼び出されない限り、オブジェクトが変更されレプリケーションが必要であるかをコンテナは明確に認識できないため、このオプションは必須となります。

<replication-trigger> の有効な値

SET_AND_GET
最も安全で、最もパフォーマンスが悪いオプションになります。コンテンツへのアクセスのみが行われ、変更されなくても常にセッションデーターがレプリケートされます。この設定はレガシー機能に対応する目的でのみ保持されています。同じ動作のパフォーマンスを向上させるには、この設定を使用する代わりに、<max_unreplicated_interval> を 0 に設定します。
SET_AND_NON_PRIMITIVE_GET
デフォルト値です。非プリミティブ型のオブジェクトがアクセスされた時のみセッションデータがレプリケートされます。オブジェクトは IntegerLongString などの良く知られた Java データ型ではありません。
SET
このオプションは、データのレプリケーションが必要な時にセッション上でアプリケーションが setAttribute を明示的に呼び出すことを前提としています。これにより、不必要なレプリケーションの発生を防ぎ、全体的なパフォーマンスも改善されますが、本質的に安全ではありません。
設定に関係なく、setAttribute() を呼び出すと常にセッションレプリケーションが引き起こされます。
<replication-granularity>
レプリケートされるデータの細かさを決定します。デフォルトは SESSION ですが、ATTRIBUTE を設定すると、ほとんどの属性は変更されずにセッションのパフォーマンスを向上することができます。
以下は変更する必要がほとんどないオプションになります。

表8.2 セッションレプリケーションの変更が稀なオプション

オプション
説明
<useJK>
mod_clustermod_jkmod_proxy などのロードバランサーの使用を前提とするか指定します。デフォルトは false です。 true に設定すると、各要求に関連付けられているセッション ID がコンテナによって確認され、フェイルオーバーが発生するとセッション ID の jvmRoute の部分が置き換えられます。
<max-unreplicated-interval>
セッションのタイムスタンプのレプリケーションがトリガーされるまで、セッション後に待機する最大間隔 (秒単位) になります。変更がないと判断された場合でも適用されます。これにより、各セッションのタイムスタンプがクラスターノードによって認識されるようにし、フェイルオーバー中にレプリケートされなかったセッションが誤って期限切れにならないようにします。また、フェイルオーバー中に HttpSession.getLastAccessedTime() への呼び出しに正しい値を使用できるようにします。
デフォルトでは値は指定されません。値が指定されないと、コンテナの jvmRoute 設定が JK フェイルオーバーが使用されているかを判断します。 0 を設定すると、セッションがアクセスされるたびにタイムスタンプがレプリケートされます。-1 を設定すると、要求中の他のアクティビティがレプリケーションをトリガーした場合のみタイムスタンプがレプリケートされます。 HttpSession.getMaxInactiveInterval() よりも大きい正の値を設定すると設定ミスとして扱われ、0 に変換されます。
<snapshot-mode>
セッションが他のノードへレプリケートされるタイミングを指定します。デフォルトは INSTANT で、INTERVAL を使用することも可能です。
INSTANT モードでは要求処理スレッドが使用され、変更は要求の最後にレプリケートされます。<snapshot-interval> オプションは無視されます。
INTERVAL モードでは、バックグラウンドタスクは <snapshot-interval> によって指定される間隔で実行され、変更されたセッションがレプリケートされます。
<snapshot-interval>
INTERVAL<snapshot-mode> の値として使用された時に、変更されたセッションがレプリケートされる間隔 (ミリ秒単位) になります。
<session-notification-policy>
インターフェース ClusteredSessionNotificationPolicy の実装の完全修飾クラス名です。登録された HttpSessionListenerHttpSessionAttributeListenerHttpSessionBindingListener へサーブレット仕様の通知が送信されたかどうかを管理します。

このページには機械翻訳が使用されている場合があります (詳細はこちら)。