+ 作るログイン
図を読み込んでいます…
1 / 7
動きでわかる Webとデータの仕組み / 全10章

負荷分散:サーバーが変わると、ログインが消える?

発行
アニメモ公式
版
第1版
改訂
コマ
全7

アプリを2台に増やしたとき、メモリ内のセッションに何が起きるか。共有ストアとスティッキーセッションの違いを追う。

台数が増えると、毎回同じ台とは限らない

アプリをAとBの2台で動かし、入口にロードバランサーを置きます。利用者には一つの入口に見えていても、その後ろでは複数の対象がリクエストを処理します。

この作品ではA、Bと交互に振り分ける例を使います。実際の選択方法は製品や設定によって異なり、接続数や処理中のリクエストなどを考慮する方式もあります。

考えたいのは、ログイン後の次のリクエストが、別の台に届いても動くかです。AWS ALB:ターゲットグループの属性

  • 04 / WEB SYSTEMS
  • 1 / 7
  • 入口は一つ。処理するアプリは二つ
  • アプリ A
  • 利用者
  • 負荷分散
  • sid=abc
  • リクエストを振り分ける
  • アプリ B
  • リクエスト 1
  • この例では A → B と交互に振り分け
  • リクエストごとに、別のアプリへ届くことがある。

セッション本体は、Cookieの中とは限らない

利用者がAでログインし、Aがメモリ内に abc → 利用者情報 を保存したとします。ブラウザにはセッション識別子 sid=abc をCookieとして渡します。

この例のCookieは、セッション本体そのものではありません。後のリクエストでsidを受け取ったアプリが、対応する情報を保存先から探します。

Aのメモリだけを使う設計なら、Aが処理している間は動くかもしれません。しかし、Bは独立したプロセスです。Aに変数を追加しても、Bに自動で同じ内容が現れるわけではありません。

  • 04 / WEB SYSTEMS
  • 2 / 7
  • Aのメモリだけに、セッションを保存した
  • アプリ A
  • 利用者
  • 負荷分散
  • sid=abc
  • リクエストを振り分ける
  • abc → 利用者情報
  • アプリ B
  • Aのメモリ:ログイン済み
  • sid=abc の操作
  • Cookieのsidは識別子。セッション本体はAにしかない。

同じsidを送ったのに、Bでは見つからない

次のリクエストはBに振り分けられました。ブラウザは同じ sid=abc を送りますが、Bのメモリには対応するセッションがありません。

アプリの実装によっては、ログアウトしたように見える、処理を拒否する、といった結果になります。Cookieが消えたことと、Cookieの識別子に対応する状態が見つからないことは別の問題です。

入口を一つにしたことは、メモリを一つにしたことではありません。 リクエストの経路と、情報の置き場を分けて描くと、原因が見えます。

  • 04 / WEB SYSTEMS
  • 3 / 7
  • 次はBへ。Bにはabcの情報がない
  • アプリ A
  • 利用者
  • 負荷分散
  • sid=abc
  • リクエストを振り分ける
  • Bには状態がない
  • アプリ B
  • Aのメモリ:ログイン済み
  • sid=abc の操作
  • 同じCookieでも、アプリ間でメモリが共有されるわけではない。

状態を、両方から読める場所へ移す

AとBが共通のセッションストアを参照する構成に変えます。どちらも sid=abc で同じ情報を検索できれば、振り分け先が変わってもログイン状態を扱えます。

これにはデータベースや、要件に合ったセッション用ストアを使えます。共有先の可用性、期限切れ、失効、同時更新の扱いも設計が必要です。共有場所を一つ描いただけで障害対策まで完成するわけではありません。

この図はセッション識別子を使う方式です。署名付きトークンを検証する方式には別の利点と失効設計がありますが、今回は混ぜずに追います。

  • 04 / WEB SYSTEMS
  • 4 / 7
  • セッションを、両方から読める場所へ
  • アプリ A
  • 利用者
  • 負荷分散
  • sid=abc
  • リクエストを振り分ける
  • アプリ B
  • sidで検索
  • 共有ストア:abc → 利用者
  • 共有ストアに置けば、処理先が変わっても同じ情報を読める。

処理する台と、利用者の状態を切り離す

Bがsidを共有ストアで検索し、対応する情報を得ました。利用者の操作を、Aのときと同じ状態から続けられます。

ここでの「アプリをステートレスに近づける」とは、システム全体から状態を消すという意味ではありません。交換されるアプリのメモリだけに、継続に必要な情報を閉じ込めないという設計です。

セッション以外にも、カート、アップロード途中の情報、バックグラウンド処理の進行などが対象になり得ます。複数台が使える場所に置く必要がある状態を、個別に決めます。

  • 04 / WEB SYSTEMS
  • 5 / 7
  • Bが読んでも、Aと同じセッションが見つかる
  • アプリ A
  • 利用者
  • 負荷分散
  • sid=abc
  • リクエストを振り分ける
  • 同じ状態で処理できる
  • アプリ B
  • sid=abc
  • 共有ストア:abc → 利用者
  • アプリの交換と、利用者の状態を切り離す。

同じ台へ寄せる方法は、メモリの複製ではない

スティッキーセッションは、一定の利用者やセッションを同じ対象へ寄せる仕組みです。AWS ALBではCookieを使う方式があります。対象の選び方や継続時間は設定によります。

ただし、Aが停止してBへ切り替わったとき、AのメモリがBへ引き継がれるわけではありません。同じ台へ寄せることと、状態を失わずに復旧することは別です。

スティッキーが役立つ用途もあります。障害時やデプロイ時に何が起こるかを含めて判断します。AWS:スティッキーセッション

  • 04 / WEB SYSTEMS
  • 6 / 7
  • 同じ台へ固定する方法にも、限界がある
  • スティッキー
  • Aが停止したら?
  • 同じ利用者を同じ対象へ寄せる
  • Bへ移ってもAのメモリはない
  • いつも A へ
  • Bに状態がない
  • スティッキーでも、故障した台のメモリは引き継げない。

2台に増やす前に、どこを見る?

最初に見るのは、振り分け規則、状態の置き場、台が交換されたときの動きです。利用者が毎回同じ台へ届くことを、根拠なく前提にしないようにします。

ヘルスチェックで対象の状態を確認することも大切ですが、検知の遅れや製品ごとの障害時の挙動があります。「壊れた台へ絶対に届かない」とは置かず、失敗時の処理も考えます。

図のAを一度消してみて、それでも続けるためにどの情報が必要かを考えてください。その情報をどこへ置くかが、負荷分散を導入するときの大きな設計ポイントです。

  • 04 / WEB SYSTEMS
  • 7 / 7
  • 確認:2台に増やす前に、どこを見る?
  • 振り分け
  • 状態の置き場
  • 故障と更新
  • 毎回同じ台とは限らない
  • 複数台から参照できる?
  • 交換しても復旧できる?
  • アプリの外に置く状態を決める
  • 振り分け規則だけでなく、状態の置き場と障害時を確かめる。

0 件のコメント

読み込み中…

権利侵害・不適切な内容の連絡: [email protected]