Webサーバーをスケーリングと冗長化のためにロードバランサ (LB) を
使用するシステムは珍しくないと思う。
ただ、手元の有り合わせの環境で簡単な性能検証をする際には
ネットワーク機材をそろえる事が難しい事も多い。

そんな時、私はpoundを使用していた。
pound は 適当な Linux サーバーにインストールすればすぐに使用できる。

でも、最近 pound では性能が不足する事が出てきた。

LB は、HTTP の通信を右から左に流すだけの物。
正直、そんなにリソースを使用するとも思えないのだが、
性能を測定したいサーバーよりも先に LB にボトルネックが来てしまう事は困る。

mpstat を見てみると、マルチコアのサーバーにインストールしているにも関わらず、
1個しかコアを使用していない模様。

これでは、サーバーを増強しても簡単には LB がスケーリングするとは思えない。
というわけで、Linux のプログラムとして動作する他の LB を探してみた。

十分な性能がでそうな候補として上がったのが、以下の 3個。
Apache のモジュール、mod_proxy_balancer
勉強会で聞いたところによると、gumiさんはAmazon Web Service のサーバー 1~2 台に mod_proxy_balancer をインストールし、最大3000万PV / 日 をさばいているとのこと

nginex (低機能、高速が売りの Web サーバー、リバースプロキシ)
勉強会の後で講師のgumiの堀内さんに伺ったのだが、mod_proxy_balancer より nginex の方が速いらしい。
(でも、Apache のノウハウが使えるから mod_proxy_balancer を使用中との事)

HAProxy
公式サイトに性能検証の結果が出ていた。
PenM 1.7GHz で 19000リクエスト/秒をさばいている。


上記 3個の LB は、その通りの性能が出れば私の性能検証には十分すぎる。
せっかくなので、振り分け方法も調べてみた。

1. ラウンドロビン以外の振り分け方法
ラウンドロビンだと、どうしても特定の Web サーバーに負荷が集中する。
実際の運用では気にならないかもしれないが、性能検証の際にはありがたくない。
できれば、Least Connections とかで振り分けられるとうれしい。

調べたところ、mod_proxy_balancer はラウンドロビン、又はトラフィック量のみ
nginexとHAProxyは Least Connections で振り分け可能な模様。

2. L7 の機能
同一セッションのリクエストに対し、同じWebサーバーに割り振る事ができるか。
例えば、初回ログイン時に、user1 はたまたま web1 に振り分けられたとする。
すると、ログアウトまで user1 は web1 に振り分ける事ができるか。
もしこれが出来れば、セッション情報を各 web サーバーで勝手に保存できる。
セッションの閲覧、更新の際のデータベースへのアクセスが無くなるのだ。

調べたところ、mod_proxy_balancer はリクエストの URL や Cookie を解析して、特定の web サーバーに振り分ける事が可能。
例えば、webサーバーごとに異なる Cookie を発行すれば、L7 で振り分ける事が可能だ。
対して nginex は、現在の所 L7 の振り分けが全く出来ないように思われる。
最後に、HAProxy は、mod_proxy_balancer のように L7 で振り分けが可能。
さらに言うと、HAProxy 自体が振り分けのための Cookie を発行してくれるので、Web サーバーに手を入れる必要が無い


実際にインストールして色々と試したが、次回の性能検証では HAProxy を
使用する事に決めた。

っていうか、最近のアプリケーションタイプ LB って、ずいぶん性能が良いようだ。
これじゃ、LB 売ってる会社は大変だろうな。