HAProxy:高性能ロードバランサーの設定と運用

1. はじめに

HAProxyは、高可用性、ロードバランシング、およびTCPとHTTPアプリケーション用のプロキシ機能を提供し、バーチャルホストをサポートします。 HAProxyは特に、大量のトラフィックを処理するWebサイトに適しており、これらのサイトでは通常、セッション保持や7層処理が必要です。ロードバランシングのLVSは4層ベースです。 HAProxyの高性能ロードバランシングの利点は以下の通りです: - バーチャルホストをサポートし、4/7層で動作できます - Nginxの欠点を補うことができます。例えば、セッション保持やCookieの誘導など - URLを使用してバックエンドサーバーを検索できます - LVSと同様に、ロードバランシングソフトウェアであり、純粋な効率の観点から、HAProxyはNginxよりも優れたロードバランシング速度を持ち、同時接続処理でもNginxに優れています - HAProxyはMySQLの読み取り操作にロードバランシングを適用でき、バックエンドのMySQLノードを検出してロードバランシングし、複数のアルゴリズムをサポートします HAProxy+Keepalivedの企業向けハイパフォーマンスWeb環境は、数百万規模の同時接続をサポートできます。

2. インストールと設定

2.1 インストール

ダウンロードURL:http://download.openpkg.org/components/cache/haproxy/
# wget http://download.openpkg.org/components/cache/haproxy/haproxy-1.8.10.tar.gz
# tar -xvf haproxy-1.8.10.tar.gz
# cd haproxy-1.8.10
# make TARGET=linux2628 PREFIX=/usr/local/haproxy/
# 2.0以降は make TARGET=linux-glibc PREFIX=/usr/local/haproxy/
# make install PREFIX=/usr/local/haproxy
# /usr/local/haproxy/sbin/haproxy -v

2.2 HAProxy設定ファイルの詳細

###########グローバル設定#########
global
    log 127.0.0.1 local0      # ログ出力設定、すべてのログをローカルに記録
    log 127.0.0.1 local1 notice # HAProxyログレベル[error warring info debug]を定義
    daemon                     # バックグラウンドでHAProxyを実行
    nbproc 8                   # プロセス数(パフォーマンス向上のために複数設定可能)
    maxconn 4096               # デフォルトの最大接続数
    uid                        # HAProxyを実行するユーザーUID
    gid                        # HAProxyを実行するユーザーのGID
    pidfile /var/run/haproxy.pid # HAProxyプロセスPIDファイル
    ulimit-n 65535             # ulimitの数量制限
    chroot /usr/share/haproxy  # chroot実行パス
    debug                      # HAProxyデバッグレベル(単一プロセスでデバッグする場合のみ推奨)
    quiet

########デフォルト設定############
defaults
    log global
    mode http                  # 処理のカテゴリ(7層http、4層tcp)
    maxconn 20480              # 最大接続数
    option httplog             # ログカテゴリhttpログ形式
    option httpclose           # 各リクエスト後にHTTPチャネルをアクティブに閉じる
    option dontlognull         # ヘルスチェックのログを記録しない
    retries 3                  # 3回の接続失敗でサーバーを利用不可と判断
    option forwardfor          # バックエンドサーバーがクライアントの実際のIPアドレスを必要とする場合のパラメータ
    option redispatch          # serverIdに対応するサーバーがダウンした場合、他の正常なサーバーに強制転送
    option abortonclose        # サーバー負荷が高い場合、現在のキューで処理中の長い接続を自動的に終了
    timeout connect 5000ms      # 接続タイムアウト
    timeout client 30000ms      # クライアントタイムアウト
    timeout server 30000ms      # サーバータイムアウト
    #timeout check 2000ms      # ヘルスチェックタイムアウト
    #timeout http-keep-alive 10s # デフォルトの永続接続タイムアウト
    #timeout http-request 10s   # デフォルトのHTTPリクエストタイムアウト
    #timeout queue 1m          # デフォルトのキュー待ちタイムアウト
    balance roundrobin         # デフォルトのロードバランシング方式を設定(ラウンドロビン方式)
    #balance source            # デフォルトのロードバランシング方式を設定(Nginxのip_hashに類似)
    #balance leastconn         # デフォルトのロードバランシング方式を設定(最小接続数)

