2009-05-13 15 views
17

ロードバランスされたTomcat Webサーバーがあります。すべてのリクエストは別のTomcatサーバーによって提供される可能性があります。ロードバランスWebアプリケーション

j2ee(struts)ベースのWebアプリケーション用のコードを記述する際に、どうすればこのことができますか?

答えて

30

まず、セッションアフィニティ/スティッキセッション用のロードバランサを設定して、JSESSIONIDに基づいて(同じであれば)同じTomcatにすべてのリクエストを転送し続けるようにします。あなたのすべてのセッション属性がjava.io.Serializable

  • はあなたのweb.xmlが<distributable/>要素を持っているか、あなたの<Context distributable="true" />に設定を確認してください実装する必要があります

    • :首尾よくそれはセッションが複製されています持っているアプリケーションのための2つの重要な要件

      The Tomcat clustering doc状態

    Serializableを実装していないSessionにオブジェクトを入れることを開始した場合プロパティ/フィールドにSerializableが実装されていない場合)、問題が発生します。あなたが均衡しているとき、スティッキーセッションを使用する理由についてコメントでの質問のいくつかに対処するには:

    (実際にはこれらの点すべてにかかわらず、使用しているサーブレットコンテナの適用、私は信じています。)

    更新複数のサーバー間で負荷をかけている場合は、例を挙げてこれを説明するのが最も簡単だと思います。

    まず、アプリケーションが何らかの種類のデータをセッション中に保持している場合、これは本当に重要です。これは、すべての単一アプリケーションではない可能性があります。あなたがセッション中のデータを保持しない場合、おそらくこれについて気にすることはなく、ここで読むことを止めることができます。

    セッション中にデータを保持するが、ではなく、のセッションがあると、頭痛の世界が広がります。 が特定のセッション属性の一部の値を更新し、second.jspがこの同じセッション属性を読み取るとします。セッションデータをクラスタ内のすべてのサーバに複製するようにTomcatを設定することはできますが、この複製は即座には行われません。 first.jspの最初のリクエストがで処理され、完了後1ナノ秒が経過した場合、同じ訪問者がsecond.jspにリクエストします。これは、スティッキなしの環境ではserver2が処理されます。レプリケーションは瞬間的なものではないので、最新のセッションデータを読み込んでいるかどうかを知る方法はありますか?クラスタ間で読み込みを同期させるために何らかのロジックを追加する必要がありますか?これは巨大な痛みになります。

    セッションアフィニティ/スティッキセッションを設定すると、この頭痛がなくなります。同じクライアント・サーバーからのすべての要求を同じノードで処理することにより、「このノードは要求を処理するまでに最新の状態になっていますか?」という心配はありません。ノードに障害が発生すると、クライアントはセッションデータのコピーを持つクラスタ内の別のノードにフェールオーバーすることができますが、スティッキーセッションではまれなケースになります。

    スティッキセッションを必要とする別の理由があります。クラスタ内のノード間のロードです。セッション内のリクエストがどのノードでも処理できる場合は、クラスタにall-to-allレプリケーションが設定されていることを意味します(つまり、node1のセッションデータがnode2、node3、...、nodeにレプリケートされます)。 N、node2のセッションデータはnode1、node3、... none Nなどに複製されます)。クラスタへの各追加は、クラスタ内の他のすべての単一ノードと通信する必要がある別のノードを意味するため、クラスタが大規模になると、オール・ツオール・セッション・レプリケーションは帯域幅とリソースを集中させる可能性があります。

    これは、ノードのデータがクラスタ内の少数の「バディ」に複製されているため、ノードに障害が発生した場合でも、データは1つのノードごとにコピーされる必要はありません。このシナリオでは、ノード1にノード2とノード3に複製されたデータがノード1に、ノード3とノード4にデータが複製されてチェーンが形成されるようにクラスタを構成します。このシナリオでは、クラスタにノードを追加しても、ノード間の通信量は、オールツーオール方式と同様に急激に増加することはありません。

  • +0

    最初のステートメントでは、最初のリクエストを処理するTomcatが選択されたときに、そのブラウザからの次のリクエストを処理するために同じTomcatを使用する必要があることを意味しますか?この場合、同じTomcatサーバーがすべての要求を処理する場合、負荷分散はどのように役立ちますか? – user32262

    +0

    私はロードバランシングの主な考え方は、複数のサーバーを使用して複数のクライアントにサービスを提供していると思います。同じクライアントからの要求がすべて複数のサーバーに配信されることを意味するものではありません。ちょっと考えました。 –

    +0

    この場合、Strutsの違いはありません。提供されたアドバイスに固執する、マット。 +1 –

    関連する問題