Y-110's Wiki


[Pound を利用した負荷分散]

このページをdel.icio.usに追加 このページをはてなブックマークに追加このページを含むはてなブックマーク このページをlivedoor クリップに追加このページを含むlivedoor クリップ このページをYahoo!ブックマークに追加このページを含むYahoo!ブックマーク

_ Pound を利用した負荷分散

Pound は軽量のリバースプロキシロードバランサSSLラッパです。
Pound を利用することによって, Webサーバの負荷を分散することができます。
SSLラッパの機能も備えているため, SSL通信の負荷分散も可能です。
Pound 自体はかなり小さいプログラムのため, 導入や設定が簡単に行えるのも特徴の一つです。

よほど大規模なサイトでない限り, 性能的には Pound で十分な負荷分散が行えるでしょう。*1

_ install

Pound の公式サイトからアーカイブを入手します。
現時点(2006/5/29)での最新版は, 2.0.6 です。

# tar zxvf Pound-2.0.6.tgz && cd Pound-2.0.6
# ./configure --with-ssl=/usr/local
# make && make install

SSLをサポートする場合は, --with-ssl=<path/to/openssl> をつけてコンパイルします。
OpenSSL 周りでエラーがでる場合は, openssl-develパッケージ(OpenSSL のライブラリやインクルードファイル)が入っているかどうか確認して下さい。

_ 設定

pound.cfg を作成して, 負荷分散の設定を記述します。
デフォルトでは /usr/local/etc/pound.cfg を参照します(-f で指定することも可能です)。
ロードバランサとして設定する場合の設定例は以下の様になります。*2

# 全体的な設定 ・・・ (1)
User        "www"
Group       "www"
LogLevel    3
Alive       60
Daemon      0

# Poundサーバの設定 ・・・ (2)
ListenHTTP
    Address 192.168.0.10
    Port    80
End

# バックエンドサーバの設定 ・・・ (3) 
Service
    HeadRequire "Host: .*php.y-110.net.*"
    BackEnd
        Address 192.168.0.81
        Port    80
        Priority 6
    End
    BackEnd
        Address 192.168.0.82
        Port    80
        Priority 4
    End
End

_ 1.全体的な設定

  • User, Group
    Pound の実行ユーザとグループを指定します。
    Pound専用にユーザを作成し, 最低限の権限を付与するようにするのがセキュリティ的に望ましいです。
     
  • LogLevel
    ログの出力レベルで 0〜4 の間で定義します。
    デフォルトは 1 で通常のロギングを行います。0 はログを出力しません。
    詳細は man pound を参照下さい。
     
  • Alive
    バッグエンドのサーバにハートビートを送る間隔(秒)を指定します。
    デフォルトは 30(秒) です。
    Alive を短くするとバッグエンドサーバの障害発生時のダウンタイムが短くなりますが, 短くしすぎるとリソースを消費してしまうので注意して下さい。
     
  • Daemon
    0 に指定すると Pound が foreground で実行され, 1 に指定すると daemon として実行されます。
    デフォルトは 1 ですが, daemontools等で監視する場合は 0 に指定して foreground で動作させます。

_ 2.Poundサーバの設定

ListenHTTP
    Address 192.168.0.10
    Port    80
End

Pound が Listenする IPアドレスとポート番号を, ListenHTTPディレクティブで指定します。
Poundサーバ自身の IPアドレスと Webのポート番号(通常 80)を指定します。
この例では 192.168.0.10:80 で Pound が動作しています。

_ 3.バックエンドサーバの設定

Service
    HeadRequire "Host: .*php.y-110.net.*"
    BackEnd
        Address 192.168.0.81
        Port    80
        Priority 6
    End
    BackEnd
        Address 192.168.0.82
        Port    80
        Priority 4
    End
End

Serviceディレクティブでサービス毎にバッグエンドサーバを指定します。
バッグエンドサーバは BackEndディレクティブで IPアドレスとポート番号を指定します。
処理を振り分ける Webサーバの台数分, BackEndディレクティブを定義します。

バックエンドごとに Priority(1〜9) で優先度を指定することができます。
Priority のデフォルトは 1 です。
Priority が高いとその分リクエストも多く割り振られますので, スペックの高いマシンには優先度を高く設定しましょう。

また, HeaderRequire を指定すると, 指定したヘッダにマッチしたリクエストのみがバッグエンドサーバに送信されます。
上の例の様に Hostヘッダとマッチさせることで, Apache のバーチャルホストの様に定義することができます。

