2013年1月8日火曜日

slaveの負荷分散(MySQL Proxy)

今回はレプリケーション環境にて、slaveのロードバランサー用にmysql-proxyを導入してみました。
mysql-proxy自体には、更新系と参照系のクエリをそれぞれマスタとスレーブに振り分けて負荷分散する、
R/W Splittingと呼ばれるものがあるそうですが、バグなどがありまだ動作が確実じゃない?みたいなので、
今回はアプリ側からslaveを参照するときだけmysql-proxyを経由して接続し、
負荷分散を行い用途に利用しました。

構成的には、web1台、master1台、slave2台、mysql-proxy用のサーバー1台の計5台構成のサーバーで設定を行いました。
(web,master,slave1,slave2,mysql-proxy)

負荷分散の仕組みとしては、HAProxyを利用したやり方もあります。
HAProxyはこちらに書いてあります。
こっちの方がフェイルオーバーなども簡単に行えるので便利かもしれません。

■手順1)mysql-proxyの依存関係のlibevent, glib, Luaをインストールする。
#luaが入ってるか確認
# yum list installed lua
Installed Packages
lua.x86_64                 5.1.4-4.1.el6                   installed

#glibが入ってるか確認
# yum list installed glib
Error: No matching Packages to list

#glibのインストール
# yum install glib
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.kddilabs.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 glib.x86_64 1:1.2.10-33.el6.rf will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================================================================================================================================
 Package                                  Arch                                       Version                                                 Repository                                    Size
================================================================================================================================================================================================
Installing:
 glib                                     x86_64                                     1:1.2.10-33.el6.rf                                      rpmforge                                     240 k

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

Total download size: 240 k
Installed size: 749 k
Is this ok [y/N]: y
Downloading Packages:
glib-1.2.10-33.el6.rf.x86_64.rpm                                                                                                                                         | 240 kB     00:00
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : 1:glib-1.2.10-33.el6.rf.x86_64                                                                                                                                               1/1
  Verifying  : 1:glib-1.2.10-33.el6.rf.x86_64                                                                                                                                               1/1

Installed:
  glib.x86_64 1:1.2.10-33.el6.rf

Complete!
#

#libeventが入ってるか確認
# yum list installed libevent
Error: No matching Packages to list

#libeventのインストール
# yum install libevent
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.kddilabs.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 libevent.x86_64 0:1.4.13-4.el6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================================================================================================================================
 Package                                       Arch                                        Version                                              Repository                                 Size
================================================================================================================================================================================================
Installing:
 libevent                                      x86_64                                      1.4.13-4.el6                                         base                                       66 k

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

Total download size: 66 k
Installed size: 227 k
Is this ok [y/N]: y
Downloading Packages:
libevent-1.4.13-4.el6.x86_64.rpm                                                                                                                                         |  66 kB     00:00
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : libevent-1.4.13-4.el6.x86_64                                                                                                                                                 1/1
  Verifying  : libevent-1.4.13-4.el6.x86_64                                                                                                                                                 1/1

Installed:
  libevent.x86_64 0:1.4.13-4.el6

Complete!


■手順2)mysql-proxyのソースをダウンロードする(σ・∀・)σゲッツ!!
ここからダウンロードが行えます

#ダウンロード
# wget http://dev.mysql.com/get/Downloads/MySQL-Proxy/mysql-proxy-0.8.3-linux-rhel5-x86-64bit.tar.gz/from/http://cdn.mysql.com/
--2013-01-07 20:44:12--  http://dev.mysql.com/get/Downloads/MySQL-Proxy/mysql-proxy-0.8.3-linux-rhel5-x86-64bit.tar.gz/from/http://cdn.mysql.com/
dev.mysql.com をDNSに問いあわせています... 137.254.60.11
dev.mysql.com|137.254.60.11|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 302 Found
場所: http://cdn.mysql.com/Downloads/MySQL-Proxy/mysql-proxy-0.8.3-linux-rhel5-x86-64bit.tar.gz [続く]
--2013-01-07 20:44:13--  http://cdn.mysql.com/Downloads/MySQL-Proxy/mysql-proxy-0.8.3-linux-rhel5-x86-64bit.tar.gz
cdn.mysql.com をDNSに問いあわせています... 210.149.135.22, 210.149.135.77
cdn.mysql.com|210.149.135.22|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 8639542 (8.2M) [application/x-tar-gz]
`mysql-proxy-0.8.3-linux-rhel5-x86-64bit.tar.gz' に保存中

100%[======================================================================================================================================================>] 8,639,542   6.00M/s 時間 1.4s

2013-01-07 20:44:14 (6.00 MB/s) - `mysql-proxy-0.8.3-linux-rhel5-x86-64bit.tar.gz' へ保存完了 [8639542/8639542]
ダウンロードしたソースをインストールする。
/usr/local/にインストールします。