########監視ページ設定########
listen monitor_stats
    bind 0.0.0.0:65535        # 監听ポート
    mode http                  # HTTPの7層モード
    option httplog             # HTTPログ形式を使用
    log 127.0.0.1 local3 err   # エラーログを記録
    maxconn 10                 # デフォルトの最大接続数
    stats refresh 30s          # 30秒ごとに監視ページを自動更新
    stats uri /stats           # 監視ページのURL
    stats realm System\ Monitor # 監視ページのプロンプト情報
    stats auth admin:admin     # 監視ページのユーザー名とパスワードを設定:admin
    stats auth user:password   # 监视页面的用户名和密码:user
    stats hide-version         # 统计页面上HAProxy的版本信息を非表示
    stats admin if TRUE        # 手動での起動/無効化、バックエンドサーバーを設定
########HAProxyバックエンドサーバーの状態を監視########

listen service_status
    bind 0.0.0.0:1081         # 监听端口
    mode http                  # HTTPの7層モード
    log 127.0.0.1 local3 err   #[err warning info debug]
    monitor-uri /service_status # サービスヘルスチェックURL、HAProxyが管理するサイトの可用性を検査
    acl service_dead nbsrv(app_servers) lt 2 # サイトダウン時のポリシーを定義、ロードバランシング上の指定バックエンドの有効マシン数が1台未満の場合にtrueを返す
    monitor fail if service_dead # ポリシーが満たされた場合に503を返す
    monitor-net 192.168.80.130/32 # 192.168.80.130からのログ情報は記録および転送されない
    monitor-net 192.168.80.131/32 # 192.168.80.131からのログ情報は記録および転送されない
########HAProxyエラーページの設定#####
#errorfile 403 /usr/local/haproxy/errorfiles/403.http
#errorfile 500 /usr/local/haproxy/errorfiles/500.http
#errorfile 502 /usr/local/haproxy/errorfiles/502.http
#errorfile 503 /usr/local/haproxy/errorfiles/503.http
#errorfile 504 /usr/local/haproxy/errorfiles/504.http

########フロントエンド設定##############
frontend web_frontend
    bind *:80                  # クラスタ高可用性の場合の問題を避けるため、bind *:80の使用を推奨
    abc_site hdr(host) -i www.abc.com  # abc_siteはルール名、-iは大文字小文字を無視、アクセスするドメイン名
    bcd_site hdr(host) -i www.bcd.com  # www.bcd.comにアクセスするとbcd_siteルールがトリガー
    use_backend abc_servers if abc_site # abc_siteルールがトリガーされた場合、abc_serversにリクエストを分散
    use_backend bcd_servers if bcd_site # bcd_siteルールがトリガーされた場合、bcd_serversにリクエストを分散
    default_backend default_servers    # 条件に該当しない場合はデフォルトのバックエンドに応答

########バックエンド設定##############
backend abc_servers 
    mode http                  # HTTPの7層モード
    balance roundrobin         # balance roundrobinロードバランシング、balance sourceセッション保存、static-rr、leastconn、first、uriなどサポート
    option httpchk /health.html HTTP/1.0 # ヘルスチェック、バックエンドのhealth.htmlにアクセスできない場合は分散しない
    server srv1 192.168.80.133:80 cookie 1 weight 5 check inter 2000 rise 2 fall 3
    server srv2 192.168.80.134:80 cookie 2 weight 3 check inter 2000 rise 2 fall 3
    #cookie 1はserveridを1、check inter 2000はハートビート検出頻度 
    #rise 2は2回成功でサーバーを利用可能、fall 3は3回失敗でサーバーを利用不可、weightは重み

2.3 HAProxyサービスの設定

