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設定は同じで構いません。