2013年1月10日木曜日

slaveの負荷分散&フェイルオーバー(HAProxy)

前回はmysql-proxyによるslaveの負荷分散でしたが、
今回はHAProxyによる負荷分散&フェイルオーバーを行いたいと思います

・HAProxyとは
一部抜粋
http://dexlab.net/pukiwiki/index.php?Memo%2FLinux%2Fhaproxy
L7ロードバランサ。アプリケーション層のHTTPやSMTP等が対象。
対するL4ロードバランサはネットワーク層のTCP/UDP等が対象
メリット
DB Slave, memcacheノード追加/変更/削除時にアプリケーション側を変更しなくて良い。常にローカル(127.0.0.1:xxxx)へアクセスすれば良い
負荷分散/フェイルオーバー機能を担保してくれるため、アプリ側で実装しなくて良い
上記ノード変更時にサービス停止の可能性が減る
負荷分散/フェイルオーバー機能を持たないソフトでも利用できる場合がある
デメリット
複雑性が一つ増す。単一障害点が一つ増す。(対策:複数台用意する事でリスクを減らす)
・Webのロードバランサーとしても使える。
・Kyoto Tycoonやmemcachedなどの負荷分散として使える。

などなど、mysql-proxyではmysqlのみ?でしたが、
HAProxyは色々な用途に使えるみたいです。

