MySQL Proxy快速實現讀寫分離以及負載均衡

日期:2008-07-04  作者:喜騰小二  來源:PHPChina


作/譯者:葉金榮(Email: ),來源:http://imysql.cn,轉載請注明作/譯者和出處,並且不能用於商業用途,違者必究。

1. 安裝
下載已經編譯好的安裝套件,或者預編譯安裝套件均可,在這裡,使用預編譯版本。

[@s1.yejr.com ~]# tar zxf mysql-proxy-0.6.0-linux-rhas4-x86.tar.gz

[@s1.yejr.com ~]# cd mysql-proxy-0.6.0-linux-rhas4-x86

#可以看到有2個目錄
[@s1.yejr.com mysql-proxy-0.6.0-linux-rhas4-x86]# ls
sbin share

[@s1.yejr.com mysql-proxy-0.6.0-linux-rhas4-x86]# mv sbin/mysql-proxy /usr/local/sbin/

[@s1.yejr.com mysql-proxy-0.6.0-linux-rhas4-x86]# ls share
mysql-proxy tutorial-constants.lua tutorial-packets.lua tutorial-rewrite.lua tutorial-warnings.lua
tutorial-basic.lua tutorial-inject.lua tutorial-query-time.lua tutorial-states.lua

#將lua指令檔放到/usr/local/share下,以備他用
[@s1.yejr.com mysql-proxy-0.6.0-linux-rhas4-x86]# mv share/mysql-proxy /usr/local/share/

#移除符號連線等垃圾程式碼
[@s1.yejr.com mysql-proxy-0.6.0-linux-rhas4-x86]# strip /usr/local/sbin/mysql-proxy

2. 啓動
編譯一下啓動管理指令檔:

[@s1.yejr.com ~]# vi /etc/init.d/mysql-proxy

#!/bin/sh
export LUA_PATH=/usr/local/share/mysql-proxy/?.lua

mode=$1
if [ -z "$mode" ] ; then
mode="start"
fi

case $mode in
'start')
mysql-proxy --daemon
--admin-address=:4401
--proxy-address=:3307
--proxy-backend-addresses=:3306
--proxy-read-only-backend-addresses=192.168.133.232:3306
--proxy-read-only-backend-addresses=10.10.74.61:3306
--proxy-lua-script=/usr/local/share/mysql-proxy/rw-splitting.lua
;;

'stop')
killall mysql-proxy
;;

'restart')
if $0 stop ; then
$0 start
else
echo "retart failed!!!"
exit 1
fi
;;
esac
exit 0

現在解釋一下啓動指令檔:
--daemon 采用daemon方式啓動
--admin-address=:4401 指定mysql proxy的管理連接埠,在這裡,表示本機的4401連接埠
--proxy-address=:3307 指定mysql proxy的監聽連接埠,也可以用 127.0.0.1:3307 表示
--proxy-backend-addresses=:3306 指定mysql主機的連接埠
--proxy-read-only-backend-addresses=192.168.1.1:3306 指定唯讀的mysql主機連接埠
--proxy-read-only-backend-addresses=192.168.1.2:3306 指定另一個唯讀的mysql主機連接埠
--proxy-lua-script=/usr/local/share/mysql-proxy/rw-splitting.lua 指定lua指令檔,在這裡,使用的是rw-splitting指令檔,用於讀寫分離

完整的參數可以執行以下指令檢視:

mysql-proxy --help-all

執行以下指令啓動/停止/重啓mysql proxy:

[@s1.yejr.com ~]# /etc/init.d/mysql-proxy start

[@s1.yejr.com ~]# /etc/init.d/mysql-proxy stop

[@s1.yejr.com ~]# /etc/init.d/mysql-proxy restart

3. 試用

[@s1.yejr.com ~]# mysql -h127.0.0.1 -uroot -P3307

mysql> show processlist;
+-------+------+----------------+------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+-------+------+----------------+------+---------+------+-------+------------------+
| 30052 | root | localhost:9656 | NULL | Query | 0 | NULL | show processlist |
+-------+------+----------------+------+---------+------+-------+------------------+

可以看到,產生了一個新連線。

用sysbench測試一下,看會不會掛掉:

[@s1.yejr.com ~]# sysbench --test=oltp --mysql-table-engine=innodb --oltp-table-size=1000000
--mysql-socket=/tmp/mysql.sock --mysql-user=root --mysql-db=test prepare

[@s1.yejr.com ~]# sysbench --test=oltp --mysql-table-engine=innodb --oltp-table-size=1000000
--mysql-socket=/tmp/mysql.sock --mysql-user=root --mysql-db=test run
.........
.........
Threads fairness:
events (avg/stddev): 10000.0000/0.00
execution time (avg/stddev): 23.0387/0.00

還好,沒給大家丟臉,剩下的測試自己完成吧 :)

4. 其他
mysql proxy還可以實現連線池的功能,這在很多LAMP開發中是軟肋,因此,有了mysql proxy,就可以不用再擔心連線數超限的問題了。
如果使用rw-splitting.lua指令檔的話,最好修改以下2個參數的預設值:

min_idle_connections = 1
max_idle_connections = 3

<<<返回技術中心

技術文章

站內新聞

我要啦免费统计