#解凍(mysql-proxy-0.8.3-linux-rhel5-x86-64bitのディレクトリが作られる)
# tar xvzf mysql-proxy-0.8.3-linux-rhel5-x86-64bit.tar.gz

#移動
# mv mysql-proxy-0.8.3-linux-rhel5-x86-64bit /usr/local/

#シンボリックリンクを張る
# ln -s /usr/local/mysql-proxy-0.8.3-linux-rhel5-x86-64bit /usr/local/bin/mysql-proxy

#シンボリックリンクの確認
# ll /usr/local/bin/
lrwxrwxrwx 1 root root 50  1月  8 11:43 2013 mysql-proxy -> /usr/local/mysql-proxy-0.8.3-linux-rhel5-x86-64bit
インストール完了(`・ω・´)シャキーン
■手順3)mysql-proxyの設定を行う
#
vi /usr/local/bin/mysql-proxy/mysql-proxy.cnf
[mysql-proxy]
#
daemon = true
#
pid-file = /var/run/mysql-proxy.pid
#ログファイルの場所
log-file = /var/log/mysql-proxy.log
#ログに表示するレベル(error|warning|info|message|debug)
log-level = debug

#MySQL ProxyのIP Address(HOST名:ポート番号の形式で記述する)
#ポート番号はデフォルトTCPの4040
#IPアドレスにグローバルアドレスを利用する場合には、iptablesなどで接続元の制限をしておいた方が(・∀・)イイ!!
proxy-address = ***.***.***.***:4040

#database server(HOST名:ポート番号の形式で記述する。複数書く場合にはカンマ区切りで記述する。複数書くとラウンドロビンでロードバランスされる)
proxy-backend-addresses=***.***.***.**:3306,***.***.***.**:3306

#使用するlua。必要なければコメントアウト。
proxy-lua-script = /usr/local/bin/mysql-proxy/share/doc/mysql-proxy/histogram.lua

#設定ファイルに権限を与える
chmod 0660 /usr/local/bin/mysql-proxy/mysql-proxy.cnf
■手順4)起動してみる。
#実行
/usr/local/bin/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/bin/mysql-proxy/mysql-proxy.cnf

#プロセスの確認
# ps aux|grep -i [m]ysql-proxy
root      4896  0.0  0.0  45616  1712 ?        S    13:21   0:00 /usr/local/bin/mysql-proxy/libexec/mysql-proxy --defaults-file=/usr/local/bin/mysql-proxy/mysql-proxy.cnf
起動時のログやエラーログなどはこちらに作られています。 プロセスが立ち上がらない場合には確認してみてください(´;ω;`)ウッ…
#プロセスIDの確認
view /var/run/mysql-proxy.pid
#エラーログを確認
view /var/log/mysql-proxy.log
#停止(プロセスを落とす)
kill -9 `cat /var/run/mysql-proxy.pid`
■手順5)masterサーバーから接続を試してみる。
$ mysql -u root -h masterサーバーのIPアドレス -P 4040
ERROR 1045 (28000): Access denied for user 'root'@'mysql-proxyサーバーのホスト名' (using password: NO)
( `_ゝ´)ムッ

slave1側で、rootの接続はローカルしか許可していないため接続が行えなかった:(;゙゚'ω゚'):

■手順6)masterでmysql-proxyサーバーから接続できるようにアカウントを作成する
※レプリケーションが行われていればmasterで作成したユーザーが
slave1,slave2にも作成される。
#現在のアカウント一覧
mysql> SELECT user, host, password FROM mysql.user;
+------+-----------+-------------------------------------------+
| user | host      | password                                  |
+------+-----------+-------------------------------------------+
| root | localhost |                                           |
| root | 127.0.0.1 |                                           |
| root | ::1       |                                           |
|      | localhost |                                           |
+------+-----------+-------------------------------------------+

#接続ホストを制限しない場合には'proxy'@'%'にする
#mysql-proxyを経由せずに直接接続用のアカウント作成(mysql-proxyなどが落ちた場合や直接つなげたい時ように作っておく)
mysql> GRANT ALL ON *.* TO 'proxy'@'webサーバーのIPアドレス' IDENTIFIED BY 'パスワード';
Query OK, 0 rows affected (0.08 sec)

#mysql-proxyを経由用の接続アカウントを作成
mysql> GRANT ALL ON *.* TO 'proxy'@'mysql-proxyサーバーのIPアドレス' IDENTIFIED BY 'パスワード';
Query OK, 0 rows affected (0.08 sec)

#設定を反映
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)      

#確認
mysql> SELECT user, host, password FROM mysql.user;
+-------+-----------------+-------------------------------------------+
| user  | host            | password                                  |
+-------+-----------------+-------------------------------------------+
| root  | localhost       |                                           |
| root  | 127.0.0.1       |                                           |
| root  | ::1             |                                           |
|       | localhost       |                                           |
| proxy | ***.***.***.*** | *76D508341841E400685CCB258F3866D75112EADD |
| proxy | ***.***.***.*** | *76D508341841E400685CCB258F3866D75112EADD |
+-------+-----------------+-------------------------------------------+

#接続アカウントを削除する場合
#権限削除
REVOKE ALL ON *.* FROM proxy@192.168.0.1;
#アカウント削除
DELETE FROM mysql.user WHERE USER LIKE 'proxy' AND HOST LIKE '192.168.0.1';

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

■手順7)接続確認。 ひとまず、webからslaveへ直接ログインをしてみる。
#
mysql -u proxy -p -h slave1またはslave2サーバーのIPアドレス
Enter password:(先程作成した接続アカウントのパスワードを入力する)

#今度はmysql-proxy経由で接続をしてみる。
mysql -u proxy -p -h mysql-proxyサーバーのIPアドレス -P 4040
Enter password:(先程作成した接続アカウントのパスワードを入力する)
接続キタ――(゚∀゚)――!!
インストール手順はここまでになります
次からは、luaにhistogram.luaを指定していた場合に行えるものになります。
■手順8)phpからの接続を確認する
#webサーバー上で確認用のプログラムファイルを作成する
vi mysql-proxy.php
#!/usr/bin/php
<?php
$link = mysql_connect('mysql-proxyサーバーのIPアドレス:4040', '接続アカウント名', '接続アカウントのパスワード');
if (!$link) {
    die('接続失敗です。'.mysql_error());
}

$db_selected = mysql_select_db('データベース名', $link);
if (!$db_selected){
    die('データベース選択失敗です。'.mysql_error());
}

$result = mysql_query('SHOW PROCESSLIST');
if (!$result) {
    die('クエリーが失敗しました。'.mysql_error());
}

mysql_close($link);
var_dump("complete");
exit;
?>

#実行
php mysql-proxy.php

#mysql-proxyサーバーのログファイル
2013-01-09 13:59:54 host:153.127.243.30:3306 thread:10443 db:purelovers_com client:153.127.240.99:53721 user_name:proxy
        SHOW PROCESSLIST

■手順9)起動・停止、再起動や、自動起動用の設定を行う。
※/etc/init.d/mysql-proxy startみたいな形で起動などを行いたい場合や、
OSが起動したときに自動起動するようにしたい場合には設定してください。
vi /etc/init.d/mysql-proxy
#!/bin/sh
# chkconfig: 345 99 01
# description: MySQL Proxy Daemon
# processname: mysql-proxy
#
progname=mysql-proxy
#設定ファイルで指定したpid-fileのパス
pidfile=/var/run/${progname}.pid
#
lockfile=/var/lock/subsys/${progname}
#
prog=/usr/local/bin/mysql-proxy/bin/mysql-proxy
#設定ファイルの場所
prm='--defaults-file=/usr/local/bin/mysql-proxy/mysql-proxy.cnf'
. /etc/init.d/functions
RETVAL=0
start() {
        echo -n $"Starting $progname: "
        daemon "${prog} ${prm}"
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && touch $lockfile
        return $RETVAL
}
stop() {
        echo -n $"Stopping $progname: "
        killproc ${prog}
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && rm -f $lockfile
        return $RETVAL
}
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart)
        stop
        start
        ;;
  *)
        echo $"Usage: $0 {start|stop|restart}"
        exit 1
esac

exit $RETVAL
実行権限を与える
chmod +x /etc/init.d/mysql-proxy
動作確認をする( ̄ー ̄)ニヤリ
#停止
# /etc/init.d/mysql-proxy stop
mysql-proxy を停止中:                                      [  OK  ]
# ps aux|grep mysql
root      5230  0.0  0.0 107452   956 pts/0    S+   17:36   0:00 grep mysql

#起動
# /etc/init.d/mysql-proxy start
mysql-proxy を起動中:                                      [  OK  ]
# ps aux|grep mysql
root      5243  0.0  0.0  41272  1220 ?        S    17:36   0:00 /usr/local/bin/mysql-proxy/libexec/mysql-proxy --defaults-file=/usr/local/bin/mysql-proxy/mysql-proxy.cnf
root      5246  0.0  0.0 107452   956 pts/0    S+   17:36   0:00 grep mysql

#再起動
# /etc/init.d/mysql-proxy restart
mysql-proxy を停止中:                                      [  OK  ]
mysql-proxy を起動中:                                      [  OK  ]
自動で起動するようにする場合はこちら
#
# chkconfig --add mysql-proxy
#確認
# chkconfig --list | grep mysql-proxy
mysql-proxy     0:off   1:off   2:off   3:on    4:on    5:on    6:off
■histogram.luaの確認
今回はluaにhistogram.luaを設定しているので、
各テーブルへの読み書き回数と、クエリの実行回数、実行時間の統計が取れるらしいので確認する。

確認する為には、mysql-proxy経由で接続している状態で、
適当なSQLを実行しておく必要がある。

mysql-proxy経由で、slave1またはslave2に接続する
#
mysql> SELECT host,user,password FROM mysql.user;
+-----------------+-------+-------------------------------------------+
| host            | user  | password                                  |
+-----------------+-------+-------------------------------------------+
| localhost       | root  |                                           |
| 127.0.0.1       | root  |                                           |
| ::1             | root  |                                           |
| localhost       |       |                                           |
| ***.***.***.*** | proxy | *76D508341841E400685CCB258F3866D75112EADD |
| ***.***.***.*** | proxy | *76D508341841E400685CCB258F3866D75112EADD |
| %               | repl  | *A424E797037BF97C19A2E88CF7891C5C2038C039 |
+-----------------+-------+-------------------------------------------+
9 rows in set (0.51 sec)

mysql> SELECT table_schema,COUNT(*) FROM information_schema.tables GROUP BY table_schema;
+--------------------------------+----------+
| table_schema                   | COUNT(*) |
+--------------------------------+----------+
| information_schema             |       40 |
| mysql                          |       24 |
| performance_schema             |       17 |
+--------------------------------+----------+
6 rows in set (0.14 sec)

mysql> SELECT NOW(), SLEEP(3);
+---------------------+----------+
| NOW()               | SLEEP(3) |
+---------------------+----------+
| 2013-01-08 14:21:13 |        0 |
+---------------------+----------+
1 row in set (3.03 sec)

#テーブルへの読み書き回数
mysql> SELECT * FROM histogram.tables;
+---------------------------+-------+--------+
| table                     | reads | writes |
+---------------------------+-------+--------+
| information_schema.tables |     1 |      0 |
| histogram.TABLES          |     1 |      0 |
| mysql.user                |     1 |      0 |
+---------------------------+-------+--------+

#query_time の単位は マイクロ秒
mysql> SELECT * FROM histogram.queries;
+--------------------------------------------------------------------------------------------------+-------+----------------+----------------+
| query                                                                                            | count | max_query_time | avg_query_time |
+--------------------------------------------------------------------------------------------------+-------+----------------+----------------+
| DROP DATABASES `histogram`                                                                       |     1 |            304 |            304 |
| SHOW `tables`                                                                                    |     1 |            555 |            555 |
| SELECT * FROM `histogram` . `TABLES`                                                             |     1 |            407 |            407 |
| SELECT NOW( ) , SLEEP( ? )                                                                       |     1 |        3034087 |        3034087 |
| SELECT DATABASE( )                                                                               |     2 |            405 |          350.5 |
| SELECT `host` , `user` , `password` FROM `mysql` . `user`                                        |     1 |         228548 |         228548 |
| SELECT `table_schema` , COUNT( * ) FROM `information_schema` . `tables` GROUP BY `table_schema`  |     1 |         132580 |         132580 |
| DROP DATABASE `histogram`                                                                        |     1 |          21758 |          21758 |
| SHOW DATABASES                                                                                   |     1 |            475 |            475 |
+--------------------------------------------------------------------------------------------------+-------+----------------+----------------+
※このSELECT文で使われているhistogramなどは実際にデータベースが作成されているわけではなくて、
luaスクリプトで解析するための疑似的なクエリらしいです。

なので、これにwhere 句をつけたり、order byしたりっていうのは出来ないそうです。

■log.luaの利用
mysql-proxy経由で実行されたSQLのログなどを出力するためようの
luaがこちらになります。
こちらのサイトのluaを元にちょっと追加してあります
vi /usr/local/bin/mysql-proxy/share/doc/mysql-proxy/log.lua
#mysql-proxy経由で実行されたSQLのログを出力するパス
local log_file = '/tmp/mysql-proxy.log'
local fh = io.open(log_file, "a+")

function read_query( packet )
    if string.byte(packet) == proxy.COM_QUERY then
        --query
        local query = string.sub(packet, 2)
        --
        --      client関連
        --
        local client = proxy.connection.client
        --mysql-proxyに接続してきたサーバーのIPアドレス
        local client_name = client.src.name
        --mysq-proxyの接続ユーザー名
        local client_user_name = client.username
        --
        --      backend関連
        --
        local backend = proxy.global.backends[proxy.connection.backend_ndx]
        --mysql-proxyが接続したデータベースのIPアドレス
        local backend_name = backend.dst.name
        --mysql-proxyが接続したデータベースのthread id(sho processlistの値)
        local thread_id = proxy.connection.server["thread_id"]
        --
       fh:write(
                string.format(
                        "%s host:%s thread:%d db:%s client:%s user_name:%s\n\t%s \n",
                        os.date('%Y-%m-%d %H:%M:%S'),
                        backend_name,
                        thread_id,
                        client.default_db,
                        client_name,
                        client_user_name,
                        query
                )
        )
       fh:flush()
    end
end
このファイルをmysql-proxyの設定ファイルに追加して、再起動を行います。
vi /usr/local/bin/mysql-proxy/mysql-proxy.cnf
proxy-lua-script = /usr/local/bin/mysql-proxy/share/doc/mysql-proxy/histogram.lua
↓変更する
proxy-lua-script = /usr/local/bin/mysql-proxy/share/doc/mysql-proxy/log.lua

#再起動
# /etc/init.d/mysql-proxy restart
mysql-proxy を停止中:                                      [  OK  ]
mysql-proxy を起動中:                                      [  OK  ]
次に正しく動作が行われているか確認をして見ます。
接続後に、ログを出力する為にいくつかSQLを実行する
#接続する
mysql -u proxy -p -h mysql-proxyサーバーのIPアドレス -P 4040

#1.プロセスの確認
mysql> show processlist;
+-------+-------------+----------------------------+----------------+---------+--------+-----------------------------------------------------------------------------+------------------+
| Id    | User        | Host                       | db             | Command | Time   | State                                                                       | Info             |
+-------+-------------+----------------------------+----------------+---------+--------+-----------------------------------------------------------------------------+------------------+
|     7 | system user |                            | NULL           | Connect | 411135 | Waiting for master to send event                                            | NULL             |
|     8 | system user |                            | NULL           | Connect |    677 | Slave has read all relay log; waiting for the slave I/O thread to update it | NULL             |
| 10427 | proxy       | *****.***.******.***:41544 | purelovers_com | Query   |      0 | NULL                                                                        | show processlist |
+-------+-------------+----------------------------+----------------+---------+--------+-----------------------------------------------------------------------------+------------------+

#2.データベースの指定
mysql> use 適当なデーターベースを指定;
Database changed

#3.SQL実行
mysql> SELECT id FROM 適当なテーブルを指定 LIMIT 1;
+-----+
| id  |
+-----+
| 951 |
+-----+
1 row in set (0.02 sec)

#4.プロセスの確認
mysql> show processlist;
+-------+-------------+----------------------------+----------------+---------+--------+-----------------------------------------------------------------------------+------------------+
| Id    | User        | Host                       | db             | Command | Time   | State                                                                       | Info             |
+-------+-------------+----------------------------+----------------+---------+--------+-----------------------------------------------------------------------------+------------------+
|     7 | system user |                            | NULL           | Connect | 411201 | Waiting for master to send event                                            | NULL             |
|     8 | system user |                            | NULL           | Connect |    743 | Slave has read all relay log; waiting for the slave I/O thread to update it | NULL             |
| 10427 | proxy       | *****.***.******.***:41544 | purelovers_com | Query   |      0 | NULL                                                                        | show processlist |
+-------+-------------+----------------------------+----------------+---------+--------+-----------------------------------------------------------------------------+------------------+
3 rows in set (0.00 sec)
先程設定したmysql-proxyのlog.luaのログファイル出力先にあるログファイルを確認する
ログファイルの表示形式は次のようになっています。
#mysql-proxyサーバーで
view /tmp/mysql-proxy.log

#日付 host:接続されたmysqlのIPアドレス thread:接続されたmysql内のプロセスID db:SQLが実行されたデータベース名 client:mysqlに接続したclientのIPアドレス user_name:接続アカウント名
# 実行されたSQL
#
#mysql-proxy経由で接続された時のログ
2013-01-09 11:20:35 host:slave1のIPアドレス:3306 thread:10427 db: client:webのIPアドレス:52453 user_name:proxy
        select @@version_comment limit 1
#1.プロセスの確認のログ
2013-01-09 11:20:40 host:slave1のIPアドレス:3306 thread:10427 db: client:webのIPアドレス:52453 user_name:proxy
        show processlist
#2.データベースの指定のログ
2013-01-09 11:20:49 host:slave1のIPアドレス:3306 thread:10427 db: client:webのIPアドレス:52453 user_name:proxy
        SELECT DATABASE()
#3.SQL実行のログ
2013-01-09 11:21:15 host:slave1のIPアドレス:3306 thread:10427 db:データベース名 client:webのIPアドレス:52453 user_name:proxy
        SELECT id FROM user_login LIMIT 1
#4.プロセスの確認のログ
2013-01-09 11:23:18 host:slave1のIPアドレス:3306 thread:10427 db:データベース名 client:webのIPアドレス:52453 user_name:proxy
        show processlist
※dbの項目はデータベースが指定されていない状態で実行された場合には空が入っています。
threadはmysql-proxyが接続しているプロセスIDになる。
このプロセスIDがなくなったりした場合にはmysql-proxyの接続が切れたことになるっぽい。

次に、別のコンソールを立ち上げて、mysql-proxy経由で接続をしてみると、
先程はslave1に接続されていたものが、slave2に切り替わっていることが確認できます。
2013-01-09 11:36:54 host::slave2のIPアドレス:3306 thread:11 db: client:webのIPアドレス:35974 user_name:proxy
        select @@version_comment limit 1
2013-01-09 11:37:07 host:slave2のIPアドレス:3306 thread:11 db: client:webのIPアドレス:35974 user_name:proxy
        show processlist
2013-01-09 11:37:14 host:slave2のIPアドレス:3306 thread:11 db: client:webのIPアドレス:35974 user_name:proxy
        SELECT DATABASE()
2013-01-09 11:37:35 host:slave2のIPアドレス:3306 thread:11 db:purelovers_com client:webのIPアドレス:35974 user_name:proxy
        SELECT id FROM user_login LIMIT 1
2013-01-09 11:37:39 host:slave2のIPアドレス:3306 thread:11 db:purelovers_com client:webのIPアドレス:35974 user_name:proxy
        show processlist
log.luaの利用については以上です(`・ω・´)シャキーン
log.luaは実行されたSQLが書き込まれてしまうので、
サーバーに負荷がかかってしまうので利用時は注意した方が良いかも?:(;゙゚'ω゚'):

