スティッキーおよび非スティッキーセッション


255

スティッキーセッションと非スティッキーセッションの違いを知りたい。インターネットから読んだ後に私が理解したこと:

スティッキー:単一のセッションオブジェクトのみが存在します。

非スティッキーセッション:各サーバーノードのセッションオブジェクト

回答:


612

Webサイトが1つのWebサーバーのみによって提供される場合、クライアント/サーバーのペアごとに、セッションオブジェクトが作成され、Webサーバーのメモリに残ります。クライアントからのすべてのリクエストは、このWebサーバーに送信され、このセッションオブジェクトを更新します。インタラクションの期間中に一部のデータをセッションオブジェクトに格納する必要がある場合、そのデータはこのセッションオブジェクトに格納され、セッションが存在する限りそこに残ります。

ただし、ロードバランサーの背後にある複数のWebサーバーによってWebサイトが提供されている場合、ロードバランサーは、実際の(物理的な)Webサーバーがそれぞれの要求を送信する先を決定します。たとえば、ロードバランサの背後に3つのWebサーバーA、B、Cがある場合、www.mywebsite.com / index.jspがサーバーAから提供され、www.mywebsite.com / login.jspが提供される可能性があります。サーバーBとwww.mywebsite.com/accoutdetails.phpはサーバーCから提供されます。

ここで、リクエストが(物理的に)3つの異なるサーバーから提供されている場合、各サーバーはセッションオブジェクトを作成します。これらのセッションオブジェクトは3つの独立したボックスにあるため、セッションオブジェクトに何があるかを直接知る方法はありません。他の。これらのサーバーセッション間で同期するために、DBのように、すべてのユーザーに共通のレイヤーにセッションデータの書き込み/読み取りを行う必要がある場合があります。このユースケースのために、dbとの間でデータを読み書きすることは、良い考えではないかもしれません。ここで、sticky-sessionの役割が始まります。

ロードバランサーがスティッキーセッションを使用するように指示されている場合、他のサーバーが存在していても、すべての対話は同じ物理サーバーで行われます。したがって、セッションオブジェクトは、このWebサイトとのやり取り全体を通じて同じになります。

要約すると、スティッキーセッションの場合、すべてのリクエストは同じ物理Webサーバーに送られますが、非スティッキーロードバランサーの場合は、リクエストを処理するWebサーバーを選択できます。

例として、AmazonのElastic Load Balancerとスティッキーセッションについてここで読むことができます:http : //aws.typepad.com/aws/2010/04/new-elastic-load-balancing-feature-sticky-sessions.html


4
@ TJ- 1つのノードが利用できなくなるとどうなりますか?
gstackoverflow 2015年

20
ほとんどの場合、セッションは失われます。以下の場合、AWS ESB インスタンスに障害が発生したり、不健康になると、ロードバランサではなく、既存の負荷分散アルゴリズムに基づいて新しい健康的なインスタンスを選択し、そのインスタンスにリクエストをルーティング停止します。ロードバランサーは、セッションを新しい正常なインスタンスに「スタック」したものとして扱い、障害が発生したインスタンスが戻ってきた場合でも、そのインスタンスへのリクエストのルーティングを続行します。
TJ- 2015年

8
LoadBalancerはどの情報に基づいてHTTPセッションを固定しますか?特にHTTPS接続では、この問題は興味深いものになります。SSL接続を分割してHTTPセッションをフェッチできるように、LBにWebサーバーの秘密鍵をフィードしますか?または、LBは単にクライアントのIPアドレスを利用するのですか?この場合、複数のクライアントが同じIPアドレスを使用するプロキシサーバーについてはどうでしょうか。またはさらに悪いことに、IPアドレスが頻繁に変更されるモバイルクライアントですか?それとももっと良いテクニックがありますか?ありがとう
g000ze

6
はい、あなたは完全に正しいです。このコンテキストで「x-forwarded-for」ヘッダーまたはスティッキーCookieを使用するには、SSL終了を使用する必要があるため、LBで要求を復号化する必要があります。
TJ- 2016

4
@ g000zeインターネットに直接提供されていないアプリケーションを扱う場合、最も外側のプロキシサーバーでのみTLSを有効にするのが一般的だと思います。(ロードバランサーは、おそらく単純化して、要求を複数のサーバーのいずれかに渡す可能性がある特別なタイプのプロキシサーバーと見なすことができます。)ロードバランサーと他のサーバーの間のトラフィックは、ローカルの安全なネットワーク上で発生します。 、そしてそれゆえしばしばそれを暗号化する必要はありません、またはそれを暗号化する必要がある場合は自己署名証明書で十分です(それを信頼するようにプロキシを構成できるため)。
jpmc26 2016

106

私はここでいくつかの詳細で答えを出しました:https//stackoverflow.com/a/11045462/592477

または、そこで読むことができます==>

ロードバランシングを使用する場合、tomcatのインスタンスが複数あり、負荷を分割する必要があることを意味します。

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

8
うーん..これを読んで、私は不思議に思います:4番目のオプション:非スティッキーWITHセッションレプリケーションを持つことは意味がないのでしょうか?または別の言い方をすると、セッションを別のインスタンスに複製した場合にスティッキーセッションを使用する利点は何ですか?つまり、インスタンス間でセッションを複製している場合、リクエストを任意のサーバーに転送することもできますよね?何が欠けていますか?
dingalapadum

@dingalapadum正解です。理論的には、スティッキーセッションなしでセッションを複製できます。ただし、大規模なクラスターの場合は、ネットワークのパフォーマンスが低下します。次に、tomcat(tomcat.apache.org/tomcat-9.0-doc/cluster-howto.html)のこのようなスティッキーセッションでセッションレプリケーションを使用するには、スティッキーセッションと1つのレプリカのみ(ここでは1つのノード)を配置する方法があります。すべてのノードセッションレプリケーションを保持するバックアップマネージャと呼ばれます)。
Nico

その後、スティッキーセッションでは、1つのセッションレプリカのみを使用できます。これは、大規模なクラスターで最適です。
Nico

2
ああ、わかりました。正しく理解できれば、クラスタ全体ですべてのセッションを複製すると、クラスタが内部でフラッディングすることになります-問題がわかります。ああ、そしてあなたの答えを詳しく見てみると、私が見たところ、これが実際にあなたが説明する最初のケースであるということです... 'duh me' ..
dingalapadum

@dingalapadumあなたの質問は大歓迎です。答えを改善することができます
Nico
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.