トップ «前の日記(Fri Sep 07 2007) 最新 次の日記(Sun Sep 09 2007)» 編集

よこいまさる日記



Sat Sep 08 2007 [長年日記]

Webサーバのクラスタリングとセッション、変数の永続化

PHPやRailsで提供されているセッションの機能は、セッションでの値の保存として、セッションIDをキーにして、hash table (key:value pair の変数) をサーバ内のファイルシステムに保存するという具合になっている。 この条件で、ある問題に遭遇した。

多くのHTTPリクエストに応えられるように複数台のWebサーバを導入してクラスタを組む場合、サーバ内のディスクにセッションでの値が保存されるため、クラスタ内の別のノード(サーバ)で書かれた値を取得することができない。 セッションを書く場所を NFS で共有するようにしたとしても、セッションの保存場所が一か所になり、一台のマシンに読み書きの処理が集中するかたちとなってしまうため、スケーラビリティに限界があったり、一台のマシンが故障すると全体に波及するというアベイラビリティの問題になる。 同様にセッション保存場所にMySQLを置いても同様だ。 分散DBが使えるってことならば、それでもよいのだが、今回はそっち方面で攻めない。 できればサーバ内のファイルシステムにセッション情報を書き込むのをやめる方法をとりたい。

Webアプリでのセッションってそもそも何者か、って考えたところ、「途切れとぎれ (stateless) にリクエストを送ってるHTTPにおいて、前の HTTP リクエスト・レスポンスで使われたプログラム中の変数を永続化 (persistent) すること」なんじゃないかって思ったのです。 なんだ、永続化か、ってことで。

プログラム中の変数の永続化ならば、Dumperを使えばいいんじゃない。 ってことで、Perl ならば Data::Dumper 、PHPなら var_dump、Ruby ならば Marshal なんかが使えそうです。 これらだと、各々のプログラム言語に依存しているので、JSONやXMLを使ってプログラム言語非依存にしてもいいかもしれないですね。

あとセッションの保存としての要件には、クライアントにも第三者にも見られたくない内容があったり、改変されたり偽造されたりしては困る場合もあるだろう。 そんなことで、上述の dump されたデータをIDEAやAESなどの共通鍵暗号して base64 なんかしちゃえばいいのかも。 途中でデータ圧縮で lzo なんか使ったりしてもいいし、 base64 ってそのままだと URL encode しなければならないので、base64 の map を変更してみてもいいかもしれないし。

あとはこれらの値をどこに保存するか。 HTTPとして真っ先に思いつくのが Cookie。 または POST などするフォーム中にセッションの値を入れてもいいかもね。 携帯だとCookie使えないとかページ容量の制約などがあるので、この方法だとダメっぽそうですが。

ってことで、こんなことをやるライブラリを作ってみようかどうしようか考え中。 どの言語のものを先に作るかとか考え中。 ってことでリクエストありましたら、つっこみどうぞ。

出発

さてフェリーターミナル行く。

Photo 0 (16:07)

フェリーターミナル

乗船券とか買った。

(17:28)

乗船

客室はこんな感じ。

Photo 1 (18:05)

晩御飯

豚のしょうが焼き、いただきます。 船は出航済みです。

Photo 2 (19:28)

現在地

横浜の横を通過中

【GPS情報】

http://walk.eznavi.jp/map/?datum=0&unit=0&lat=%2b35.24.24.73&lon=%2b139.43.06.89&fm=0

Photo 3 Photo 4 (20:12)

現在地

携帯ナビで確認したら観音崎の近くだって。

(20:45)

本日のツッコミ(全4件) [ツッコミを入れる]
いけだ (Sat Sep 08 2007 18:19)

旅行、いってらっしゃーい

まさる (Sat Sep 08 2007 20:14)

はーい

コンドゥ (Mon Sep 10 2007 10:53)

2等寝台の方じゃなくて雑魚寝船の方だったのね。道中気をつけてくり

まさる (Mon Sep 10 2007 20:03)

はい雑魚寝でした。 食堂が付いていていい感じでしたよ。


2000|10|
2002|01|02|03|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|