それでは、設定の方を行って行きたいと思います(`・ω・´)ゞビシッ!!
■手順1)haproxyのインストール
# yum install haproxy
Loaded plugins: fastestmirror, priorities
Loading mirror speeds from cached hostfile
 * base: ftp.nara.wide.ad.jp
 * centosplus: ftp.nara.wide.ad.jp
 * elrepo: elrepo.org
 * epel: ftp.riken.jp
 * extras: ftp.nara.wide.ad.jp
 * rpmforge: mirror.fairway.ne.jp
 * updates: ftp.nara.wide.ad.jp
162 packages excluded due to repository priority protections
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package haproxy.x86_64 0:1.4.22-1.el6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

=======================================================================================================================================================================================================================
 Package                                            Arch                                              Version                                                    Repository                                       Size
=======================================================================================================================================================================================================================
Installing:
 haproxy                                            x86_64                                            1.4.22-1.el6                                               epel                                            457 k

Transaction Summary
=======================================================================================================================================================================================================================
Install       1 Package(s)

Total download size: 457 k
Installed size: 1.4 M
Is this ok [y/N]: y
Downloading Packages:
haproxy-1.4.22-1.el6.x86_64.rpm                                                                                                                                                                 | 457 kB     00:00
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : haproxy-1.4.22-1.el6.x86_64                                                                                                                                                                         1/1
  Verifying  : haproxy-1.4.22-1.el6.x86_64                                                                                                                                                                         1/1

Installed:
  haproxy.x86_64 0:1.4.22-1.el6

Complete!


#自動起動設定
chkconfig --add haproxy
#
chkconfig haproxy on
#
/sbin/chkconfig --list haproxy
haproxy         0:off   1:off   2:on    3:on    4:on    5:on    6:off
※yumコマンドでno packagesなどでインストールできない方はepelリポジトリを入れていない方はepelをまず設定してください。
centos 6 64bit版はこちらになります。
#rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-7.noarch.rpm
■手順2)設定ファイルを編集する
セクションはdefaults,frontend,backend,listenがあるそうです。
各セクションの意味は次のようになっています。

defaults: 後述するfrontend、backend、listenのデフォルトパラメータを指定します。
frontend: クライアントからの接続を受け入れるソケットのパラメータを指定します。
backend: プロキシするサーバーに関わるパラメータを指定します。
listen: frontendとbackendを完全にプロキシする設定を記述します。

#デフォルトの設定ファイルのバックアップをとっておく
# mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.20130109
#編集する
# vi /etc/haproxy/haproxy.cfg
#全般設定
global
        #logログの出力先とファシリティの設定(emerg,alert,crit,err,warning,notice,info,debug)
#       log             127.0.0.1 local2
        log             127.0.0.1 local7 debug
        #chrootするパスを指定
        chroot          /var/lib/haproxy
        pidfile         /var/run/haproxy.pid
        #プロセスごとの最大同時接続数
        maxconn         4000
        #サービスを動作させるユーザー名
        user            haproxy
        #サービスを動作させるグループ名
        group           haproxy
        #バックグラウンドで動作する
        daemon
        stats socket /var/lib/haproxy/stats
        #deamonモードで起動するプロセス数
        nbproc          1
#プロキシ動作のデフォルト設定
defaults
        #動作モード
        mode            tcp
        log             global
        #各種動作オプション
        option          tcplog

#frontendセクションで対クライアントの待ち受けポートを指定、
#backendセクションで実サーバ群の設定と負荷分散アルゴリズムを指定する。
#master用
listen mysql-master
        #ローカルからの接続ではなくて外部からの接続を許可する場合には、
        #bind 0.0.0.0:3306
        #bind :3306(コロンの前に何も書かない)
        #bind HAProxyのIPアドレス:3306
        #のどれかにすれば良い?
        #複数指定する場合にはカンマ区切り
        #bind :80,:443みたいに。
        bind HAProxyサーバーのIPアドレス:3306
        #
        mode tcp
        #
        log             127.0.0.1 local0 debug
        #リトライ回数
        retries         1
        #接続タイムアウト
        timeout connect 10s
        #クライアント側のタイムアウト時間
        timeout client  1m
        #サーバ側のタイムアウト時間
        timeout server  1m
        #
        option          mysql-check user haproxy
        #
        server master masterサーバーのIPアドレス check port 3306 inter 1000 fall 3
#slave用
listen  mysql-slave
        #HAProxyのサーバーIPアドレスの指定(ユニークにする)
        #待ち受けるIPアドレス、ポート等を指定
        bind            HAProxyサーバーのIPアドレス:3307
        #
        mode            tcp
        #リトライ回数
        retries         1
        #接続タイムアウト
        timeout connect 10s
        #クライアント側のタイムアウト時間
        #(MySQLで時間のかかる処理をSELECTする場合や、時間のかかるプログラムの処理がある場合には長めにとっておく。
        #MySQLのデフォルト値は8時間になっている。
        timeout client  1m
        #サーバ側のタイムアウト時間
        timeout server  1m
        #
        option          mysql-check user haproxy
        #ヘルスチェック時のアクションが詳細にログに出る
        option          log-health-checks
        #負荷分散アルゴリズム。roundrobin、static-rr、leastconn、source、uri、url_param、hdr、rdp-cookieから選択。
        balance         roundrobin
        #ラウンドロビンの対象サーバーの定義
        #checkはヘルスチェックの有効化
        #interでヘルチェック間隔の指定(ミリ秒)
        #fallは2回ヘルチェックが落ちたら振り分け対象から外す
        #weightは、振り分け時の重み。数値が高いほど振り分けられる可能性が高い。
        server slave1 slave1サーバーのIPアドレス:3306 weight 1 check port 3306 inter 1000 fall 3
        server slave2 slave2サーバーのIPアドレス:3306 weight 1 check port 3306 inter 1000 fall 3
・balanceについて
次のようなものがあるそうです

一部抜粋
http://d.hatena.ne.jp/hrendoh/20120420/1334906858 ロードバランス(backend)
balance
ロードバランスに使用するアルゴリズムを指定します。
HAProxyは非常に強力なロードバランス機能を提供しています。指定しなかった場合のデフォルトはroundrobinです。

・roundrobin
ラウンドロビン、重み付けの機能あり、動的調整あり(サーバーダウンから回復直後に大量リクエストを割が割り当てられないように調整します)、各backendについて最大4128のアクティブサーバーを指定可能。
・static-rr
ラウンドロビン、重み付けの機能あり、動的調整なし、backendサーバーの制限無し。
・leastconn
もっとも接続数が少ないサーバーが割り当てられます。
・source
IP Addressのハッシュ値を元に振り分け。
uri
URIの'?'の前をハッシュし、その値を元に振り分け。つまり、サーバーが停止/起動されない限りは、URIの値が同じなら同じサーバーに振り分けられる。ハッシュするURIの深さや長さなど詳細な設定も可能。
balance uri [len ] [depth ]
・url_param
URIのパラメータにより振り分け、POSTの場合もcheck_postを指定するとPOSTのボディを使用する。 balance url_param [check_post [
・hdr(name)
HTTPヘッダーにより振り分け
・rdp-cookie, rdp-cookie(name): RDPクッキーをハッシュした値により振り分け、nameを指定しない場合は"mstshash"が使用される。
・option forwardfor
backendサーバーへ送られるリクエストに"X-Forwarded-For"ヘッダーを追加します。
HAPorxyはリバースプロキシとして動作するため、各backendサーバーはHAProxyサーバーのIPアドレスをクライアントアドレスとして認識してしまいます。これを解決するために本オプションを利用します。

・weightについて
serverのweightは設定無し、または全て同じ値の場合には均等に振り分けられる?
slave1のweigthを3にして、slave2のweigthを1にした場合には、
3回slave1に接続後に、slave2に1度接続後、またslave1に接続3回みたいな感じになるみたいです。

■手順3)HAProxyを起動する
# /etc/init.d/haproxy start
haproxy を起動中:                                          [  OK  ]
■手順4)HAProxyからのMySQLヘルスチェック用のユーザを追加する

レプリケーション時には、masterで行うこと。
(masterで行えばslaveに同期が取られる)

#MySQLにヘルスチェック用のユーザを追加(接続ホストで制限する用)
mysql> GRANT ALL ON *.* TO 'haproxy'@'HAProxyサーバーのIPアドレス';

#MySQLにヘルスチェック用のユーザを追加(接続ホストの制限無し用)
mysql> GRANT ALL ON *.* TO 'haproxy'@'%';
Query OK, 0 rows affected (0.03 sec)
設定の反映
FLUSH PRIVILEGES;
アカウントの確認
mysql> SELECT user, host, password FROM mysql.user;
+---------+-----------------+-------------------------------------------+
| user    | host            | password                                  |
+---------+-----------------+-------------------------------------------+
| root    | localhost       |                                           |
| root    | 127.0.0.1       |                                           |
| root    | ::1             |                                           |
|         | localhost       |                                           |
| haproxy | %               |                                           |
| repl    | %               | *A424E797037BF97C19A2E88CF7891C5C2038C039 |
+---------+-----------------+-------------------------------------------+
作成したアカウントを削除する場合
#権限削除
REVOKE ALL ON *.* FROM 'haproxy'@'HAProxyサーバーのIPアドレス';
#アカウント削除
DELETE FROM mysql.user WHERE USER LIKE 'haproxy' AND HOST LIKE 'HAProxyサーバーのIPアドレス';

#設定の反映
FLUSH PRIVILEGES;
また、HAProxyを利用することで、MySQLへの接続元がHAProxyサーバーに変わるため、
もし接続元に制限をかけている場合には、
今まで利用していた接続ユーザーに追加で設定してあげること。
HAProxyは、slave用なので、SELECTの権限だけあれば(・∀・)イイアルネ!!

たとえば、今まで利用していた接続アカウントが「test」で、
HAProxyサーバーのIPアドレスが「192.168.0.10」だった場合には、次のようになります。
#ローカルIPアドレス全てからの接続を許可して、全てのデータベースに対してSELECT権限だけ付与する場合
GRANT SELECT ON *.* TO 'test'@'192.168.0.%' IDENTIFIED BY 'test-password';

#192.168.0.10からの接続のみを許可して、test_dbのデータベースに対してSELECT、INSERT、UPDATEの権限だけ付与する場合
GRANT SELECT, INSERT, UPDATE ON test_db.* TO 'test'@'192.168.0.10' IDENTIFIED BY 'test-password';

#ローカルIPアドレス全てからの接続を許可して、全てのデータベースに対して全ての権限を付与する場合
GRANT ALL ON *.* TO 'test_account'@'192.168.180.%' IDENTIFIED BY 'test-password';
追加したら設定の反映を忘れずに!(`・ω・´)シャキーン
FLUSH PRIVILEGES;
■手順5)HAProxy経由でmasterへ接続を試す。
/etc/haproxy/haproxy.cfgの設定ファイルで、
ポート番号3306をmasterへの接続としたので、3306で接続する
#
mysql -u haproxy -h HAProxyサーバーのIPアドレス -P 3306

