HAProxyを使ったMySQLの冗長化

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"

                • +
value
                • +
nyar
                • +

[root@cthulhu haproxy-1.4.10]# mysql -h 127.0.0.1 -u haproxy hoge -e "SELECT * FROM fuga"

                  • +
value
                  • +
hastur
                  • +

[root@cthulhu haproxy-1.4.10]# mysql -h 127.0.0.1 -u haproxy hoge -e "SELECT * FROM fuga"

                • +
value
                • +
nyar
                • +

[root@cthulhu haproxy-1.4.10]# mysql -h 127.0.0.1 -u haproxy hoge -e "SELECT * FROM fuga"

                  • +
value
                  • +
hastur
                  • +

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" +--------+

value
                  • +
hastur
                  • +

[root@cthulhu ~]# mysql -h 127.0.0.1 -u haproxy hoge -e "SELECT * FROM fuga"

                  • +
value
                  • +
hastur
                  • +

[root@cthulhu ~]# mysql -h 127.0.0.1 -u haproxy hoge -e "SELECT * FROM fuga"

                  • +
value
                  • +
hastur
                  • +

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"

                  • +
value
                  • +
hastur
                  • +

[root@cthulhu ~]# mysql -h 127.0.0.1 -u haproxy hoge -e "SELECT * FROM fuga"

                • +
value
                • +
nyar
                • +