web-dev-qa-db-ja.com

スティッキーセッションとセッションレプリケーション

Tomcatのセッションレプリケーションでスティッキーセッションを使用する場合を評価しています。私の最初の評価から、セッションレプリケーションを有効にすると、1つのTomcatノードで開始されたセッションが他のすべてのTomcatノードにコピーされるため、セッションを続行するためにスティッキーセッションは必要なく、どのノードでもリクエストを取得できると思いました。

ただし、セッションレプリケーションは通常、スティッキーセッションで使用されるようです。それ以外の場合は、リクエストが他のノードに送信されるたびにセッションIDを変更する必要があります。 ref: http://Tomcat.Apache.org/Tomcat-6.0-doc/cluster-howto.html#Bind_session_after_crash_to_failover_node

スティッキーセッションを有効にする必要がある場合、誰でもセッションレプリケーションの実際の使用方法を説明できますか?そのため、特定のセッションIDを持つ要求が常に同じノードに送信される場合、各ノードのセッションを不必要にコピーすることになります。これは、ノードがクラッシュした場合に有益ですが、それが頻繁に発生することはなく、そのためにのみセッションレプリケーションを使用するのはやり過ぎのようです。

27
Ashish

本当の利点は、あまり考えずにTomcatインスタンスをシャットダウンできることです。これは特に、ノードが実際に頻繁にオン/オフできるクラウドの世界(Amazon AWSスポットインスタンスと考えてください)に当てはまります。これに代わる方法は、ノードのドレインをサポートする適切なロードバランサーを購入することです。しかし、まともなロードバランサーは高価であり、排出には時間がかかります。

私が考えることができるもう1つのシナリオは、アイテムがHttpSessionに保持されているショッピングカート(の貧弱な実装)であり、シャットダウンすると、ユーザーがそれらを再購入する必要があります(これにより、販売が失われる可能性があります)。

しかし、ほとんどの場合、あなたの言うとおりです。スティッキーセッションとセッションレプリケーションの両方を使用するメリットはほとんどありません。

9
mindas

Mindasが前にそれを説明したように:

ロードバランシングを使用すると、Tomcatのインスタンスがいくつかあり、負荷を分割する必要があります。

  • スティッキーセッションなしでセッションレプリケーションを使用している場合: Webアプリを使用しているユーザーが1人だけで、Tomcatインスタンスが3つあるとします。このユーザーはいくつかのリクエストをアプリに送信し、ロードバランサーはこれらのリクエストの一部を最初のTomcatインスタンスに送信し、その他のリクエストを2番目のインスタンスに送信し、その他を3番目のインスタンスに送信します。
  • レプリケーションなしでスティッキーセッションを使用している場合: Webアプリを使用しているユーザーが1人だけで、Tomcatインスタンスが3つあるとします。このユーザーがいくつかのリクエストをアプリに送信すると、ロードバランサーは最初のユーザーリクエストを3つのTomcatインスタンスのいずれかに送信し、セッション中にこのユーザーが送信した他のすべてのリクエストは同じTomcatインスタンスに送信されます。これらのリクエスト中に、このTomcatインスタンス(使用されているTomcatインスタンス)をシャットダウンまたは再起動すると、ロードバランサーは残りのリクエストをまだ実行中の他の1つのTomcatインスタンスに送信しますが、セッションレプリケーションを使用しないため、インスタンスTomcatは残りのリクエストにはユーザーセッションのコピーがないため、このTomcatの場合、ユーザーはセッションを開始します。ユーザーはセッションを失い、Webアプリはまだ実行されていますが、Webアプリから切断されます。
  • スティッキーセッションWITHセッションレプリケーションを使用している場合: Webアプリを使用しているユーザーが1人だけで、Tomcatインスタンスが3つあるとします。このユーザーがいくつかのリクエストをアプリに送信すると、ロードバランサーは最初のユーザーリクエストを3つのTomcatインスタンスのいずれかに送信し、セッション中にこのユーザーが送信した他のすべてのリクエストは同じTomcatインスタンスに送信されます。これらのリクエスト中に、このTomcatインスタンス(使用されているTomcatインスタンス)をシャットダウンまたは再起動すると、ロードバランサーは残りのリクエストをまだ実行中の別の1つのTomcatインスタンスに送信します。セッションレプリケーションを使用すると、残りのリクエストを受信するインスタンスTomcatはユーザーセッションのコピー。ユーザーは自分のセッションを継続します。ユーザーは切断されることなく引き続きWebアプリを閲覧します。Tomcatインスタンスのシャットダウンはユーザーナビゲーションに影響しません。
73
Nico

Mod_jkを使用した「すべて」の基本構成でのJBoss 5.Xの構成の問題を明確にするためです。 workers.propertiesファイルでのスティッキーセッションの設定

 worker.list=loadbalancer

 ... nodes configuration omitted

 worker.loadbalancer.balance_workers=node1,node2
 worker.loadbalancer.sticky_session=True

セッションの複製を妨げません。 JBossでセッションレプリケーションをオフにするには、$ JBOSS_HOME\server\YOUR_NODE_NAME\deploy\cluster\jboss-cache-manager.sar\META-INF\jboss-cache-manager-jboss-beans.xml cacheModeパラメータを設定する必要がありますLOCALに。

通常、スティッキーセッションシナリオでは、セッションを複製するために必要な大量のI/O操作に関連する追加のオーバーヘッドが必要ないため、セッションの複製は必要ありません。

実際、スティッキーセッションを使用する場合、JBossを「すべて」の構成で実行する必要はありません。「デフォルト」または「標準」ベースの構成を使用する場合があります。

実行する必要があるのは、$ JBOSS_HOME/server/YOUR_NODE_NAME/deploy/jbossweb.sar/server.xmlの変更だけです。

<Engine name="jboss.web" defaultHost="localhost" jvmRoute="YOUR_NODE_NAME">
0