luaは他にもデフォルトで色々あったり、自身で作ったりして利用することも可能なようです。
admin.luaが0.8.3には入ってなかった・・・?
これが使える?
ls -alt /usr/local/bin/mysql-proxy/share/doc/mysql-proxy/
-rw-r--r-- 1 7157 wheel  1334  8月  6 20:46 2012 tutorial-basic.lua
-rw-r--r-- 1 7157 wheel  1473  8月  6 20:46 2012 tutorial-constants.lua
-rw-r--r-- 1 7157 wheel  2480  8月  6 20:46 2012 tutorial-inject.lua
-rw-r--r-- 1 7157 wheel  7134  8月  6 20:46 2012 tutorial-keepalive.lua
-rw-r--r-- 1 7157 wheel  5362  8月  6 20:46 2012 tutorial-monitor.lua
-rw-r--r-- 1 7157 wheel  8516  8月  6 20:46 2012 tutorial-packets.lua
-rw-r--r-- 1 7157 wheel  2699  8月  6 20:46 2012 tutorial-prep-stmts.lua
-rw-r--r-- 1 7157 wheel  1786  8月  6 20:46 2012 tutorial-query-time.lua
-rw-r--r-- 1 7157 wheel  3110  8月  6 20:46 2012 tutorial-resultset.lua
-rw-r--r-- 1 7157 wheel  2740  8月  6 20:46 2012 tutorial-rewrite.lua
-rw-r--r-- 1 7157 wheel  1829  8月  6 20:46 2012 tutorial-routing.lua
-rw-r--r-- 1 7157 wheel  1822  8月  6 20:46 2012 tutorial-scramble.lua
-rw-r--r-- 1 7157 wheel  2935  8月  6 20:46 2012 tutorial-states.lua
-rw-r--r-- 1 7157 wheel  1495  8月  6 20:46 2012 tutorial-tokenize.lua
-rw-r--r-- 1 7157 wheel  1614  8月  6 20:46 2012 tutorial-union.lua
-rw-r--r-- 1 7157 wheel  2248  8月  6 20:46 2012 tutorial-warnings.lua
-rw-r--r-- 1 7157 wheel  3780  8月  6 20:46 2012 active-queries.lua
-rw-r--r-- 1 7157 wheel  2468  8月  6 20:46 2012 active-transactions.lua
-rw-r--r-- 1 7157 wheel  8864  8月  6 20:46 2012 admin-sql.lua
-rw-r--r-- 1 7157 wheel 10816  8月  6 20:46 2012 analyze-query.lua
-rw-r--r-- 1 7157 wheel  1694  8月  6 20:46 2012 auditing.lua
-rw-r--r-- 1 7157 wheel  1683  8月  6 20:46 2012 commit-obfuscator.lua
-rw-r--r-- 1 7157 wheel   186  8月  6 20:46 2012 commit-obfuscator.msc
-rw-r--r-- 1 7157 wheel  5165  8月  6 20:46 2012 histogram.lua
-rw-r--r-- 1 7157 wheel 13282  8月  6 20:46 2012 load-multi.lua
-rw-r--r-- 1 7157 wheel  6646  8月  6 20:46 2012 ro-balance.lua
-rw-r--r-- 1 7157 wheel  7086  8月  6 20:46 2012 ro-pooling.lua
-rw-r--r-- 1 7157 wheel 11341  8月  6 20:46 2012 rw-splitting.lua
-rw-r--r-- 1 7157 wheel 13591  8月  6 20:46 2012 xtab.lua
drwxr-xr-x 3 7157 wheel  4096  8月  6 20:45 2012 ..
rw-splitting.luaは、書き込み、読み込みのSQLを自動でmaster,slaveに振り分けなどを自動で行ってくれるやつとか!(・∀・)イイネ!!
でも、まだ未完成?のためバグがあるらしい・・・?(´;ω;`)ウッ…
そのうち検証してみたいな~と思います。
他にもフェイルオーバーも行えるっぽいです!

GREEでは独自に作ったもの「g2proxy」を利用して色々便利になっているものを利用しているそうです(´・∀・`)ヘー 早く「g2proxy」を公開して欲しいです(´;ω;`)ウッ…
おまけ。設定のオプションなど
Usage:
  mysql-proxy [OPTION...] - MySQL Proxy

Help Options:
  -?, --help                                              Show help options
  --help-all                                              Show all help options
  --help-admin                                            Show options for the admin-module
  --help-proxy                                            Show options for the proxy-module

admin-module
  --admin-address=                             listening address:port of the admin-server (default: :4041)
  --admin-username=                               username to allow to log in
  --admin-password=                               password to allow to log in
  --admin-lua-script=                           script to execute by the admin plugin

proxy-module
  -P, --proxy-address=                         listening address:port of the proxy-server (default: :4040)
  -r, --proxy-read-only-backend-addresses=     address:port of the remote slave-server (default: not set)
  -b, --proxy-backend-addresses=               address:port of the remote backend-servers (default: 127.0.0.1:3306)
  --proxy-skip-profiling                                  disables profiling of queries (default: enabled)
  --proxy-fix-bug-25371                                   fix bug #25371 (mysqld > 5.1.12) for older libmysql versions
  -s, --proxy-lua-script=                           filename of the lua script (default: not set)
  --no-proxy                                              don't start the proxy-module (default: enabled)
  --proxy-pool-no-change-user                             don't use CHANGE_USER to reset the connection coming from the pool (default: enabled)
  --proxy-connect-timeout                                 connect timeout in seconds (default: 2.0 seconds)
  --proxy-read-timeout                                    read timeout in seconds (default: 8 hours)
  --proxy-write-timeout                                   write timeout in seconds (default: 8 hours)

Application Options:
  -V, --version                                           Show version
  --defaults-file=                                  configuration file
  --verbose-shutdown                                      Always log the exit code when shutting down
  --daemon                                                Start in daemon-mode
  --user=                                           Run mysql-proxy as user
  --basedir=                               Base directory to prepend to relative paths in the config
  --pid-file=                                       PID file in case we are started as daemon
  --plugin-dir=                                     path to the plugins
  --plugins=                                        plugins to load
  --log-level=(error|warning|info|message|debug)          log all messages of level ... or higher
  --log-file=                                       log all messages in a file
  --log-use-syslog                                        log all messages to syslog
  --log-backtrace-on-crash                                try to invoke debugger on crash
  --keepalive                                             try to restart the proxy if it crashed
  --max-open-files                                        maximum number of open files (ulimit -n)
  --event-threads                                         number of event-handling threads (default: 1)
  --lua-path=<...>                                        set the LUA_PATH
  --lua-cpath=<...>                                       set the LUA_CPATH

参考URL

0 件のコメント:

コメントを投稿