#
mysql> show processlist;
+----+-------------+----------------------------+------+---------+-------+-----------------------------------------------------------------------------+------------------+
| Id | User        | Host                       | db   | Command | Time  | State                                                                       | Info             |
+----+-------------+----------------------------+------+---------+-------+-----------------------------------------------------------------------------+------------------+
|  3 | system user |                            | NULL | Connect | 16438 | Waiting for master to send event                                            | NULL             |
|  4 | system user |                            | NULL | Connect |    88 | Slave has read all relay log; waiting for the slave I/O thread to update it | NULL             |
|  5 | root        | localhost                  | NULL | Sleep   |   195 |                                                                             | NULL             |
|  9 | haproxy     | *****.***.******.***:57528 | NULL | Query   |     0 | NULL                                                                        | show processlist |
+----+-------------+----------------------------+------+---------+-------+-----------------------------------------------------------------------------+------------------+

#関連付けされているslave一覧を表示する。
#slaveサーバーのmy.cnfでreport_hostが設定されている場合だけ表示される。
#report_hostが設定されていない場合には、show master status;で確認する
mysql> show slave hosts;
+-----------+---------+------+-----------+
| Server_id | Host    | Port | Master_id |
+-----------+---------+------+-----------+
|        20 | slave20 | 3306 |        10 |
|        30 | slave30 | 3306 |        10 |
+-----------+---------+------+-----------+
2 rows in set (0.00 sec)
■手順6)HAProxy経由でsalveへ接続を試す前に、どちらに接続されたか確認用のアカウント作る・・・orz
どちらのslaveにつながっているか確認する為に、
あまり良くないと思いますが、面倒なので個々のslaveに接続して直接接続アカウントを作ってしまいます。シーッ! d( ゚ε゚;)

