HAProxy

HAProxy
L4レベルと、L7レベルでの負荷分散(ロードバランシング)に対応するフロントエンド。
HAProxy単体でパーシステンス(srcIP,cookie,etc...)も可能だし、重み付け分散も出来る。
システムを本気で冗長化したいが、金を掛けたくない場合には有効な手段の一つ。
ただし、HAProxyは負荷分散のみの為、完全冗長化をする為にはHeartBeatも組み込む必要がある。
システムに金をかけれる場合、F5のBIG-IPとかA10のThunderとかを使う必要がある。

インストール

1. ビルド・インストール
事前にsquidをインストールしておく事。
HAProxyは単純にmakeしてあげれば、ビルドとインストールまで出来るのだが、
今回はHAProxyのバージョン管理も行いたい為、Makefileを直接編集していく。

# tar zxvf haproxy-1.5.8.tar.gz
# cd haproxy-1.5.8.Carina
# cp Makefile Makefile-
# sed -e "s/PREFIX = \/usr\/local/PREFIX = \/usr\/local\/haproxy-1.5.8/g" Makefile- > Makefile
# diff Makefile- Makefile
    83c83
    < PREFIX = /usr/local
    ---
    > PREFIX = /usr/local/haproxy-1.5.8



Makefileを編集したらビルド開始。下記で指定しているパラメータは以下参照。

TARGET=Linuxのkernel。2.6.xxか3.xx.xxを使っている場合はlinux2628を指定する。
CPU=サーバのCPU種類。面倒だったら"generic"と書けば大丈夫。SPARCを使っているなら"ultrasparc"と書く。
ARCH=今回は未指定。CPUのアーキテクチャを指定したい場合に書く。i386やx86_64等を指定可能。書かなくてもmakeは通る。
=====
# echo "TARGET=linux2628 CPU=x86_64 USE_OPENSSL=1 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1" > make.option
# make `cat ./make.option`
# make install



2. 設定ファイル
参考サイト:HAProxyのACLとCriteria


設定ファイルの作成と、起動に必要な情報も決めていく。
コンフィグのひな形はexamplesの中にシナリオが用意されているので、それをコピーしても稼働する。
今回は必要最低限に削減したコンフィグを自作する。

# mkdir /var/run/haproxy
# groupadd haproxy
# useradd -g haproxy -d /var/run/haproxy -s /sbin/nologin haproxy
# chown haproxy.haproxy /var/run/haproxy
# chmod 755 /var/run/haproxy
# cd /usr/local
# ln -s /usr/local/haproxy-1.5.8 ./haproxy
# cd /usr/sbin
# ln -s /usr/local/haproxy/sbin/haproxy .
# cp ${HAProxy_SRC}/examples/haproxy.init /etc/init.d/haproxy
# chown root.root /etc/init.d/haproxy
# chmod 755 /etc/init.d/haproxy
# mkdir /etc/haproxy
# vi /etc/haproxy/haproxy.cfg
=====
## グローバルセクション
global
    # デーモンとして動かす
    daemon

    # 起動させるHAProxyデーモンの数
    nbproc      2

    # 最大コネクション数
    maxconn     4096

    # HAProxyの実行ユーザ。UID指定も可能
    uid         haproxy

    # HAProxyの実行グループ。GID指定も可能
    gid         haproxy

    # chroot機能を利用する時のDocumentRoot指定
    #chroot     /usr/share/haproxy

    # HAProxyの切り替わりログ。下記の場合、localhostのsyslogにfacility:local1でlevel:info以上を投げる
    #log        127.0.0.1 local1 info

    # HAProxyのPID
    pidfile     /var/run/haproxy.pid

    # HAProxyの状態をWebベースで見れる様にする為のソケット。UIDとGIDは実行ユーザの物と合わせる
    stats socket    /var/run/haproxy/stats.sock uid 5001 gid 5001


## デフォルトで適用されるパラメータの指定
defaults
    # ロードバランシングのモード。TCPとHTTPが指定可能
    mode        http

    # ログの出力オプション。下記の場合、httplogとHealthCheckのログを出力する。
    option      httplog
    option      dontlognull
    option      log-health-checks

    # HAProxyを通過したパケットに、X-Forwarded-ForのHTTPヘッダを追加する
    option      forwardfor

    # HAProxyのリトライパラメータ。下記の場合、接続を3回トライした後に4回目(最後)の接続で別バックエンドに投げる
    option      redispatch
    retries     3

    # 最大コネクション数
    maxconn     2048

    # ログの出力方式はglobalセクションの物を使用する。
    log         global

    # HAProxyのコネクションタイムアウト。ms指定
    timeout connect 3000
    
    # HAProxyのクライアントとサーバのタイムアウト。ms指定。clientとserverは同じ値にする
    timeout client  30000
    timeout server  30000


