StackOverflow / ServerFaultにはいくつのWebサーバーがありますか?
回答が「複数」の場合、DNSポーリング中にセッションスティッキネスが達成されますか?
StackOverflow / ServerFaultにはいくつのWebサーバーがありますか?
回答が「複数」の場合、DNSポーリング中にセッションスティッキネスが達成されますか?
回答:
大規模なWebサイトは、複数のマシン間で「負荷分散」される場合があります。多くの負荷分散セットアップでは、セッション中にユーザーがバックエンドマシンのいずれかにヒットする場合があります。このため、多くのマシンがユーザーセッションを共有できるようにするための方法がいくつかあります。
選択される方法は、使用される負荷分散のスタイル、およびバックエンドストレージの可用性/容量によって異なります。
Cookieのみに保存されるセッション情報:セッション情報(セッション識別子だけではありません)はユーザーのCookieに保存されます。たとえば、ユーザーのCookieには買い物かごの内容が含まれる場合があります。ユーザーがセッションデータを改ざんするのを防ぐために、CookieとともにHMACが提供される場合があります。この方法は、ほとんどのアプリケーションにおそらく最適ではありません。
ロードバランサーは常にユーザーを同じマシンに誘導します。多くのロードバランサーは、ユーザーがどのバックエンドマシンからリクエストを行っているかを示す独自のセッションCookieを設定し、将来それらをそのマシンに送信します。ユーザーは常に同じマシンに誘導されるため、複数のマシン間でセッションを共有する必要はありません。これはいくつかの状況で良いかもしれません:
共有バックエンドデータベースまたはキー/値ストア:セッション情報はバックエンドデータベースに格納され、すべてのWebサーバーがクエリと更新にアクセスできます。ユーザーのブラウザーは、セッション情報を指す識別子(セッションIDなど)を含むCookieを保存します。これはおそらく3つの中で最もクリーンな方法です。
全体として、ほとんどの動的Webアプリケーションは多数のデータベースクエリまたはキー/値ストアリクエストを実行するため、データベースまたはキー/値ストアはセッションデータの論理的な保存場所です。
質問が複数のフロントエンドWebサーバー間でセッションを維持する方法である場合、答えは通常、集中型データベースを使用することです。Webサーバーインスタンスに依存してローカルファイルシステム上のセッションファイルを追跡する代わりに、セッションIDとデータを中央DBに書き込むと、すべてのWebサーバーが代わりにそこからデータを取得します。
nemcachedを使用することは、@ David Pashleyで言及されていない良い解決策のようです
すべてのサーバーで共有されるリモートmemcachedインスタンスを持ち、独自のセッションハンドラーを提供するmemcache PECL拡張機能を使用することを意味します。
PHP構成の2つのパラメーターを変更するだけです!
良いチュートリアルhttp://www.dotdeb.org/2008/08/25/storing-your-php-sessions-using-memcached/
IIRCは、DotNetRocks#440で、1サーバー期間と述べました。それがまだ当てはまるかどうかわからない。
編集:実際には、Hanselminutes#134でした。ごめんなさい。
a)セッション情報をユーザーcookieに保存できます。ステートレス硬化クッキー、サーバー側で保存なしデータが、ジャムセッション状態を参照してくださいhttp://www.cl.cam.ac.uk/~sjm217/papers/protocols08cookies.pdfを。b)セッションバックエンドストレージをデータベースまたはmemcachedに変更できます。単一障害点を排除するために、データベース複製または複数のmemcachedノードを設定できます。セッションでユーザー状態を失うことは大きなエラーではなく、彼を非常に不幸にしないセットアップでは、memcachedが推奨されることに注意してください。状態を維持することが重要な場合は、データベースを使用します。PHP、Django、およびRailsの両方で、開発者はカスタムセッションバックエンドを作成できます。