slaveに直接アカウントを作ってしまうので、
レプリケーションされずに、個々のslave固有の接続アカウントになります。
#slave1で実行する
mysql> GRANT ALL ON *.* TO 'slave1'@'%';

#設定の反映
FLUSH PRIVILEGES;

#slave2で実行する
mysql> GRANT ALL ON *.* TO 'slave2'@'%';
Query OK, 0 rows affected (0.03 sec)

#設定の反映
FLUSH PRIVILEGES;
■手順7)HAProxy経由でsalveへ接続を試す
ユーザー一覧で、slave1という名前があったらslave1に繋がっていて、
slave2という名前があったらslave2に繋がっていることになります。

HAProxyの設定で、slaveの接続はポート番号3307と定義していあるので、
次のようにポート番号を指定して接続する。
#slaveへ接続を試す。
mysql -u haproxy -h HAProxyサーバーのIPアドレス -P 3307

#ユーザー一覧を取得する
mysql> SELECT user, host, password FROM mysql.user;
+---------+-----------------+-------------------------------------------+
| user    | host            | password                                  |
+---------+-----------------+-------------------------------------------+
| root    | localhost       |                                           |
| root    | 127.0.0.1       |                                           |
| root    | ::1             |                                           |
|         | localhost       |                                           |
| haproxy | %               |                                           |
| slave1  | %               |                                           |
| repl    | %               | *A424E797037BF97C19A2E88CF7891C5C2038C039 |
+---------+-----------------+-------------------------------------------+
接続されている状態で、別のコンソールを立ち上げて、同じ手順で接続をしてみる。
(別のコンソールを立ち上げなくても良いかも?)
#別のコンソールからslaveへ接続を試す。
mysql -u haproxy -h HAProxyサーバーのIPアドレス -P 3307

mysql> SELECT user, host, password FROM mysql.user;
+---------+-----------------+-------------------------------------------+
| user    | host            | password                                  |
+---------+-----------------+-------------------------------------------+
| root    | localhost       |                                           |
| root    | 127.0.0.1       |                                           |
| root    | ::1             |                                           |
|         | localhost       |                                           |
| haproxy | %               |                                           |
| slave2  | %               |                                           |
| repl    | %               | *A424E797037BF97C19A2E88CF7891C5C2038C039 |
+---------+-----------------+-------------------------------------------+
負荷分散(゚∀゚)キタコレ!!

■手順8)ログの設定を行う。
HAProxyはログをsyslogに出力するそうなので、
syslog,syslog-ng,rsyslogのどれかでログの設定を行う必要我あります。

今回はsyslog-ngを使いたいと思いますので、
syslog-ng,syslog-ng-devel,syslog-ng-libdbiをインストールします。

