セッション永続性とは、同じクライアントまたは同じユーザーセッションからのリクエストを、一定期間同じバックエンドサーバーへ振り分け続ける負荷分散の動作です。Sticky Session や Session Affinity とも呼ばれます。
すべてのアプリケーションが完全なステートレス設計とは限りません。ログイン、ショッピングカート、チャット、複数ステップのフォーム、一時的な業務フローでは、状態が特定インスタンスのメモリに残る場合があります。後続リクエストが別のバックエンドへ行くと、再ログイン、データ消失、動作不整合が起きます。
そのため、セッション永続性はロードバランサーとアプリケーションのセッションモデルをつなぐ調整機構です。常に必要ではありませんが、状態が特定バックエンドに残る場合は実用的な解決策になります。

セッション永続性は、状態を持つやり取りを複数リクエストの間で一貫させます。
セッション永続性の意味
1つのクライアントセッションに一貫したバックエンド経路を与える
本質的には、毎回自由に再分配するのではなく、同じクライアントを同じバックエンドへ繰り返しルーティングすることです。通常の負荷分散では各リクエストがアルゴリズムに従って選ばれますが、永続性が有効な場合は継続性が優先されます。
目的は単なるルーティングの便利さではなく、状態が共有ストアやステートレストークンへ外部化されていないアプリの連続性を守ることです。
実際の設計では、ユーザーが機能を意識するよりも、関連リクエストが安定して処理されることが重要です。
Sticky Session または Session Affinity とも呼ばれる
これらの用語は、多くの負荷分散文書でほぼ同じ概念を示します。
ベンダーごとに表現は違っても、クライアントとバックエンドの関係を一定時間保持する点は共通です。
セッション永続性はアプリを自動的にステートフルにするものではありません。ステートフルなアプリを一貫して動かす補助機能です。
セッション永続性の仕組み
ロードバランサーが最初の振り分けを行う
最初のリクエストは round robin、least connections、重み付けなど通常のアルゴリズムで選ばれます。
選択後、同じクライアントを後で認識するための情報が保存されます。
つまり最初は負荷分散、次回以降は親和性ベースになることがあります。
親和性キーを保存する
キーには Cookie、送信元 IP、ハッシュ、アプリケーションデータなどが使われます。
キーとバックエンドが有効である限り、後続リクエストは同じサーバーへ戻されます。
選んだキーが実際のセッションを正しく表すかどうかが品質を左右します。
後続リクエストが同じバックエンドを再利用する
クライアントが戻ると、ロードバランサーは保持記録を確認し、以前のバックエンドへ送ります。
これによりログイン状態、カート、複数ステップの処理が安定します。
タイムアウト、障害時動作、ヘルスチェックと合わせて設計する必要があります。

最初のリクエスト後に親和性記録を作り、以後のルーティングで再利用します。
一般的な方式
Cookieベース
HTTP と Web アプリで最も一般的な方式です。ロードバランサーまたはアプリが Cookie を設定し、セッションとバックエンドの関係を識別します。
ブラウザ、認証、ポータル、買い物フローに適しています。
従来型 Web アプリのセッション連続性では有力な標準方式です。
送信元IPまたはハッシュベース
送信元 IP やリクエスト属性のハッシュを使います。導入は簡単ですが制約があります。
NAT配下の複数ユーザーが同一扱いになったり、モバイルユーザーのIP変化で親和性が失われたりします。
制御されたネットワークに向いています。
アプリケーション認識またはカスタム方式
アプリデータやプロトコルフィールドを使う高度な方式です。
複雑なセッション識別モデルに対応できます。
ただし設計、テスト、運用理解がより重要です。
最適な方式はロードバランサーの機能だけでなく、アプリがセッションをどう識別するかで決まります。
メリット
ステートフルアプリの連続性
一時データがローカルにある場合、同じインスタンスで処理を続けられます。
セッション切れ、再ログイン、フォーム損失、不整合を減らします。
負荷分散環境で使えるアプリにする重要条件になる場合があります。
一部ケースでアーキテクチャを簡素化
状態をすぐ分散共有ストアへ移す必要がない場合、移行段階を支えます。
長期最適とは限りませんが、現実的な中間策です。
そのため本番環境でも Sticky Session はよく使われます。
性能面の利点
同じバックエンドに状態やキャッシュが残ると、再構築や同期を減らせます。
短期的な繰り返し操作で効果が出やすいです。
適切なワークロードでは UX とバックエンド効率を同時に改善できます。