_ 起動

起動する前に設定ファイルのチェックを行います。
チェックする場合は -c -v オプションを付けて pound を実行します。

# pound -c -v
Config file /usr/local/etc/pound/pound.cfg is OK

設定ファイルにエラーがない場合は OK のメッセージが表示されます。
エラーがある場合はエラー内容が表示されますので, エラーを修正して下さい。
設定ファイルが正常であることを確認できたら, 引数なしで pound を実行させれば起動します。
 -f で設定ファイルの場所, -p で pid_file の場所をそれぞれ指定できます。

_ アクセスログ

Pound で負荷分散を行う場合, バッグエンドの各Webサーバへのアクセスログには Poundサーバの IPアドレスが記録されてしまいます。
アクセス解析を行う場合などは本来のアクセス元の IPアドレスを記録しなければなりません。
Pound はバックエンドサーバにリクエストを送信する際, アクセス元の IPアドレスを X-Forwarded-Forヘッダに付与して送信します。
Webサーバでアクセスログを取る際には, X-Forwarded-Forヘッダの IPアドレスを記録するようにしましょう。
Apache の場合は LogFormat を以下の様に指定すれば OK です。

LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

_ Pound の機能

  • URLマッチング
    Serviceディレクティブに URL を指定することで, 特定のURLパターンのリクエストのみをバックエンドサーバに送ることが可能です。
    例えば URL ".*.(jpg|gif|png)" と指定することで, 画像ファイルのリクエストのみを特定のバックエンドサーバに処理させることが可能です。
    動的ファイルと静的ファイルを処理するサーバを分けることで, メモリの効率的な利用・処理速度の向上を行うことができます。
     
  • SSLラッパ
    ListenHTTPSディレクティブの Cert で証明書ファイルを指定することで, クライアント ⇔ Pound間で SSL通信を行うことが可能です。
    Pound ⇔ バックエンドサーバ の通信は HTTP通信となります。
    秘密鍵は予め証明書自体に埋め込んでおく必要があります。
     
  • セッション維持
    Pound は以下の種類のセッション維持機能を持っています。
  • IPアドレス
  • ベーシック認証
  • リクエストパラメータ
  • Cookie
  • リクエストヘッダ

     あるセッションIDをもつリクエストは, そのセッションIDに対応するサーバに送信されます。
     セッション維持機能を設定することで, バックエンドに複数のサーバが存在してもセッションが途切れることなく通信することが可能です。

_ 注意点

  • Pound自体の冗長化
    Pound はそれ自身の冗長化機能を持っていないので, 一度 Poundサーバに障害が発生すると, バックエンドサーバ全てにアクセスができない状態になってしまいます。
    障害が発生した場合を考慮して Pound は2台構成にしておきましょう。
    理想的には, Poundサーバの障害を検知したら自動的に待機サーバがすぐに設定を引き継いでサービスを継続するホットスタンバイ構成が望ましいですが, 案件によっては設定ファイルだけを同期しておいて, 障害が発生したらすぐに手動で切り替えられるようなコールドスタンバイでも十分でしょう。
     
  • Webサーバでのアクセス制限
    先の述べた通り, アクセス元の IPアドレスは X-Forwarded-For というヘッダに入ってきます。
    Pound はリクエストを代理するリバースプロキシなので, バックエンドサーバは Poundサーバからアクセスされたように見えてしまいます。
    これは, 送信元 IPアドレスを利用する Webサーバの通常のアクセス制限が効かないことを意味します。*3
    アクセス制限を行う場合は, X-Forwarded-Forヘッダを利用して別の方法で実現しなければなりません。
     
  • キャッシュ機能
    Pound 自体はキャッシュ機能を持っていないので, リクエストは必ずバックエンドサーバに送信されます。
    リバースプロキシでのキャッシュを行うことで性能をあげたい場合は, squid 等のツールを検討して下さい。
 


実際に性能テストを行ったわけではありません。あくまでも予想です。が, F5 の BIG-IP の中身のスペックから考慮すると, そこらへんのデスクトップPC でも十分な性能を発揮するのでは。


Pound1系から設定ファイルのフォーマットが大きく変更されていますので注意してください


例えば Apache の Allow From や Deny From等は効きません


 
Link: 負荷対策概論(1285d) FrontPage(1373d)
Last-modified: 2006-05-29 (月) 19:01:28 (1522d)