IPVSでthresholdを有効活用したい

かなり時間が空いてしまった感がありますが、IPVSのthresholdネタです。

こないだは、既存のスケジューラに小細工をして、weight=1 なサーバを sorry_server と見なして動かしてみました。
しかし、これだと、

  • 全スケジューラのソースに手を加えないといかん
  • weight=1がsorry_serverって定義自体いまいちピンとこない
  • カーネルのバージョンアップについてくのが大変そう

な問題があります。
なら「自分でIPVSのスケジューラを作ればいいんじゃん!」ってことで、軽く書いてみようと思います。

方針はこんな感じ

  • u_thresholdの設定値が高いサーバを優先して接続する
  • u_threshold=0なサーバをsorry_serverとみなす

ということで、weight の代わりに u_threshold で重み付けをし、u_threshold=0 なサーバには通常は接続せず、
u_threshold>0 なサーバのコネクション数がいっぱいになったら u_threshold=0 なサーバへ接続する。
こんなスケジューラがあってもいいかなと思いました。

設定のイメージはこんな感じ

virtual_server 10.0.0.1 80 {
  delay_loop 5
  lb_algo th   ← 今回作るスケージューラの仮の名前(なんかいい名前かねえ
  lb_kind DR
  protocol TCP

  # sorry server
  real_server 192.168.0.1 80{
    inhibit_on_failure
    uthreshold 0
    lthreshold 0
  }
  
  # web server
  real_server 192.168.0.2 80 {
    weight 1
    inhibit_on_failure
    uthreshold 300
    lthreshold 0
  }
}

そんで期待する動作はこんな感じ、

モシ(同時接続数 <= 300) ナラバ 192.168.0.2 にトベ
モシ(同時接続数 >  300) ナラバ 192.168.0.1 にトベ

さらに、自分でモジュールを書くならば、このへんで苦しんでいた問題も解決しそうな感じもします。
モジュールが出来次第、どこか(?)で公開してみたいと思います。