現代のWebアプリケーションにおいて、スケーラビリティを確保するために複数のサーバーで負荷を分散することは一般的な構成となっています。
しかし、複数のサーバーを並列で稼働させると、ユーザーのセッション情報をどのように管理するかという課題に直面します。
この課題を解決するための手法の一つが「スティッキーセッション」と呼ばれる仕組みです。
この記事では、スティッキーセッションの基礎知識から、具体的な仕組み、導入するメリット・デメリット、そして代替手法との比較までを詳しく解説します。
スティッキーセッションの基本概念
スティッキーセッションとは、ロードバランサー(負荷分散装置)に届いた特定のクライアントからのリクエストを、常に同じバックエンドサーバーへ転送する機能のことです。
英語の「Sticky(粘着性のある)」という言葉が示す通り、一度紐付けられたクライアントとサーバーが、セッションの間中「くっついた」状態になることを意味します。
日本語では「セッション維持」や「セッションアフィニティ」と呼ばれることもあります。
通常、ロードバランサーは複数のサーバーに対してラウンドロビン方式などで均等にリクエストを振り分けます。
しかし、スティッキーセッションが有効な場合、ロードバランサーは「どのユーザーがどのサーバーにアクセスしていたか」を記憶し、二回目以降のリクエストを同じサーバーに誘導します。
これにより、サーバー側のメモリ上に保持されているセッション情報を、再ログインなどの手間をかけずにそのまま利用することが可能になります。
Webショッピングサイトのカート情報やログイン状態の維持など、ステートフルな処理が求められるシステムにおいて重要な役割を果たしてきました。
スティッキーセッションの仕組み
スティッキーセッションを実現するためには、ロードバランサーが「どのクライアントからのリクエストか」を識別する必要があります。
この識別方法には、主に「Cookie(クッキー)」を利用する方法と、「送信元IPアドレス」を利用する方法の二種類が存在します。
Cookie(クッキー)を利用する方式
現在最も一般的で、精度が高いとされているのがCookieベースのスティッキーセッションです。
クライアントが最初にサーバーへアクセスした際、ロードバランサーが識別用のCookieを生成し、ブラウザに保存させます。
次回以降のアクセスでは、ブラウザが自動的にこのCookieをリクエストに含めて送信します。
ロードバランサーはこのCookieの中身を確認し、記録されている特定のサーバーへとリクエストをルーティングします。
この方式の利点は、クライアントのネットワーク環境が変化してもセッションを維持できる点にあります。
送信元IPアドレスを利用する方式
もう一つの方式は、クライアントの送信元IPアドレスを識別子として利用する方式です。
ロードバランサーは、アクセスしてきたIPアドレスをハッシュ化し、それに基づいて転送先サーバーを決定します。
Cookieを使用できないクライアント環境でも動作するというメリットがあります。
しかし、企業内LANやプロキシサーバー経由のアクセスでは、複数のユーザーが同じグローバルIPアドレスを共有していることが多く、負荷が特定のサーバーに集中してしまう問題があります。
また、モバイル回線などで通信経路が切り替わり、IPアドレスが動的に変化した場合にはセッションが切れてしまいます。
スティッキーセッションを導入するメリット
スティッキーセッションを導入することで、開発者はシステム構成をシンプルに保ちつつ、ユーザー利便性を向上させることができます。
アプリケーション開発の簡素化
最大のメリットは、アプリケーションのコードを変更することなく負荷分散環境に対応できる点です。
単一のサーバーで動作することを前提に設計されたレガシーなアプリケーションでも、サーバー増設時にセッション管理のロジックを書き直す必要がありません。
セッションデータを各サーバーのローカルメモリやファイルシステムに保存するだけで、継続的なサービス提供が可能になります。
これにより、開発コストと工数を大幅に削減することが可能です。
パフォーマンスの向上
セッション情報を各サーバーのローカルメモリ(RAM)で管理するため、高速なアクセスが期待できます。
後述する外部セッションストアを利用する場合、ネットワーク越しにデータを取得するためのオーバーヘッドが発生します。
スティッキーセッションであれば、リクエストを受け取ったサーバーが即座にメモリ上のセッションデータを参照できるため、レスポンスタイムの短縮に寄与します。
スティッキーセッションのデメリットと注意点
一方で、スティッキーセッションには現代的なクラウドネイティブな環境においては無視できないデメリットも存在します。
負荷の不均衡(ロードバランスの崩れ)
特定のサーバーにリクエストが集中し、負荷の偏り(スキュー)が発生しやすいという課題があります。
例えば、たまたま重い処理を行うユーザーが特定のサーバーに集まってしまった場合、他のサーバーが空いているにもかかわらずそのサーバーだけが過負荷になることがあります。
ロードバランサーの本来の目的である「負荷を均等に分散する」という機能が十分に発揮されない可能性があります。
耐障害性(フェイルオーバー)の脆弱性
スティッキーセッションを使用している場合、特定のサーバーがダウンすると、そのサーバーに紐付いていた全ユーザーのセッション情報が消失します。
セッションデータがサーバー内のメモリにしか存在しないため、他のサーバーが肩代わりして処理を継続することができません。
ユーザーは突然ログアウトされたり、入力中のデータが消えたりといった不利益を被ることになります。
可用性の高いシステムを構築する上では、この「単一障害点」に近い性質が大きなリスクとなります。
オートスケーリングとの相性の悪さ
クラウド環境で頻繁に利用されるオートスケーリング(負荷に応じてサーバー台数を増減させる機能)との相性も良くありません。
サーバーを削減(スケールイン)しようとした際、そのサーバーにまだアクティブなセッションが残っていると、即座に削除することが難しくなります。
無理に削除すればセッションが切断され、セッションが切れるのを待てばコスト削減のタイミングを逃すというジレンマが発生します。
外部セッションストアとの比較
現代のWebシステムでは、スティッキーセッションのデメリットを解消するために、外部のデータベースやキャッシュサーバーでセッションを一括管理する手法が一般的です。
ここでは、スティッキーセッションと外部セッションストア(RedisやMemcachedなど)の違いを比較表で示します。
| 比較項目 | スティッキーセッション | 外部セッションストア |
|---|---|---|
| セッション保存先 | 各Webサーバーのメモリ | 外部DB(Redis/Memcached等) |
| 負荷分散の精度 | 偏りが出やすい | 常に均等に分散可能 |
| 耐障害性 | サーバー故障時に消失 | サーバーが故障しても維持される |
| スケーラビリティ | 低い(制限が多い) | 非常に高い |
| 導入の難易度 | 容易(LBの設定のみ) | 中(アプリの改修が必要) |
外部セッションストアを利用する方式は「ステートレスな設計」と呼ばれ、モダンなWebアプリケーションの理想的な形とされています。
しかし、既存のシステムの仕様や予算の都合により、必ずしも外部ストアを導入できるとは限りません。
スティッキーセッションを利用すべき場面
デメリットも多いスティッキーセッションですが、現在でも有効な利用シーンはいくつか存在します。
レガシーシステムのクラウド移行
オンプレミス環境で構築された古いアプリケーションを、短期間でクラウドへ移行(リフト&シフト)する場合に非常に役立ちます。
アプリケーションのソースコードに手を加える余裕がない場合、ロードバランサー側でスティッキーセッションを有効にするだけで、マルチサーバー環境への移行が可能になります。
小規模なシステムやプロトタイプ開発
ユーザー数が限定されており、極端な負荷の偏りが問題にならない小規模なシステムでは、構成のシンプルさが優先されることがあります。
Redisなどの管理コストを抑えつつ、手軽に冗長性を確保したい場合に適しています。
特定の通信プロトコルを利用する場合
WebSocketのように、クライアントとサーバー間で持続的なコネクションを維持する必要がある通信では、スティッキーな挙動が求められることがあります。
ただし、最近ではWebSocketに対応したロードバランサーも増えており、必ずしもスティッキーセッション機能として意識する必要はないケースも増えています。
スティッキーセッションの設定例
参考までに、主要なクラウドサービスやロードバランサーでの設定概念を紹介します。
例えば、AWS(Amazon Web Services)のApplication Load Balancer (ALB) では、ターゲットグループの設定で「属性」から維持(Stickiness)を有効にすることができます。
{
"TargetGroupStickinessConfig": {
"Enabled": true,
"Type": "lb_cookie",
"CookieDurationSeconds": 3600
}
}
上記の設定により、3600秒(1時間)の間、同じCookieを持つリクエストが同一のターゲットサーバーへ転送されるようになります。
このように、インフラ側の設定だけで簡単に導入できるのが、スティッキーセッションの大きな特徴です。
まとめ
スティッキーセッションは、ロードバランサーにおいて特定のユーザーを常に同じサーバーへ誘導することでセッションを維持する便利な仕組みです。
「導入が容易であること」や「アプリケーションの改修が不要であること」といった大きなメリットがあります。
しかし一方で、負荷の偏りが発生しやすい点や、サーバー故障時にセッションが消失する点には注意が必要です。
新規の開発や大規模なシステム構築においては、Redisなどを用いた外部セッションストアによるステートレスな設計が推奨されます。
既存システムの延命や、コストを抑えた迅速な移行が必要な場面において、スティッキーセッションは現在も有力な選択肢の一つと言えるでしょう。
システムの規模や目的、開発コストのバランスを考慮して、最適なセッション維持の方法を選択することが重要です。
