MySQLのロードバランサーとしては、LVS (KeepAlived)が有名ですが、AWS上でこれを設定するのは困難なので、Haproxyでロードバランシングが実現できるか検証する。。っていうか出来たので、作業ログになるかな。
HAPROXYのインストール
インストール
# yum install haproxy
haproxy.x86_64 1.4.22-5.3.amzn1 amzn-main
MySQLのインストール
yum --enablerepo=wing install mysql55 mysql55-server
MySQLの開始
# /etc/init.d/mysqld start
MySQLの停止
# /etc/init.d/mysqld stop
# /sbin/chkconfig mysqld off
ログ出力設定
# vi /etc/rsyslog.conf
--- 以下を追記
$ModLoad imudp
$UDPServerRun 514
# haproxy setting
local2.* /var/log/haproxy.log
---
rsyslogの再起動
# /etc/init.d/rsyslog restart
対象のDBサーバすべてに、HAPROXY用監視ユーザーを作成する(作成済みの場合は作業の必要はありません)
$ mysql -u root -prootpasswd -h [対象のホスト名] -e "grant usage on *.* to 'haproxy'@'%';"
HAPROXY 設定ファイル編集
# cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
# vi /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /tmp/haproxy-cli.sock user root group wheel level admin
stats maxconn 1
stats timeout 120s
defaults
mode tcp
log global
retries 3
timeout connect 10s
timeout client 1m
timeout server 1m
timeout check 10s
maxconn 3000
listen mysql
bind 0.0.0.0:3306
mode tcp
option mysql-check user haproxy
# ラウンドロビン方式での振り分け。こちらは重み付けも可能で、他には
# static-rr、leastconn、source等色々用意されている。
balance roundrobin
# server ホスト名 IP:Port check inter 2000 fall 2
# WebサーバのIPとPortを指定。checkはヘルスチェックの有効化でinter
# でヘルチェック間隔の指定。単位はミリ秒なので今回は2秒。fallは2回
# ヘルチェックが落ちたら振り分け対象から切り離すという意味。
server read1 ip-10-XXX-166-XXX.ap-northeast-1.compute.internal:3306 check port 3306 inter 2000 fall 5
server read2 ip-10-XXX-131-XXX.ap-northeast-1.compute.internal:3306 check port 3306 inter 2000 fall 5
# server master xxx.xxxx.xxx:3306 check port 3306 backup
HAPROXYの開始
# /etc/init.d/haproxy start
Haproxy コマンドラインツールのインストール
# yum install socat
動作確認
情報の確認
# echo "show info" | socat stdio /tmp/haproxy-cli.sock
Name: HAProxy
Version: 1.4.22
Release_date: 2012/08/09
Nbproc: 1
Process_num: 1
Pid: 18311
Uptime: 0d 0h15m56s
Uptime_sec: 956
Memmax_MB: 0
Ulimit-n: 8005
Maxsock: 8005
Maxconn: 4000
Maxpipes: 0
CurrConns: 1
PipesUsed: 0
PipesFree: 0
Tasks: 3
Run_queue: 1
node: ip-10-134-207-147
description:
ステータスの確認
# echo "show stat" | socat stdio /tmp/haproxy-cli.sock
# pxname,svname,qcur,qmax,scur,smax,slim,stot,bin,bout,dreq,dresp,ereq,econ,eresp,wretr,wredis,status,weight,act,bck,chkfail,chkdown,lastchg,downtime,qlimit,pid,iid,sid,throttle,lbtot,tracked,type,rate,rate_lim,rate_max,check_status,check_code,check_duration,hrsp_1xx,hrsp_2xx,hrsp_3xx,hrsp_4xx,hrsp_5xx,hrsp_other,hanafail,req_rate,req_rate_max,req_tot,cli_abrt,srv_abrt,
mysql,FRONTEND,,,0,1,3000,27,4375,10696,0,0,0,,,,,OPEN,,,,,,,,,1,1,0,,,,0,0,0,2,,,,,,,,,,,0,0,0,,,
mysql,read1,0,0,0,1,,14,2279,5644,,0,,0,0,0,0,UP,1,1,0,0,0,1061,0,,1,1,1,,14,,2,0,,1,L7OK,0,1,,,,,,,0,,,,0,0,
mysql,read2,0,0,0,1,,13,2096,5052,,0,,0,0,0,0,UP,1,1,0,0,0,1061,0,,1,1,2,,13,,2,0,,1,L7OK,0,33,,,,,,,0,,,,0,0,
mysql,BACKEND,0,0,0,1,3000,27,4375,10696,0,0,,0,0,0,0,UP,2,2,0,,0,1061,0,,1,1,0,,27,,1,0,,2,,,,,,,,,,,,,,0,0,
重みの確認
# echo " get weight mysql/read1" | socat stdio /tmp/haproxy-cli.sock
1 (initial 1)
# echo " get weight mysql/read2" | socat stdio /tmp/haproxy-cli.sock
1 (initial 1)
コマンドラインからの設定
重みを設定する
# echo " set weight mysql/read1 50" | socat stdio /tmp/haproxy-cli.sock
# echo " set weight mysql/read2 50" | socat stdio /tmp/haproxy-cli.sock
# echo " get weight mysql/read1" | socat stdio /tmp/haproxy-cli.sock
50 (initial 1)
# echo " get weight mysql/read2" | socat stdio /tmp/haproxy-cli.sock
50 (initial 1)
read2のサーバをメンテナンスモードにする
# echo " disable server mysql/read2" | socat stdio /tmp/haproxy-cli.sock
# echo "show stat" | socat stdio /tmp/haproxy-cli.sock
# pxname,svname,qcur,qmax,scur,smax,slim,stot,bin,bout,dreq,dresp,ereq,econ,eresp,wretr,wredis,status,weight,act,bck,chkfail,chkdown,lastchg,downtime,qlimit,pid,iid,sid,throttle,lbtot,tracked,type,rate,rate_lim,rate_max,check_status,check_code,check_duration,hrsp_1xx,hrsp_2xx,hrsp_3xx,hrsp_4xx,hrsp_5xx,hrsp_other,hanafail,req_rate,req_rate_max,req_tot,cli_abrt,srv_abrt,
mysql,FRONTEND,,,0,1,3000,27,4375,10696,0,0,0,,,,,OPEN,,,,,,,,,1,1,0,,,,0,0,0,2,,,,,,,,,,,0,0,0,,,
mysql,read1,0,0,0,1,,14,2279,5644,,0,,0,0,0,0,UP,50,1,0,0,0,1985,0,,1,1,1,,14,,2,0,,1,L7OK,0,11,,,,,,,0,,,,0,0,
mysql,read2,0,0,0,1,,13,2096,5052,,0,,0,0,0,0,MAINT,50,1,0,0,1,9,9,,1,1,2,,13,,2,0,,1,L7OK,0,1,,,,,,,0,,,,0,0,
mysql,BACKEND,0,0,0,1,3000,27,4375,10696,0,0,,0,0,0,0,UP,50,1,0,,0,1985,0,,1,1,0,,27,,1,0,,2,,,,,,,,,,,,,,0,0,