Summit48iを使った負荷分散

こんにちは、牧野です。
この前の日曜日、好きなアーティストのライブのチケットを買おうとしたのですが、発売開始時間に電話したらつながらず、チケットを売っているウェブサイトにアクセスしたら売り切れの表示が。。。チケット買えなかったのは残念でしたが、人気があることがわかってちょっとうれしかったです。

さて、今日の本題ですが、プログラミングのネタがなかったのでウェブサーバの負荷分散についてです。
ウェブサーバでよく行われる負荷分散にはいくつかやり方があります。

1.DNSラウンドロビン
DNSの設定で、同じドメイン名に複数のIPアドレスを割り当てます。
一番手軽にできると思いますが、ダウンしたサーバにもアクセスが行ってしまうなど、あまり融通がきかない面があります。

2.apacheのmod_proxy_balancerを使う
mod_proxy_balancerを組み込んだapacheが負荷分散装置として働きます。
apache1系では使えませんが、簡単に負荷分散できます。
http://httpd.apache.org/docs/2.2/ja/mod/mod_proxy_balancer.html

3.LVS(Linux Virtual Server)を使う
実際にやったことはないのでよくわかりません。1、2よりは大変だと思います。
詳しくはこちらのブログを見てみてください。
http://dsas.blog.klab.org/archives/50664843.html

4.負荷分散装置を使う
負荷分散機能を持つネットワーク機器を使えば、安定した負荷分散が実現できるはずです。
が、機器自体がかなり高いという最大の欠点があります。また、設定やできることが機器によって異なるので、あまり応用が利かないかもしれません。

以上、思いついたもので手軽にできそうなものから順に挙げてみました。

今回紹介するのは、アシアルで使用しているネットワーク機器の1つ、Extreme Networks社のsummit48iでの負荷分散です。
summit48iはL3スイッチで、full layer 3というモデルに備わっている負荷分散機能を使う機会があったので、その設定を紹介します。

当初やりたかったのは、
・ウェブ用グローバルIPアドレス(仮想IP)に来たアクセスをウェブサーバ2台に分散する
・各ウェブサーバにもグローバルIPを割り振っておき、各ウェブサーバを指定してアクセスすることも可能

が、summitで負荷分散(summitではServer Load Balance、SLBと呼びます)を実現するには、アクセスを受け付ける仮想IPとウェブサーバの実際のIPが別ネットワークでないといけないことがわかったので、以下のような構成になりました。

summit48i
webアクセス用グローバルIP
111.111.111.xxx
LAN側ローカルIP
192.168.0.1

ウェブサーバ1
192.168.0.2

ウェブサーバ2
192.168.0.3

設定の流れですが、

1. ウェブサーバ用にVLANを作成
2.SLBに使うVLANを指定
3.SLBの対象サーバ、ポートの設定(ノード)を作成、ノードのグループ(プール)を作成
4.SLBに使う仮想IP(VIP)を作成
5.SLBに使うVIP、プールを指定して、SLBの負荷分散方法などを設定

という感じです。コマンドにすると、


configure vlan Default ipaddress 111.xxx.yyy.zzz 255.255.aaa.bbb
configure vlan webserver-local ipaddress 192.168.0.1 255.255.255.0
configure vlan webserver-local add port 10
configure vlan webserver-local add port 11
enable ipforwarding
enable slb
configure vlan webserver-local slb-type server
configure vlan Default slb-type client
create slb pool web-pool add 192.168.0.2 : 80
create slb pool web-pool add 192.168.0.3 : 80
create slb vip web-vip pool web-pool mode translation 111.111.111.xxx : 80

「webserver-local」「Default」はVLAN名、「web-pool」はプール名、「web-vip」はVIP名です。「webserver-local」には10番、11番のポートを割り当てています。
summitでは特に設定していないと全てのポートが「Default」という名前のVLANに割り当てられていて、上の例では「Default」VLANをグローバルIP用のVLANに使用することにしています。
「Default」VLANに割り当てられているグローバルIP(111.xxx.yyy.zzz)はsummit自体に割り当てられているグローバルIPで、ウェブ用のVIPとは別のアドレスです。

上のような設定で、111.111.111.xxxの80番ポートへのアクセスが192.168.0.2と192.168.0.3の80番ポートに分散されます。

summitでは負荷分散方法を設定できます。デフォルトの設定ではround-lobin(アクセス毎に別のノードに割り振る)になっています。
他にも、ratio(設定した割合で割り振る)、least connection(コネクション数が少ない方に割り振る)、priority(可能な限り優先順位が高い方に割り振る)といった設定が可能です。

ratioにして2:1で割り振るようにしたい場合は、


configure slb pool web-pool lb-method ratio
configure slb pool web-pool member 192.168.0.2 : 80 ratio 2
configure slb pool web-pool member 192.168.0.3 : 80 ratio 1

のようにします。
他にも、同一セッションのアクセスを同一サーバに割り当てたり、サービスの生死判定方法を細かく設定できたりと、いろんな機能がありますが、まだ試せていません。
負荷分散機能以外にも、まだ一度も使ったことない機能が山のようにあったりします。。。
ところで、日本ではどれくらいsummitが使われているのかな。。。
中古なら安く買えるので、興味ある人は試してみてください。
ただし、負荷分散ができるのはfull layer 3のタイプで、ソフトウェアのバージョンも古すぎるとだめ(最低でも6.1)なので、購入する場合は気をつけてください。