share facebook facebook twitter menu hatena pocket slack

2011.11.25 FRI

HAProxy(1.4)でMySQLの自動フェイルオーバーにあわせて接続先を変更

鈴木 宏康

WRITTEN BY 鈴木 宏康

VPC上のEC2(CentOS 6.0)でDRBD(8.3)とHeartbeat(3.0)とMySQL(5.5)の記事で自動フェイルオーバーするMySQLができたので、次は、それに合わせて接続先を変更する仕組みを考えます。

EC2はVPCの場合でも、仮想IPアドレスを利用することができないので、まず、hostsファイルを変更したり、内部DNSをたて、DNSレコードを変更したりして、自動フェイルオーバーに合わせた接続変更(接続ホスト名のIPアドレスを変更)を行う方法を考えると思います。

ただ、上記の方法ではミドルウェアのインストールや設定のみでは完結せず、多少の仕組みの作り込みが必要になってしまうはずです。

今回は、MySQLに接続するサーバには必ずHAProxyをインストールし、アプリケーションはlocalhostのMySQL(HAProxy)に接続し、フェイルオーバーに伴う接続先変更はHAProxyにで行う方法を試してみました。

はじめに、HAProxyのインストールです。

# yum -y install haproxy

haproxy.cfgは下記のようにしました。

# cat /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 /var/lib/haproxy/stats
defaults
    mode                    tcp
    log                     global
    retries                 3
    timeout connect         10s
    timeout client          1m
    timeout server          1m
listen mysql
    bind 0.0.0.0:3306
    mode tcp
    option mysql-check
    balance roundrobin
    server mysql1 suz-lab-ha1:3306 check port 3306
    server mysql2 suz-lab-ha2:3306 check port 3306

ただし、このままですとHAProxyからMySQLへのヘルスチェックで、MySQLがHAProxyからの接続をブロックしてしまうので、MySQLの設定を下記のようにしておきます。

# cat /etc/my.cnf
[mysqld]
...
max_connect_errors=999999999
...

上記のHAProxy経由でMySQLに接続することで、MySQL側をフェイルオーバーさせても、数秒でHAProxyが接続先をフェイルオーバー後のMySQLに変更してくれるので、アプリケーションは問題なくMySQLに接続し続けることができるようになります。

そして、この方法ならミドルウェア(HAProxy)のインストールと設定で、自動フェイルオーバーにあわせた接続先変更が可能です。

この方法が一番いいような気がします。

こちらの記事はなかの人(suz-lab)監修のもと掲載しています。
元記事は、こちら

鈴木 宏康

鈴木 宏康

愛知県生まれ。東京工業大学大学院修士課程修了。在学時より、ベンチャー企業でインターネットに関する業務に携わり、現在はクラウド(主にAmazon Web Services)上での開発・運用を軸とした事業の、業務の中心として活躍。

cloudpack

cloudpackは、Amazon EC2やAmazon S3をはじめとするAWSの各種プロダクトを利用する際の、導入・設計から運用保守を含んだフルマネージドのサービスを提供し、バックアップや24時間365日の監視/障害対応、技術的な問い合わせに対するサポートなどを行っております。
AWS上のインフラ構築およびAWSを活用したシステム開発など、案件のご相談はcloudpack.jpよりご連絡ください。