MySQLの負荷分散

データベースの負荷減少に悩んでおられるサーバ管理者は多いことでしょう.
MySQL Clusterという手もありますが,MySQLレプリケーションだけを使っても,さらにこのソフトを加えることで負荷分散が出来ます.
http://forge.mysql.com/wiki/MySQL_Proxy#Load_Balancing_.26_Failover

What is MySQL Proxy?

MySQL Proxy is a simple program that sits between your client and MySQL server(s) that can monitor, analyze or transform their communication. Its flexibility allows for unlimited uses; common ones include: load balancing; failover; query analysis; query filtering and modification; and many more.
(意訳)
MySQL Proxyとは?

MySQLプロクシは,MySQLサーバとMySQLサーバにアクセスするクライアントの間を結ぶシンプルなプログラムです.MySQLプロクシを使うと,MySQLに対するアクセスの監視・アクセス分析・クエリ転送・負荷分散(ロードバランシング)・クエリフィルタリング等々,色々なことができます.

なお,MySQLプロクシには,LUA言語等のインストールが必要ですし,mysql_configの場所の指定も大抵必要なので(./configure --with-mysql=/usr/local/mysql/bin/mysql_configとか),気をつけて下さい.負荷分散は簡単で,例えばこんな感じにコマンドを打つだけです.各MySQLサーバはレプリケーション等で同内容が保持されてるとします.

./src/mysql-proxy --proxy-backend-addresses=192.168.1.1:3306 --proxy-backend-addresses=192.168.1.1:3306 --proxy-backend-addresses=192.168.1.1:3306 --proxy-backend-addresses=192.168.1.1:3306 --proxy-backend-addresses=192.168.1.2:3306 --proxy-address=localhost:4040

この例では,192.168.1.1が192.168.1.2よりもパワーがあると仮定して,4:1の割合でアクセスに行くオプション設定です.
クライアントは,localhost:4040にアクセスします.localhost:3306じゃなくて.
例えば,

/usr/local/mysql/bin/mysql -h mysql-server

の代わりに,

/usr/local/mysql/bin/mysql -h mysql-server -P 4040

とします.
プロクシの管理情報は,mysql-proxyが立ち上がっている状況で,デフォルトで次のように監視できます.

/usr/local/mysql/bin/mysql -h mysql-server -P 4041

mysql> select * from proxy_config;

                                                                                                    • +
option value
                                                                                                    • +
admin.address :4041
proxy.address localhost:4040
proxy.lua_script NULL
proxy.backend_addresses[0] 192.168.1.1:3306
proxy.backend_addresses[1] 192.168.1.2:3306
proxy.fix_bug_25371 0
proxy.profiling 1
                                                                                                    • +

mysql> select * from proxy_connections;

                                                                      • +
0 server 0
1 proxy 0
2 proxy 10 some_db
3 proxy 10 some_db
4 proxy 10 some_db
                                                                      • +

stoneを使う手もあるのですが,mysql-proxyの方がクエリの分析が詳細にできます.