HAProxyを使ってMySQLを冗長化してみる。
サーバ構成
HAProxyのインストール
wget http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.10.tar.gz
tar xf haproxy-1.4.10.tar.gz
cd haproxy-1.4.10
make TARGET=linux26
make install
cp examples/haproxy.init /etc/init.d/haproxy
chmod 755 /etc/init.d/haproxy
sed -i -r 's|/usr/sbin|/usr/local/sbin|' /etc/init.d/haproxy
useradd -s /sbin/nologin haproxy
mkdir /etc/haproxy
touch /etc/haproxy/haproxy.cfg
HAProxyの設定
こんな感じ。
global
maxconn 500
user haproxy
group haproxy
defaults
contimeout 1000
clitimeout 5000
srvtimeout 5000
retries 1
log 127.0.0.1 local0
listen mysql
bind :3306
mode tcp
balance roundrobin
option mysql-check user haproxy
server hastur 192.168.56.12:3306 check port 3306 inter 1000 fall 1
server nyar 192.168.56.13:3306 check port 3306 inter 1000 fall 1
syslogの設定
HAProxyのログをsyslogで出力するために設定を書き換える。
/etc/sysconfig/syslog
SYSLOGD_OPTIONS="-m 0 -r"
/etc/syslog.conf
# HAProxy
local0.* /var/log/haproxy.log
書き換えたら再起動。
MySQLにヘルスチェック用のユーザを追加
husturとnyarのMySQLにそれぞれ追加する。
mysql> grant all on *.* to 'haproxy'@'%';
動作確認
HAProxyを起動してmysqlコマンドでアクセスすると、コネクションが振り分けられているのが分かる。
[root@cthulhu haproxy-1.4.10]# mysql -h 127.0.0.1 -u haproxy hoge -e "SELECT * FROM fuga"
[root@cthulhu haproxy-1.4.10]# mysql -h 127.0.0.1 -u haproxy hoge -e "SELECT * FROM fuga"
[root@cthulhu haproxy-1.4.10]# mysql -h 127.0.0.1 -u haproxy hoge -e "SELECT * FROM fuga"
[root@cthulhu haproxy-1.4.10]# mysql -h 127.0.0.1 -u haproxy hoge -e "SELECT * FROM fuga"
nyarを落としてみるとhasterにだけアクセスするようになる。
[root@cthulhu ~]# tail -n 1 /var/log/haproxy.log
Dec 4 18:46:20 cthulhu haproxy[2432]: Server mysql/nyar is DOWN, reason: Layer4 connection problem, info: "Connection refused", check duration: 4ms. 1 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
[root@cthulhu ~]# mysql -h 127.0.0.1 -u haproxy hoge -e "SELECT * FROM fuga" +--------+
[root@cthulhu ~]# mysql -h 127.0.0.1 -u haproxy hoge -e "SELECT * FROM fuga"
[root@cthulhu ~]# mysql -h 127.0.0.1 -u haproxy hoge -e "SELECT * FROM fuga"
nyarを起動すると復帰する。
[root@cthulhu ~]# tail -n 1 /var/log/haproxy.log
Dec 4 18:48:59 cthulhu haproxy[2432]: Server mysql/nyar is UP, reason: Layer7 check passed, code: 0, info: "5.0.77", check duration: 227ms. 2 active and 0 backup servers online. 0 sessions requeued, 0 total in queue.
[root@cthulhu ~]# mysql -h 127.0.0.1 -u haproxy hoge -e "SELECT * FROM fuga"
[root@cthulhu ~]# mysql -h 127.0.0.1 -u haproxy hoge -e "SELECT * FROM fuga"