はじめに
お手軽L4ロードバランサーのLVSですが、地味に今まで勘違いをしていました。
振り分けアルゴリズムの中で接続元IPをハッシュ化して指定リアルサーバに振り分ける sh
ですが、rrやlcなどとはweightの考え方が全然違いました。
shのweightは割り振りの重み付けではない
lcやwlcなどはリアルサーバに割り当てたweghtの総和から各リアルサーバに設定した値の割合だけ割り振りますよ。
って考え方だったかと認識しています。
例えば、サーバAのweightは5、サーバBは3、サーバCは10とかにすれば、総和は5+3+10=18になり、サーバAは18/5≒27.8%の割合で割り振ります。
ところが、shは同様の考え方をしませんでした。
公式ではありませんが、下記サイトにヒントがあります。
http://kb.linuxvirtualserver.org/wiki/Source_Hashing_Scheduling
リアルサーバの最大接続数x2をweightに設定するのが正解らしいです。
weightに設定した値を超えた接続は全てnullになってしまうため、思った通りの割り振りはされないようです。
つまり、上記と同様にサーバAは5、サーバBは3、サーバCは10の設定値だと、サーバAは2接続までサーバBは1接続までサーバCは5接続までは正常に割り振られ、それを超える接続はもはやランダムまたはrrになってしまうようです。
という事で
今まで振り分けアルゴリズムをshにすると「何かちゃんと割り振られてないなぁ・・・」と思っていた事がどうやら思い過ごしではなく、設定に不備があったという話でした。
なお、weightは0~65,535の間を指定する必要があるので、注意が必要です。