繰り返しリクエストが特定バックエンドの一時状態に依存する場合に最も有効です。
トレードオフと制限
負荷分散が均等でなくなる
各リクエストを現在負荷に応じて自由に再配分できなくなります。
重いセッションや長いセッションはホットスポットを作る可能性があります。
そのため意図的に有効化すべきです。
フェイルオーバーが複雑になる
紐付いた backend が停止すると、親和性記録は有効な宛先を失います。
永続性は堅牢な状態管理の代替ではありません。
連続性と障害復旧のバランスが必要です。
完全ステートレス設計には不向き
クラウドネイティブでは状態を共有ストア、トークン、キャッシュ、分散IDに外部化することが多いです。
その場合、永続性は不要で、柔軟性を下げることもあります。
状態問題を解くときだけ使い、ステートレスで解けるなら避けるべきです。
セッション永続性は実用的ですが、万能のベストプラクティスではありません。
活用シーン
ログイン状態を持つWebアプリ
認証状態や一時コンテキストが1つの backend に残る場合に使われます。
レガシーポータルや段階的モダナイズで特に有効です。
旧来のセッション処理と現代的負荷分散の橋渡しになります。
カートとEコマース
カート内容、価格ロジック、チェックアウト状態を守ります。
連続性の喪失は売上に直結します。
カート状態がノードローカルなら価値が高いです。
複数ステップフォームと取引
登録、申請、管理ワークフローの途中状態を維持します。
途中で連続性を失うリスクを減らします。
この種の流れは不整合が表面化しやすいです。
チャット、リアルタイム、APIゲートウェイ
同じノードに保つことで状態再構築を減らせます。
APIでは必要な場合だけ選択的に使うべきです。
判断基準は会話やセッション状態の保存場所です。
Kubernetes と Ingress
移行中の stateful workload や Web サービスに役立ちます。
Ingress や Gateway が Pod への安定経路を作れます。
新旧アプリ混在クラスターでよくある妥協策です。
導入ベストプラクティス
実際の問題を解く場合だけ使う
すでに stateless なら、親和性は柔軟性を下げるだけです。
選択的な利用は長期的に健全な設計につながります。
他サービスをより耐障害なモデルへ移行しやすくします。
方式を慎重に選ぶ
Cookie は Web、IP/ハッシュは制御環境、高度方式は特殊用途に向きます。
誤った方式は弱い親和性や誤グループ化を生みます。
これはインフラだけでなくアプリ設計の判断です。
タイムアウトと障害動作を設計する
保持時間はワークフローを支える長さにし、古い親和性は残しすぎないようにします。
紐付いた backend 障害時の挙動も必ずテストします。
適切なら安定性を高め、プラットフォームを硬直させません。
FAQ
簡単に言うと何ですか?
同じユーザーのリクエストをセッションの一部期間、同じ backend に送る負荷分散機能です。
Sticky Session と同じですか?
はい。Session Affinity とともに同じ意味で使われることが多いです。
なぜ必要なアプリがありますか?
ログイン、カート、チャット、フォーム状態などを特定インスタンスに保持しているためです。
主な実装方式は?
Cookie、送信元IP、ハッシュ、アプリケーション認識方式です。
常に良い選択ですか?
いいえ。ステートフルアプリには有効ですが、完全ステートレス設計では不要な場合が多いです。