今年出てきそうなサービスというか、お話、第4話は、
2つ以上のサーバの共有セッション
たとえば、クラウドなどで、2つ以上のサービスにおいて、セッションを共有したい(ユーザーには見せたくないデータだが、サーバー間では共有する必要があるデータがあるときなど)場合とか、
たとえば、DNSラウンドロビンで簡易ロードバランスをしてしまい、ロードバランスするサーバー間で同じセッションデータを共有したい時(セッションによってサーバーを選ぶ形式ではなく)とか、
クラウドのように外部サーバーでも、ロードバランサーのように、内部サーバー間でもいいんだけど、2つ以上のサーバーで、セッションを共有したい場合が、今でもあり得るし、クラウドがはやれば、もっとあり得る。そういうとき、どうするか。
たとえば、サーバーA,サーバーBの2つのサーバーでセッションを共有したいとする。
この場合、理論的には、以下の3つが考えられる。
(1)サーバーA、あるいはサーバーBのどちらかのセッションに、2つのサーバーの
データを入れておく。
たとえば、サーバーAに両方のセッションにいれたいデータを入れておいた場合、
セッションBで、データが必要な時は、セッションAに、データ取り出し請求をし、
書き変わったら、データAに書き換え要求を出す。
(2)サーバーA、サーバーBとは別のサーバーCに、セッションデータを入れておき、
データが必要な時には、サーバーCにアクセスする
(3)サーバーA、サーバーBで、共有のハードディスク、データベースなどを用意しておき、
それを参照、書き換えする。
ロードバランサーで利用する場合、(1)は、まず、ない。かならず、Aをアクセスするのであれば、Aのアクセス回数は減らない(というか、増える)。(2)は、クラウドなどのときにありえる(認証したときの返り値に、セッションデータを返すとか)。(3)は、ロードバランサーでLANなどで利用するとき、あり得る。
(2)、(3)とも、1ブラウザごとに(たとえば1台で3つのブラウザを起動していたら、その1ブラウザごとに)、セッションを作る必要がある。
なので、ブラウザがセッションスタート、セッション終了を行ったほうが、やりやすいかもしれない。そして、各ブラウザごと、セッションをスタートしたら、そのセッションのID(セッションIDそのままだと、セッションハイジャックされる可能性があるから、暗号化するか、あるいはHTTPSでPOSTで送るか)をブラウザが受取、各サービスに渡すかんじかなあ・・
で、(2)、(3)とも、セッションデータを保存しておかないといけない。
(2)の場合は、サーバーCのセッション内という話もありえる。それ以外には、あるいは(3)の場合には、理論的には、2つのケースが考えられ得る。
(あ)セッションデータをデータベースにいれる
(い)セッションデータをファイルにいれる
(セッションIDなど、一意になるものをファイル名として)
(あ)の場合は、大量データの場合、問題がある。データベースはログを残す。セッションデータは、多くのデータをちょくちょく更新するので、その分、ログがガンガン書き出されてしまう(しかし、そのログは不要である)。
そーいうことから考えると、(い)のファイルのほうが無難か?
障害などを考えると、DRDBでミラーリング?
(いまどきのネタだと、ミラーリングはバックアップにはならない)
まとめると、
クラウドで2サーバー間でセッションデータ共有したい場合、
セッションデータ管理用サーバーをおき、
そのサーバーのセッション、ないしファイルシステムでデータを読み書き
簡易ロードバランサーのような、社内サーバー間でデータ共有したい場合、
共有ファイルシステムでデータの読み書き
とくに、DRDBとか使うかんじのが、クラウドや冗長性がはやると、でてきそうですね。