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