- 投稿日2009-12-21 (月)
- 更新日2009-12-21 (月) 19:57
- サーバー(Debian) | サーバー技術情報
前回のPound記事では一般的なPoundの構成を提示してみましたが、
実際に自宅サーバー等で組む場合となると「3台の構成」がミニマムとなってしまうので
なかなか敷居が高いように感じます。
ので!
今回は無理やり2台のWebサーバーのみでPoundを利用して負荷分散ができるかを検証してみました。
また、発展形として、グローバルIPが複数必要になってきますが
keepalivedで冗長化も実現してみました。
検証に使用した環境は1日にユニーク1万アクセス、100万PV(全ファイル)ほどの実稼働しているサイトを使い
muninやcactiでどれほど負荷分散がされたか確認してみました。
(今回、2台の同期方法についてはまったく考えていません。)
2台だけでPoundで負荷分散してみる

実験してみたのはこんな感じの構成です。
現在WEB1のみで運用しており、WEB1にPoundをインストールし、
これにWEB2をつける形にして、はたして負荷分散できるのかやってみました。
Poundのインストールは前回の記事を参考していただくとして・・・
設定はこんな感じです。
/etc/pound/pound.cfg
## Minimal sample pound.cfg
##
## see pound(8) for details
######################################################################
## global options:
User "www-data"
Group "www-data"
#RootJail "/chroot/pound"
## Logging: (goes to syslog by default)
## 0 no logging
## 1 normal
## 2 extended
## 3 Apache-style (common log format)
LogLevel 1
## check backend every X secs:
Alive 30
## use hardware-accelleration card supported by openssl(1):
#SSLEngine ""
######################################################################
## listen, redirect and ... to:
## redirect all requests on port 8080 ("ListenHTTP") to the local webserver (see "Service" below):
ListenHTTP
Address 123.123.123.123
Port 80
## allow PUT and DELETE also (by default only GET, POST and HEAD)?:
xHTTP 0
Service
BackEnd
Address 10.10.10.10
Port 8080
End
BackEnd
Address 10.10.10.11
Port 8080
End
End
End
ここで注意が必要なのはPoundと振り分け先(Apache)の待ち受けポートです。Poundはポート80で待ち受け、ApacheのListen Portは8080へ設定します。
/usr/local/apach2/conf/httpd.conf
Listen 80
↓(変更)
Listen 8080
これでApacheを再起動 → Poundを再起動
とすると無事負荷分散の準備は完了です!
しばらく放置してみて、Cactiで確認をしてみたのですが、
WEB1のロードアベレージ 1.5 → 0.7
WEB1のCPU負荷 140% → 70%
ときっちり半分になっており成功しました!
しかし、WEB1のnetstatは1台の時の4倍になっておりました。
WEB1のnetstat 40 → 160
Pound?Kernelの限界?
というわけで、今回ネックとなってくるのはnetstatの大幅な上昇がネックとなる事がわかりました。netstatを引き換えにCPU負荷とロードアベレージを減らす…なんて事なら可能かもしれません。
Pound(Kernel?)にはTCPコネクションの限界値があるようで、
それを超えるようなサイトであった場合は負荷分散としては使えないようです。
先輩方の経験談を聞かせていただいた所
「大体netstat800が限界」との事で、
普段からnetstat200を超えるようなサイトの場合はこの方法を行う事はできないでしょう。
keepalivedも追加して冗長化してみる
無事netstatに問題がない事もわかり、イザ負荷分散!と導入したいところですがこのままでは見た感じからWEB1が単一障害点となりうるのでkeepalivedで冗長化設定をしてみました。
しかしこれを実行する為にはグローバルIPが3つ必要です。

WEB1側の設定
poundの設定に変更はありません。keepalivedをインストール
apt-get install keepalived
設定ファイルを作成
! Configuration File for keepalived
global_defs {
notification_email {
aaaa@hogehoge.com
}
notification_email_from aaaa@hogehoge.com
smtp_server localhost
smtp_connect_timeout 30
}
vrrp_instance vip_test {
state MASTER
interface eth0
grap_master_delay 5
virtual_router_id 1
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass secret
}
virtual_ipaddress {
123.123.123.125/24 eth0
}
WEB2側の設定
VIPが向くのはWEB1が落ちた場合なのでkeepalivedの設定のみ行います。keepalivedをインストール
apt-get install keepalived
設定ファイルを作成
! Configuration File for keepalived
global_defs {
notification_email {
aaaa@hogehoge.com
}
notification_email_from aaaa@hogehoge.com
smtp_server localhost
smtp_connect_timeout 30
}
vrrp_instance vip_test {
state BACKUP
interface eth0
grap_master_delay 5
virtual_router_id 1
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass secret
}
virtual_ipaddress {
123.123.123.125/24 eth0
}
後はWEB1,WEB2共にkeepalivedを起動すれば完了です
/etc/init.d/keepalived start
考察
好奇心にまかせて検証を行いましたが、あまりいい方法ではありませんでしたね…
WEB1、WEB2共にサーバー機のスペックが低く、少ないアクセス数で問題が起きている場合には
有用かもしれませんが・・・ちょっと限定的すぎますね。
2台だけで負荷分散する方法…何かいい方法があれば教えて下さい。
(少なくとも最後のkeepalivedを入れるくらいならDNSラウンドロビンで対応したほうがよさそう…)
コメント:0
トラックバック:0
- この記事のトラックバックURL
- http://www.ahref.org/tech/server/server-tips/654.html/trackback
- この記事へのリンク
- エーエイチレフ linuxサーバー技術情報 からの記事 2台だけで負荷分散+冗長化を検証( Pound + keepalived )













関連記事