# cd /usr/local/haproxy/
# mkdir etc
# touch /usr/local/haproxy/etc/haproxy.cfg

2.4 設定ファイル内容

global
        maxconn         2000
        log             127.0.0.1 local0
        uid             1000
        gid             1000
        chroot          /var/empty
        nbproc          4
        daemon
defaults
        log global
        mode http
        maxconn 2000
        option httplog
        option dontlognull
        retries 3
        option redispatch
        timeout connect 5000
        timeout client 50000
        timeout server 50000
frontend web_frontend
    bind        *:80
        mode            http
        log             global
        option          httplog
        option          dontlognull
        option          nolinger
        option          http_proxy
        maxconn         8000
        timeout client  30s
    abc_site hdr_end(host) -i www.abc.com
    bcd_site hdr_end(host) -i www.bcd.com
        use_backend abc_servers if abc_site
        use_backend bcd_servers if bcd_site
        default_backend abc_servers
backend abc_servers
        balance roundrobin
        option httpchk /health.html HTTP/1.0
        server srv1 192.168.80.131:80 cookie 1 check inter 2000 rise 2 fall 3 weight 4
backend bcd_servers
        balance roundrobin
        option httpchk /health.html HTTP/1.0
        server srv1 192.168.80.134:80 cookie 1 check inter 2000 rise 2 fall 3 weight 1

3. HAProxy + Keepalived

環境準備

webサーバー1:192.168.80.131
webサーバー2:192.168.80.134
keepalived+HAProxy(マスター):192.168.80.133
keepalived+HAProxy(スタンバイ):192.168.80.132
仮想IP(VIP):192.168.80.250

3.1 Keepalivedのインストール

# tar -zxvf keepalived-2.0.20.tar.gz
# cd keepalived-2.0.20
# ./configure --prefix=/usr/local/keepalived
# make && make install
# cp keepalived-2.0.20/keepalived/etc/init.d/keepalived /etc/init.d/
# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
# mkdir -p /etc/keepalived
# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/

3.2 Keepalivedの設定

**マスター**
! Keepalived設定ファイル

global_defs {
   router_id haproxy_master
}
vrrp_script check_haproxy {
   script "/data/scripts/check_haproxy.sh"
   interval 2
   weight 2
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.80.250
    }
    track_script {
        check_haproxy
    }
}
**スタンバイ**
! Keepalived設定ファイル

global_defs {
   router_id haproxy_backup
}
vrrp_script check_haproxy {
   script "/data/scripts/check_haproxy.sh"
   interval 2
   weight 2
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.80.250
    }
    track_script {
        check_haproxy
    }
}

3.3 検出スクリプトの作成

# cat /data/scripts/check_haproxy.sh 
#!/bin/bash
# HAProxyプロセスの自動チェック

killall -0 haproxy
if [[ $? -ne 0 ]];then
    /etc/init.d/keepalived stop
fi

3.4 HAProxy設定

# cat /usr/local/haproxy/haproxy.cfg 
global
        maxconn         8000
        log             127.0.0.1 local0
        uid             1000
        gid             1000
        chroot          /var/empty
        daemon
defaults
        log global
        mode http
        maxconn 2000
        option httplog
        option dontlognull
        retries 3
        option redispatch
        timeout connect 5000
        timeout client 50000
        timeout server 50000
frontend web_frontend
    bind        192.168.80.250:80
        mode            http
        log             global
        option          httplog
        option          dontlognull
        maxconn         8000
        stats uri /haproxy_stats
        default_backend app_servers
backend app_servers
        balance roundrobin
        option forwardfor
        option httpchk GET /health.html 
        server srv1 192.168.80.131:80 cookie 1 check inter 2000 rise 2 fall 3 weight 2
        server srv2 192.168.80.134:80 cookie 2 check inter 2000 rise 2 fall 3 weight 1
マスターやスタンバイサーバー上のHAProxy設定は同じで構いません。

タグ: HAProxy ロードバランシング 高可用性 Keepalived TCP/HTTPプロキシ

6月20日 18:15 投稿