Quora回答シリーズです。
質問
Webサーバー2台でPHPのセッションを使いたいのですが、2台が共通で参照できる領域がありません。DBは負荷の懸念があるので避けたいのですが他に何か方法はありませんか?
https://qr.ae/pNy6h8
回答には書きませんでしたが、以下のようなことも念頭に置いて考える感じですかね。
- サーバが落ちた時にセッションに保存したデータが消えても良いか
- トランザクションに対応する必要があるか
- DB上のデータと連係する必要があるか
あとPHPは最初からmemcahedにセッション情報を保存する機能が付いているのでこれを使うのも手ですかねぇ。 www.php.net
回答
古くからある手法としては、LB側でクライアントを振り分ける方法があります。
1つのトランザクションを継続して特定のサーバーに振り分けるのがセッション維持(セッション・パーシステンス)である(図4)。これを実現するには、ロードバランサーが、送信元のクライアントを一意に識別する必要がある。(中略)初回接続時、ロードバランサーがサーバーの情報を埋め込んだクッキーをWebブラウザ側に保存。その後のセッションは、ロードバランサーがクッキーを発行したサーバーに対して振り分けるわけだ。 ※知っておきたいロードバランサーの基礎技術 (2/2) より
環境が分かりませんが、AWS(ALB)であれば「スティッキーセッション」などで検索されると情報が出てくると思いますよ。 docs.aws.amazon.com
ただ、この手の振り分けはトラブルの原因になりやすいので、共通の領域を持たれるのが良いと思います。ほかの方が書かれているようにRedisやMemcacheはアプリ側から手軽に使えて良いですね。
例えばですがRDBであってもMySQLをKVS(NoSQL)として利用する方法や、テーブルをメモリ上に乗せる方法などで負荷を軽減させるといったことも可能です。そもそも現状で一般的なWebサーバ2台でさばけている程度のリクエスト数であれば、設定やチューニングはしっかり行う必要がありますがそれほど深刻にならなくて良いのではないかなぁとも思います。