syslog-ngではなくて、
syslogの設定の場合にはこちらこちら
rsyslogの設定の場合にはこちらを参考すると良いかもです!
#syslog-ng,syslog-ng-devel,syslog-ng-libdbiをインストールする
# yum install syslog-ng*
設定ファイルを編集
次の行を最後に追加する。
vi /etc/syslog-ng/syslog-ng.conf
#HAProxy
source s_all {
       udp();                    # remote logs arriving at 514/udp
       unix-stream("/dev/log");  # local system logs
       file("/proc/kmsg");       # local kernel logs
       internal();               # internal syslog-ng logs
};

destination df_haproxy { file("/var/log/haproxy.log"); };

filter f_haproxy { facility(local7); };

log {
        source(s_all);
        filter(f_haproxy);
        destination(df_haproxy);
};
再起動を行う
#構文エラーチェック
syslog-ng -s

# /etc/init.d/syslog-ng restart
syslog-ng を停止中:                                        [  OK  ]
syslog-ng を起動中:                                        [  OK  ]
■手順9)ログローテートを設定する
あれ、何かいつの間にかローテートの設定ファイルがあるけど・・・:(;゙゚'ω゚'):
#編集
vi /etc/logrotate.d/haproxy
/var/log/haproxy.log {
    daily
    rotate 10
    missingok
    notifempty
    compress
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
        /bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}
■手順9)負荷分散が行われているか確認する。
#slave2を停止してみる。
# /etc/init.d/mysqld stop
mysqld を停止中:                                           [  OK  ]


#slave2が落ちた時のログ
view /var/log/haproxy.log
Jan 10 13:20:38 127.0.0.1 haproxy[9616]: Health check for server mysql-slave/slave2 failed, reason: Layer4 connection problem, info: "Connection refused", check duration: 5ms, status: 2/3 UP.
Jan 10 13:20:40 127.0.0.1 haproxy[9616]: Health check for server mysql-slave/slave2 failed, reason: Layer4 connection problem, info: "Connection refused", check duration: 0ms, status: 1/3 UP.
Jan 10 13:20:42 127.0.0.1 haproxy[9616]: Health check for server mysql-slave/slave2 failed, reason: Layer4 connection problem, info: "Connection refused", check duration: 0ms, status: 0/2 DOWN.
Jan 10 13:20:42 127.0.0.1 haproxy[9616]: Server mysql-slave/slave2 is DOWN. 1 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
Jan 10 13:21:02 127.0.0.1 haproxy[9616]: masterサーバーのIPアドレス:33209 [10/Jan/2013:13:20:58.475] mysql-slave mysql-slave/slave1 0/0/3944 686 -- 0/0/0/0/0 0/0
Jan 10 13:22:04 127.0.0.1 haproxy[9616]: masterサーバーのIPアドレス:34120 [10/Jan/2013:13:21:03.855] mysql-slave mysql-slave/slave1 0/0/61026 686 cD 0/0/0/0/0 0/0

#何度か接続を試すが、slave1にしか繋がらないことを確認する
mysql -u haproxy -h HAProxyサーバーのIPアドレス -P 3307

mysql> SELECT user, host, password FROM mysql.user;
+---------+-----------------+-------------------------------------------+
| user    | host            | password                                  |
+---------+-----------------+-------------------------------------------+
| root    | localhost       |                                           |
| root    | 127.0.0.1       |                                           |
| root    | ::1             |                                           |
|         | localhost       |                                           |
| haproxy | %               |                                           |
| slave1  | %               |                                           |
| repl    | %               | *A424E797037BF97C19A2E88CF7891C5C2038C039 |
+---------+-----------------+-------------------------------------------+

#slave2が復旧時のログ
view /var/log/haproxy.log
Jan 10 14:10:57 127.0.0.1 haproxy[9616]: Health check for server mysql-slave/slave2 succeeded, reason: Layer7 check passed, code: 0, info: "5.5.28-log", check duration: 6ms, status: 1/2 DOWN.
Jan 10 14:10:59 127.0.0.1 haproxy[9616]: Health check for server mysql-slave/slave2 succeeded, reason: Layer7 check passed, code: 0, info: "5.5.28-log", check duration: 2ms, status: 3/3 UP.
Jan 10 14:10:59 127.0.0.1 haproxy[9616]: Server mysql-slave/slave2 is UP. 2 active and 0 backup servers online. 0 sessions requeued, 0 total in queue.
復旧後に再度接続を試してみるとちゃんとslave1,slave2に接続される。

