問題タブ [sticky-session]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
1186 参照

kubernetes - コンテナーを使用して (長期間有効な) スティッキー セッションでアプリのゼロ ダウンタイム ローリング アップデートを行う方法

JSESSIONID Cookie に基づいて、スティッキーである必要がある長寿命の対話型ユーザー セッションを持つ webapp のゼロ ダウンタイム ローリング アップデートを提供する方法を見つけようとしています。

この (およびその他の) 理由から、Docker Swarm や Kubernetes などのコンテナー テクノロジに注目しています。

次の方法について、適切な答えを見つけるのに苦労しています。

  1. 新しいセッションがアプリの最新バージョンに移動することを確認してください
  2. 既存のセッションは、開始されたアプリのバージョンに関係なく引き続き提供されます
  3. 古いバージョンへの/上のすべてのセッションが閉じられたら、古いバージョンを適切にクリーンアップします

いくつかの詳細情報:

  • リクエストは、JSESSIONID Cookie に基づいてセッションにリンクされます
  • セッションは数日間存続する可能性がありますが、たとえば 24 時間以内にアプリ内からセッションを終了することができます (ユーザーに「新しいバージョンがあるためログアウト/再度ログインするか、午後 12 時に自動的にログアウトされる」という通知を送信します)。 " 例えば)
  • もちろん、アプリの各バージョンには、負荷分散された方法で既に実行されている複数のコンテナーがあります
  • コンテナーの総数が増えてもかまいません。たとえば、古いバージョンのコンテナーのそれぞれがまだ稼働中である場合、それらはすべて 1 つのセッションをホストするため、ユーザーの大部分は既に新しいバージョンのアプリ

したがって、必要なフローについての私の考えは、次のようなものです。

  1. アプリの新しいバージョンを入れる
  2. すべての新しい接続 (JSESSIONID cookie が設定されていない接続) を新しいバージョンのアプリに 1 回だけ移動させます。
  3. アプリの古いバージョンのコンテナーがセッションを提供しなくなった場合は、コンテナーを削除します/....

前述したように、私は Kubernetes と Docker Swarm を検討していますが、他の提案も受け付けていますが、最終的なソリューションはクラウド プラットフォームで実行できるはずです (現在 Azure を使用していますが、将来的には Google または Amazon クラウドが使用される可能性があります)。

ポインタ/ヒント/提案またはアイデアを歓迎します

ポール

編集: @Tarun の質問と一般的な説明への回答: はい、ダウンタイムは必要ありません。私が想像する方法は、古いバージョンをホストしているコンテナーが実行され続け、既存のすべてのセッションを提供することです。古いサーバー上のすべてのセッションが終了すると、古いサーバーは削除されます。

新しいコンテナーは、新しいバージョンのロールアウトが開始された後にアプリを起動するユーザーに対してのみ、新しいセッションを提供します。

例を挙げると、 - 午前 9 時に古いバージョンのアプリの新しいセッション A を起動します - 午前 10 時に新しいバージョンがロールアウトされます。- 古いバージョンを実行しているコンテナーでホストされたままのセッション A を引き続き使用しています。- 正午にランチに行ってログアウトします - 古いバージョンを実行しているコンテナに接続された最後のセッションだったので、コンテナは破棄されます - 午後 1 時に戻ってログインし、新しいバージョンのアプリ

理にかなっていますか?

0 投票する
2 に答える
1561 参照

nginx - すべてのトラフィックを単一サーバーに送信する Nginx ロード バランサー (ip_hash)

学生が使用するオンライン テスト アプリケーションがあります。4つの異なるサーバーと、それらすべての上にNginxがあり、4つのサーバーすべての間でトラフィックの負荷を分散しています.

私たちのアプリケーションにはスティッキー セッション (1 人のユーザーに対して、1 つのサーバーへのすべての要求) が必要なので、負荷分散のために ip_hash アルゴリズムを有効にしました。

現在、すべての学生が、各システムにプライベート IP が割り当てられたコンピュータ ラボでのオンライン テストに参加し、全員がパブリック IP を使用して 1 つのインターネット ゲートウェイを通過している状況があります。

学生がテスト ロード バランサに表示されると、すべての学生に対して同じ発信元 IP が取得され、ip_hash により、すべてのトラフィックが 1 つのサーバーに送信されます。

この問題を解決するには?

均等な負荷分散でスティッキー セッションを維持しています。