2010-06-24
セッション切れちゃうんですけど...インフラでなんとかできませんか?
7年前の×月×日某所....。
B2Cのとあるプロジェクトが原因不明のセッション切れに頭を悩ませていた。
クライアントから、フォームを入力後、送信ボタンを押すとログイン画面に戻ってしまうというクレームが寄せられたのだ。
そのプロジェクトは、上流のロードバランサーでIPベースのハッシュにて負荷分散させている為、通常であればセッション切れは起り得ない筈なのだが.....。
まず、アクセスログを調べる。逆引きするとアクセス元は動的IPアドレス空間だった。当時、常時ADSLのサービスは始まっていましたが、クライアントはリアル店舗だった為まだISDNダイアルアップルータを使っていたようでした。
つまり、原因はクライアントの店員が10分以上かけてフォームの内容を入力している間に、ダイアルアップルータの時間制限でインターネット接続は一旦切断されていて、送信ボタンを押した時は、再接続が行われて別のIPアドレスが割り当てられていたというわけでした。
当時はmemcachedもなかったのでアプリケーション側でDBにセッションを持たせるという方法で負荷分散を行うのが一般的でしたが、このプロジェクトではロードバランサーを使って楽チンに実装するという方針だったのでそういった実装はされていませんでした。上流ロードバランサーでcookieベースにするという方法もあったのですが、いかんせん、ロードバランサーの仕様で負荷分散の方式は、ロードバランサー全体で固定で、既にべつのサービスでIPハッシュベースで負荷分散をしていた為、変更できませんでした。
で、インフラ側でなんとかできないかという相談を頂きまして。
ってまた俺かよ。これはインフラの仕事じゃない気がするぞ。アプリケーション側でDBに保存するセッションを実装しろよとは思いましたが、ふとtinydnsの特殊機能を思い出しました。
ダイアルアップルータは接続毎にIPアドレスは変わるが、ダイアルアップルータに登録されているdnsサーバーのIPアドレス帯は変わらないだろうということで、tinydnsの特殊機能DNS元サーバのIPアドレス帯によって、返すIPアドレスを変える機能を利用することにする。
まずは日本のIPアドレス帯61.x.x.x,210.x.x.x,211.x.x.xあたりで、適当に分割し今回の負荷分散対象のサーバ2台に適時割り当てる。あとはdnsのログを見ながら漏れがないかみながら調整したり、アクセスの度合いで割り当てを調整する。
ということを考えて、実際にやってみたら実現できちゃいました。
なんでもそうですが、ひととおり網羅しておくと、イザという時に役に立ちます。
例えばunixのmanとかは眺めてるだけでかなり勉強になります。
- 67 http://d.hatena.ne.jp/keyword/KLab×はてな エンジニア応援ブログコンテスト
- 2 http://k.hatena.ne.jp/keywordblog/KLab×はてな エンジニア応援ブログコンテスト
- 2 http://www.google.com/reader/view/user/-/state/com.google/reading-list
- 1 http://b.hatena.ne.jp/KLab-official/20100621
- 1 http://d.hatena.ne.jp/hirose31/20100623/1277258671
- 1 http://d.hatena.ne.jp/keyword/トライアンドエラー
- 1 http://d.hatena.ne.jp/keyword/KLab×はてな エンジニア応援ブログコンテスト
- 1 http://d.hatena.ne.jp/keyword/MTG
- 1 http://pipes.yahoo.com/pipes/pipe.info?_id=02db597254ec68550537866a2fca2ce6
- 1 http://pipes.yahoo.com/pipes/pipe.info?_id=VPw6npu13RGKo15vBRNMsA