HAProxyがslaveが落ちたかヘルスチェックを行っている際に、
接続しようとすると次のエラーが発生するようです(´;ω;`)ウッ…
#落ちているslaveに接続しようとしたときのログ
mysql -u haproxy -h HAProxyサーバーのIPアドレス -P 3307
ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0
またslaveが全て落ちてしまうと次のようなエラーが発生していました。
#slaveが全部落ちてしまった時のログ
view /var/log/haproxy.log
Jan 10 14:16:34 127.0.0.1 haproxy[9616]: Server mysql-slave/slave2 is DOWN. 0 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
Jan 10 14:16:34 127.0.0.1 haproxy[9616]: proxy mysql-slave has no server available!
■手順10)フェイルオーバーが行われているか確認する。(バックアップサーバーを設定する)

仮にslaveサーバーが全て落ちてしまった場合に、
masterに接続されるようにしたい!とかの場合にbackupオプションが使えます。

listenセクションに書いたmysql-slaveのserver情報にmasterの情報を設定します。
その際に、最後に「backup」と記述することで、
普段はslave1,slave2にしか振り分けられないけど、
この2つが落ち場合にbakupで指定されたサーバーに振り分けられるそうです。
#設定ファイルを編集
vi /etc/haproxy/haproxy.cfg

#slave用
listen  mysql-slave
        #ラウンドロビンの対象サーバーの定義
        #checkはヘルスチェックの有効化
        server slave1 slave1サーバーのIPアドレス:3306 check port 3306 inter 10000 fall 2
        server slave2 slave2サーバーのIPアドレス:3306 check port 3306 inter 10000 fall 2
        #追加
        server slave2 masterサーバーのIPアドレス:3306 check port 3306 backup

#haproxyの再起動
/etc/init.d/haproxy restart
haproxy を停止中:                                          [  OK  ]
haproxy を起動中:                                          [  OK  ]

#slaveが全部落ちてしまった際にbackupサーバーが1つあったときのログ
view /var/log/haproxy.log
Jan 10 14:30:06 127.0.0.1 haproxy[11087]: Health check for server mysql-slave/slave1 failed, reason: Layer4 connection problem, info: "Connection refused", check duration: 0ms, status: 0/2 DOWN.
Jan 10 14:30:06 127.0.0.1 haproxy[11087]: Server mysql-slave/slave1 is DOWN. 1 active and 1 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
Jan 10 14:30:06 127.0.0.1 haproxy[11087]: Health check for server mysql-slave/slave2 failed, reason: Layer4 connection problem, info: "Connection refused", check duration: 0ms, status: 0/2 DOWN.
Jan 10 14:30:06 127.0.0.1 haproxy[11087]: Server mysql-slave/slave2 is DOWN. 0 active and 1 backup servers left. Running on backup. 0 sessions active, 0 requeued, 0 remaining in queue.
Jan 10 14:30:07 127.0.0.1 haproxy[11087]: Health check for backup server mysql-slave/slave2 succeeded, reason: Layer7 check passed, code: 0, info: "5.5.27-log", check duration: 2ms, status: 3/3 UP.

#slave1,slave2が落ちてる状態で接続を試してみる。
$ mysql -u haproxy -h HAProxyサーバーのIPアドレス -P 3307

#slaveには接続されていないので表示されない
mysql> show slave status\G
Empty set (0.00 sec)

#masterに接続されているので表示される
mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000022 |      107 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

これ(・∀・)イイネ!!
#slave1を起動してみる
# /etc/init.d/mysqld start
mysqld を起動中:                                           [  OK  ]

#再度接続を試すと、slave1にしか繋がらない。(masterはまたバックアップとして待機される)
mysql -u haproxy -h HAProxyサーバーのIPアドレス -P 3307

#
mysql> SELECT user, host, password FROM mysql.user;
+---------+-----------------+-------------------------------------------+
| user    | host            | password                                  |
+---------+-----------------+-------------------------------------------+
| root    | localhost       |                                           |
| root    | 127.0.0.1       |                                           |
| root    | ::1             |                                           |
|         | localhost       |                                           |
| haproxy | %               |                                           |
| slave1  | %               |                                           |
| repl    | %               | *A424E797037BF97C19A2E88CF7891C5C2038C039 |
+---------+-----------------+-------------------------------------------+


#slave2を起動してみる
# /etc/init.d/mysqld start
mysqld を起動中:                                           [  OK  ]

#再度接続を試すと、slave1,slave2に繋がるようになる。(masterはまたバックアップとして待機される)
mysql -u haproxy -h HAProxyサーバーのIPアドレス -P 3307

#
mysql> SELECT user, host, password FROM mysql.user;
+---------+-----------------+-------------------------------------------+
| user    | host            | password                                  |
+---------+-----------------+-------------------------------------------+
| root    | localhost       |                                           |
| root    | 127.0.0.1       |                                           |
| root    | ::1             |                                           |
|         | localhost       |                                           |
| haproxy | %               |                                           |
| slave2  | %               |                                           |
| repl    | %               | *A424E797037BF97C19A2E88CF7891C5C2038C039 |
+---------+-----------------+-------------------------------------------+
■手順11)動作の確認が終わったらslaveの接続確認用のアカウントを削除する
#slave1で実行する
#権限削除
REVOKE ALL ON *.* FROM 'slave1'@'%';
#アカウント削除
DELETE FROM mysql.user WHERE USER LIKE 'slave1' AND HOST LIKE '%';

#設定の反映
FLUSH PRIVILEGES;

#slave2で実行する

#権限削除
REVOKE ALL ON *.* FROM 'slave2'@'%';
#アカウント削除
DELETE FROM mysql.user WHERE USER LIKE 'slave2' AND HOST LIKE '%';

#設定の反映
FLUSH PRIVILEGES;
■HAProxyの再起動をせずに、設定ファイルの読み込みし直す方法
次のやり方で既存の接続を落とすことなく、
新しい設定で起動した haproxy に動作を引き継ぐことができる。
(起動中のまま設定ファイルの再読み込みを行う)
#既に動いているhaproxyのpidを確認
# cat /var/run/haproxy.pid
8811
#-sfの後ろに先程確認した数値を設定して実行する
/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -sf 8811
実行するとログには次のように表示される(゚д゚)(。_。)(゚д゚)(。_。) ウンウン ※Pausing proxy mysql-slave以下
Mar 18 17:53:01 127.0.0.1 haproxy[32234]: 192.168.0.1:59932 [18/Mar/2013:17:53:01.778] mysql-slave mysql-slave/slave1 1/0/188 1943 -- 1/1/1/1/0 0/0
Mar 18 17:53:01 127.0.0.1 haproxy[32234]: 192.168.0.1:59933 [18/Mar/2013:17:53:01.779] mysql-slave mysql-slave/slave1 1/0/215 1855 -- 0/0/0/0/0 0/0
Mar 18 17:53:14 127.0.0.1 haproxy[32234]: Pausing proxy mysql-slave.
Mar 18 17:53:14 127.0.0.1 haproxy[24508]: Proxy mysql-slave started.
Mar 18 17:53:14 127.0.0.1 haproxy[32234]: Stopping proxy mysql-slave in 0 ms.
Mar 18 17:53:14 127.0.0.1 haproxy[32234]: Proxy mysql-slave stopped (FE: 40236 conns, BE: 40236 conns).
Mar 18 17:53:14 127.0.0.1 haproxy[24508]: Health check for server mysql-slave/db02 succeeded, reason: Layer7 check passed, code: 0, info: "5.5.30-log", check duration: 1ms, status: 3/3 UP.
Mar 18 17:53:36 127.0.0.1 haproxy[24509]: 192.168.0.1:59939 [18/Mar/2013:17:53:36.008] mysql-slave mysql-slave/db02 1/0/265 15676 -- 1/1/1/1/0 0/0

以上です(`・ω・´)ゞビシッ!! 使ってみた感想ですが、mysql-proxyよりかこっちの方が便利なのかな~?と感じました。

今回はslaveの負荷分散&フェイルオーバーのみでしたが、
HAProxyを使い自動でslaveをmasterに昇格する方法で、DeNAのモバゲーなどでも使われている
「MySQL-MHA」という方法などもあるそうです。
こちらもそのうち試したいと思います!(`・ω・´)シャキーン

参考URL

0 件のコメント:

コメントを投稿