HAProxyでフェイルオーバー/負荷分散 †
L7ロードバランサ。アプリケーション層のHTTPやSMTP等が対象。
対するL4ロードバランサはネットワーク層のTCP/UDP等が対象
- メリット
- DB Slave, memcacheノード追加/変更/削除時にアプリケーション側を変更しなくて良い。常にローカル(127.0.0.1:xxxx)へアクセスすれば良い
- 負荷分散/フェイルオーバー機能を担保してくれるため、アプリ側で実装しなくて良い
- 上記ノード変更時にサービス停止の可能性が減る
- 負荷分散/フェイルオーバー機能を持たないソフトでも利用できる場合がある
- デメリット
- 複雑性が一つ増す。単一障害点が一つ増す。(対策:複数台用意する事でリスクを減らす)
- 注意
- 起動時にDNS名前解決を行いIPアドレスをキャッシュするので、ELBのように動的にIPアドレスが変わる場合は変更を通知する仕組みが必要
サービスを止めずに設定の再読み込み †
一時的に設定を無効にする †
muninでの監視 †
インストール †
- /etc/haproxy/haproxy.cfg
- logはnoticeにしないと、延々と「Connect from ...」が出る
- 対象サービスが停止しているとコンソールにもログが出る
- 「hostXX」の部分をホスト名やIPアドレスに書き換える
- haproxyの先のapacheのアクセスログにはロードバランサのIPアドレスが記録されるが、元IPを記録したい場合はmod_rpafを使う
- httpのヘルスチェック用に「/check.html」を作っておく
- memcache:使用しないほうが良い。全キャッシュサーバが落ちてもMemcache::connect()はtrueが返ってくる。memcaheはキーのハッシュを元にサーバを決める。通常Memcache::addServer()で2台追加した場合、同一キーのキャッシュは2回目でヒットするし、容量も2倍使える。haproxyのroundrobinだとキャッシュがヒットするには最悪4アクセスかかるし、容量も1台と同じ。「balance source」なら同一IPは同じサーバを使うので2回目でヒットする。
global
log 127.0.0.1 local1 notice
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 10000
user haproxy
group haproxy
daemon
quiet # Do not display any message during startup.
stats socket /var/lib/haproxy/stats
defaults
mode tcp
log global
retries 3
timeout connect 10s
timeout client 1m
timeout server 1m
listen http
disabled
bind 0.0.0.0:80
mode http
option httpchk GET /check.html HTTP/1.0
option log-health-checks
option forwardfor # Enable insertion of the X-Forwarded-For header to requests sent to servers.
option redispatch # Enable or disable session redistribution in case of connection failure.
option httplog # Enable logging of HTTP request, session state and timers.
# option httpclose # KeepAlive Off
balance roundrobin
server http01 host01:80 check inter 5s fall 2
server http02 host02:80 check inter 5s fall 2
listen mysql-master
# disabled
bind 0.0.0.0:3306
mode tcp
option mysql-check
balance roundrobin
server mysql01 host01:3306 check port 3306
listen mysql-slave
# disabled
bind 0.0.0.0:3307
mode tcp
option mysql-check
balance roundrobin
server mysql02 host02:3306 check port 3306
server mysql03 host03:3306 check port 3306
listen memcache
disabled
bind 0.0.0.0:11211
mode tcp
balance source
server memcache01 host01:11211 check port 11211
server memcache02 host02:11211 check port 11211