2010-12-30 8 views
19

3つのTomcatサーバーと、 'sticky sessions'を使用せずに要求をディスパッチするLoad Balancerがあります。

私はサーバー間でセッションのデータを共有したいと思います。私はそれらをDBに保存することを考えています。私はmemcachedを私のDBの前のレイヤーとして使用して、より速く要求を処理し、don't put my db under heavy loadにしたいと思います。

私は、セッションデータをDBに保存する前にmemcachedを使用するカスタマイズされたTomcat Managerを提供することを考えています。それは、透過的なやり方が見えない瞬間です。もう一度別のアプリサーバーに切り替える場合も同じです)。

これは良い解決策ですか、それとも良い方法がありますか?Tomcatインスタンス間でセッションを共有する(スティッキーセッションを使用しない)

答えて

0

私たちのアプリケーション(Weblogic、それは問題ではありません)と同様のことを行います。ここでは、ブラウザにCookieとして保存された一意のセッションキーがあります。そのキーは、各要求時に関連セッションデータをデータベースから復元するために使用されます。

この原則を使用して、ユーザーは何も気付かずにロードバランサを使用していつでも別のサーバーに切り替えることができます。これに加えて、ユーザーのセッションに関連するものはほとんど保存せず、ブラウザ内の多くの隠しフィールドで作業します(ロードバランサはURL暗号化とフォーム値保護をサポートしているため、安全面にあります...) 。

+0

@ルーカス私たちは同様の設定をしていますが、違いはセッションストアにMemcachedを使用していることです。 – Nishant

+0

一部のアプリケーションでは、「問題ではありません」(つまり、セッションデータは、認証されたユーザーに関する限り、機密データとはみなされない可能性がありますが)原則として「セッション」データを前後に移動します。もちろんHTMLページのフィールドはユーザーから隠されていません)、またはこの目的のために作成されたクッキーは貧弱な方法です。アプリのクライアント側でこのデータが必要な場合を除いて、ブラウザに公開しないでください。 –

+1

@DanFarrell:隠されたフィールドは機密データではなく、フォーム値の保護によってそれが調整されませんでした。だから私はそれが賢明でない賢明な方法であるとは思わない。 –

6

アプリケーションサーバー(あなたの場合はTomcat)の外にセッション状態を保存することは、大規模なWebサイトでは非常に一般的で推奨される構成です。これは通常、Shared Nothingというアーキテクチャスタイルを追求して行われます。

db、memcached、商用レプリケートキャッシュなど、さまざまな場所に状態を保存することができます。これらはすべてトレードオフのさまざまな組み合わせで動作します。個人的に、私はmemcachedで大きな成功を収めてきました。 Memcachedは非常に高速で安定しています。

一般に、N memcacheサーバーをN> 1、たとえば2とすると便利です。ユーザーがログインすると、アプリケーションサーバーはコインをひっくり返してユーザーの状態を示すサーバーストアを決定します。ブラウザに送信されるクッキーには、どのmemcacheサーバーからどのサーバーにルーティングするかを知る情報が含まれています。ブラウザからの後続の要求は、各要求時に適切なmemcacheサーバから状態を取得します。 memcacheサーバーが失敗した場合、ユーザーは新しいサーバーを再選択するために再度ログインする必要がありますが、それは非常にまれです。

16

データベース内のセッションを持続すると、スケーラビリティが制限されます。スケーラビリティがそれほど重要でない場合、これは有効なアプローチです(db + memcached)。

スティッキーセッションを使用しているときは、同時リクエストが必要です。 (並行して/同時に実行される)Ajaxリクエストは、(別のものではないために)別のTumcatsによって提供されるため、同時にセッションにアクセスします。セッションを変更する可能性のある同時要求がある限り、何らかの種類の同期/セッションロックを実装する必要があります。

おそらくこれはあなたにとって興味深いものです:私はmemcached-session-managerを作成し、最適なパフォーマンスと無制限のスケーラビリティの両方を目指しています。 memcached互換のバックエンド(memcachedb、membaseなど、memcachedなど)でも動作します。 もともとスティッキーセッションのアプローチのために作成されましたが、すでにbranch for nonsticky-sessionsが存在し、どのように動作しているかを示すsample appがあります。 今すぐthread on the mailing list on further improvements for nonsticky-sessionsがあります(同時リクエストの処理とシングルポイント障害の防止)。

+2

私はちょうど私がちょうどmemcached-session-managerをnon-stickyセッションサポート(そしてtomcat7のサポート)でリリースしているというメモをここにドロップしたいと思います。スティッキーではないセッションに関するいくつかの詳細が発表されました:http://groups.google.com/group/memcached-session-manager/t/612891b0ae10649d – MartinGrotzke

+0

ajaxリクエストについての非常に良い点。同じフロー内で、サーバーへの複数の要求がある可能性があります。 – vsingh