## HAProxyのstatsページ。下記の場合、8888ポートでstatsページの表示を受け付ける。
listen hastats 0.0.0.0:8888
    # statsページの出力モード。httpのみ
    mode        http

    # defaultsセクションの指定内容と同様
    maxconn     64
    timeout connect 3000
    timeout server  10000
    timeout client  10000

    # stats表示を有効にする
    stats enable
    stats show-legends

    # statsページのURL-PATHを指定する
    stats uri   /haproxy?hastats

    # statsページのログインユーザ[User]とパスワード[Password]を指定する
    stats auth  User:Password



# --- Balancing proxy server --- #



## HAProxyのフロントエンド指定。負荷分散先の振り分けルールを作成する。
frontend all 0.0.0.0:8080
    # HTTPS接続時のポート番号を指定
    acl ssl_port url_end        443

    # 振り分けURLの指定。指定出来るパラメータは以下の通り
    # [url_beg -i "パラメータ"]の様に指定すると、複数指定が可能
    # ----------
    #     url : URLの完全一致
    #     url_beg : URLの先頭一致
    #     url_dir : URLのディレクトリ一致
    #     url_dom : HTTPリクエストのドメイン完全一致
    #     url_end : URLの後方一致
    #     url_len : URLの長さ一致
    #     url_reg : 正規表現のマッチング
    #     url_sub : URLを文字列として見た場合の一致
    # ----------
    #     if "ACL_NAME1" "ACL_NAME2" "etc..." : ACL_NAMEが全てtrueの場合
    #     unless "ACL_NAME1" "ACL_NAME2" "etc..." : ACL_NAMEが全てfalseの場合(ifの逆)
    acl url_google url_dom    www.google.co.jp
    use_backend google        if url_google ssl_port

    # 個別の振り分け条件にマッチしなかった場合に使用するデフォルトバックエンド
    default_backend squid


## デフォルトのバックエンド指定
backend squid
    # ロードバランサーの分散処理方式
    # ----------
    #     roundrobin : ラウンドロビン方式。weightパラメータ(分散先の重み付け[1~256])を使用可能。バックエンド復帰時のバランシングも可能
    #     static-rr : ラウンドロビン方式。weightパラメータ(分散先の重み付け[1~256])を使用可能。バックエンド復帰時のバランシング不可
    #     leastconn : 接続数が一番少ないサーバにコネクションを割り振る。負荷を均等にする場合に効果大
    #     source : srcIPを元に負荷分散。パーシステンスを効かせる場合には特に有効
    #     uri [len <length>] [depth <depth>] : URIの"?"より前を元に負荷分散。参照するURIの長さも指定可能。リバースプロキシを作る時に使う程度
    balance roundrobin

    # HTTPヘッダ内のcookieにSERVERIDを付与する。これによってSERVERIDを元にしたcookieパーシステンスが出来る
    cookie SERVERID insert indirect nocache

    # 負荷分散先のバックエンドサーバを指定する
    # server "サーバ名" "IPアドレス:ポート番号" "オプション"
    # ----------
    #     cookie "NAME" : HTTPリクエストのcookieに埋め込むパラメータの指定。ここに書いた名前がcookieに埋め込まれる為、ローカル名の指定は注意
    #     check : バックエンドサーバHealthCheckを行う。デフォルトでは、2秒間隔にチェックを行う
    #     inter "NUM" : 指定数毎にcheckを行う。単位はms
    #     fall "NUM" : 指定数のチェックに失敗したら、最後に+1回のチェックを行った上で、他バックエンドサーバに処理を割り振る
    #     rise "NUM" : 指定数のチェックに成功したら、他バックエンドサーバに割り振っていた処理を巻き取る
    #     backup : バックエンドサーバをバックアップ用途で使用する。backup指定をすると、他バックエンドサーバが落ちない限り処理が割り振られない
    server proxy01.hogehoge.org 192.168.1.11:8008 cookie proxy01 check
    server proxy02.hogehoge.org 192.168.1.12:8008 cookie proxy02 check


## 個別バックエンド指定
backend google
    balance roundrobin
    cookie SERVERID insert indirect nocache
    server proxy01.hogehoge.org 192.168.1.11:8008 cookie proxy01 check inter 1000 fall 2 rise 10
    server proxy02.hogehoge.org 192.168.1.12:8008 cookie proxy02 check backup



3. 起動方法
設定ファイルを作成したら、起動スクリプトを叩いてみる。
また、必要に応じてログローテートの設定も作成する。

#起動
# /etc/init.d/haproxy start

#停止
# /etc/init.d/haproxy stop

#コンフィグの再読込
# /etc/init.d/haproxy reload



4. HAProxyのstats表示
HAProxyの動作状況を確認するには、コンフィグで書いたstatsURLへ接続する必要がある。
上記の通りに設定している場合、"http://[HAProxyのサーバアドレス]:8888/haproxy?hastats"でアクセス出来る。
また、ユーザ名とパスワードを指定している場合、このタイミングでパスワード等を入力する必要がある。
正常に稼働している場合、下記のような画面が表示される(下のは実際にns-lab BBで動作しているHAProxyのステータス)
haproxy_stats.png