あーかいぶすハイディフィニション

ここはもう更新しとらんのじゃ

Pound で IP sticky な環境作っててハマった

仕方ないと言えば仕方ないんだけどこの仕様なんとかできねーかな、ってレベル。アプリケーションでやれよクズ!って言われたらそれまでなんだけど。

(前略)
Alive   30
(中略)
Service
    HeadRequire "Host: www.example.com"
    BackEnd
        Address 192.168.1.11
        Port    80
        TimeOut 60
    End
    BackEnd
        Address 192.168.1.12
        Port    80
        TimeOut 60
    End
    Session
        Type IP
        TTL 600
    End
End
(後略)

こんな感じで、Session に Type IP を書いておくと、IP による静的振り分けを行うようになります。簡単に言っちゃうと、

  1. 192.168.1.100 のパソコンが、.1.11 or .1.12 のサーバにアクセスする
  2. 192.168.1.100 のパソコンは、1 でアクセスしたサーバにだけアクセスするよう IP ベースで関連付けられる
  3. アイドル時間(サーバにアクセスしなかった時間)が 600 秒を超えると、セッションを破棄して、1 に戻る

基本ですな。これを行わない場合、たとえばログイン周りのセッション管理で、バランシングされてるサーバ間で物理的にセッション共有(NAS とかで)してないと、サーバまたいで繊維しちゃって、ログインしている状態が失われたりすます。
んでこの場合、.1.11 か .1.12 どちらか死んだ時、Alive の秒数だけ経過したら、片方のホストに振られて片肺運転になると思うじゃん?じゃん?実際には IP で判断してるから、死んだサーバ側に TTL の秒数経過するまでアクセスされ続けて延々死んだ画面見るハメになる。たぶん TTL 更新病数経過する前に、アクティブな接続繰り返すとずっとダウンしたホスト見続けると思う(試した限りではそうだった)。

Session の記述コメントアウトしたら別の鯖に振られたのでよくやく原因が分かったんだけど、Session 句はバックエンドの動作状況を顧みないのかね……。