- fetch http://mirror.mysql-partners-jp.biz/Downloads/MySQL-Proxy/mysql-proxy-0.6.0-freebsd6-x86.tar.gz
- tar zxvf mysql-proxy-0.6.0-freebsd6-x86.tar.gz
- cd mysql-proxy-0.6.0-freebsd6-x86
- cp sbin/mysql-proxy /usr/local/sbin/
如果无法正常使用,请检查相应的其他组件是否安装了,mysql-proxy 需要依赖 lua、libtool、glib、libevent 等库。
管理功能选项
执行 mysql-proxy --help-all 查看所有的设置选项,比较重要的选项大致描述一下功能:
- --admin-address=host:port — 指定一个mysqo-proxy的管理端口,缺省是 4041
代理功能选项
- --proxy-address=host:port — 这个是mysql-proxy 服务器端的监听端口,缺省是 4040
- --proxy-read-only-backend-addresses=<host:port> — 远程只读Slave服务器的地址和端口,缺省为不设置(本选项在mysql-proxy0.5.0版本中没有)
- --proxy-backend-addresses=host:port — 指定远程MySQL服务器地址和端口,可以设置多个,缺省是 127.0.0.1:3306
- --proxy-skip-profiling — 关闭查询分析功能,缺省是打开的
- --proxy-fix-bug-25371 — 修正 mysql的libmysql版本大于5.1.12的一个#25371号bug
- --proxy-lua-script=file — 指定一个Lua脚本程序来控制mysql-proxy的运行和设置,这个脚本在每次新建连接和脚本发生修改的的时候将重新调用
- 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/heiyeshuwu/archive/2008/01/28/2069190.aspx
其他选项
- --daemon — mysql-proxy以守护进程方式运行
- --pid-file=file — 设置mysql-proxy的存储PID文件的路径
我们执行试试,监听本地MySQL是3000端口:
- /usr/local/sbin/mysql-proxy --proxy-backend-addresses=127.0.0.1:3000
然后从我的windows机器使用mysql客户端连接过去:
- mysql -uroot -h 192.168.0.2 -P 4040
Your MySQL connection id is 3
Server version: 4.1.22 -log
Type 'help ; ' or 'h' for help. Type 'c' to clear the buffer.
mysql>
远程的mysql-proxy缺省对外监听的是4040端口,它会对连接4040端口的连接做处理后丢给后端3000端口的mysql服务器处理,把结果返回。
我们执行一条sql试试:
- mysql> select version();
+------------+
| version() |
+------------+
| 4.1.22-log |
+------------+
1 row in set (0.01 sec)
【 对两台/多台MySQL的负载均衡 】
首先我们目前MySQL Proxy 是支持多台后端MySQL数据库的,它可以支持同时设置多个 --proxy-backend-addresses 选项来使用多个MySQL,比如:
- /usr/local/sbin/mysql-proxy --proxy-address=192.168.0.2:3306 --proxy-backend-addresses=127.0.0.1:3000 --proxy-backend-addresses=192.168.0.2:
就分别连接了两台MySQL,一台是3000端口,一台是4000端口。
假设有两台Slave的读数据服务器,我们使用mysql_proxy多个数据库的轮询技术来进行两台Slave数据库的负载均衡分散访问措施,mysql-proxy可以做到,缺省就具有了简单的均衡功能,它自带的均衡功能是当有多台MySQL服务器的时候,进行逐个访问的原则,比如有A、B两台MySQL服务器,那么第一个连接就访问A,第二个连接访问B,第三个连接访问A,一次分布,达到A、B两台MySQL访问均衡。
对于mysql-proxy这个功能,我们进行检测一下。增加一个Lua检测脚本 test-conn.lua,就一个函数:
- function read_query( packet )
- print("read_query: connection.backend_ndx: ", proxy.connection.backend_ndx)
- end
执行:
- /usr/local/sbin/mysql-proxy --proxy-address=192.168.0.2:3306 --proxy-backend-addresses=127.0.0.1:3000 --proxy-backend-addresses=192.168.0.2:4000 --proxy-lua-script=./test-conn.lua
在windows上调用mysql客户端连接过去,打开多个cmd窗口进行连接:mysql -u root -h 192.168.0.2 -P 3306
看到mysql-proxy服务器端输出结果:
- read_query: connection.backend_ndx: 1
- read_query: connection.backend_ndx: 2
- read_query: connection.backend_ndx: 1
- read_query: connection.backend_ndx: 2
- read_query: connection.backend_ndx: 1
- read_query: connection.backend_ndx: 2
现在我们来简单改进一下连接服务器连接分配的算法,就在Lua脚本中增加一个 connect_server 函数就行。
比如按照当前时间进行分布连接到两台MySQL上:
- function connect_server()
- if (tonumber(os.date("%M")) % 2 == 0) then
- proxy.connection.backend_ndx = 2
- else
- proxy.connection.backend_ndx = 1
- end
- end
或者我们采取随机方式,在两台MySQL之间随机挑选一台:
- function connect_server()
- local server_index = math.random(1, 2)
- proxy.connection.backend_ndx
- end
我们客户端继续连接多次,监测连接的服务器,发现连接的机器是随机展开的:
- read_query: connection.backend_ndx: 1
- read_query: connection.backend_ndx: 2
- read_query: connection.backend_ndx: 2
- read_query: connection.backend_ndx: 1
- read_query: connection.backend_ndx: 1
- read_query: connection.backend_ndx: 2
- read_query: connection.backend_ndx: 2
- read_query: connection.backend_ndx: 1
- read_query: connection.backend_ndx: 1
- read_query: connection.backend_ndx: 1
- read_query: connection.backend_ndx: 2
1. 连接数据库压力测试
测试代码使用PHP5.2,测试文件 php_mysql_proxy.php 代码:
//测试1 (连续连接1w次,每次连接后不关闭连接)
test(10000);
Server: mysql-proxy 的CPU占用是从0.1%一直升到 12.4% 左右,然后结束后慢慢减下来,mysqld 的cpu占用率很低,%0.2左右
Client: 客户端在连接后马上关闭连接的状态下,一直持续到3948个连接的时候无法再连接到mysql-proxy
客户端输出:
- ...
- Connect mysql-proxy 3945.. close connection ... Succeed
- Connect mysql-proxy 3946.. close connection ... Succeed
- Connect mysql-proxy 3947.. close connection ... Succeed
- Connect mysql-proxy 3948..
- Warning: mysql_connect(): Can't connect to MySQL server on '192.168.0.2' (10048)
- in C:php_mysql_proxy.php on line 4
- Could not connect: Can't connect to MySQL server on '192.168.0.2' (10048)
//测试2(连续连接1w次,每次连接后不关闭连接)
test(10000, false);
Server: mysql-proxy 的CPU占用是从0.1%一直升到 14.5% 左右,然后结束后慢慢减下来, mysqld 的cpu占用率也很低,%0.2左右
Client: 客户端在连接后马上不关闭连接的状态下,一直持续到3946个连接的时候无法再连接到mysql-proxy,基本跟关闭连接的最终处理数量差不多
输出信息
- Connect mysql-proxy 3944.. Succeed
- Connect mysql-proxy 3945.. Succeed
- Connect mysql-proxy 3946..
- Warning: mysql_connect(): Can't connect to MySQL server on '192.168.0.2' (10048)
- in C:php_mysql_proxy.php on line 4
- Could not connect:
2. 执行查询测试
测试脚本,php_mysql_proxy.php,代码如下:
//执行测试1
$start_time = microtime_float();
test1();
$end_time = microtime_float();
echo "/nExecute Time: ". ($end_time - $start_time) ."/n";
测试结果:PHP执行时间和服务器端cpu占用率
Execute Time: 39.4633390903
mysql-proxy: 17.56%
mysqld-1: 5.26%
mysqld-2: 2.12%
//执行测试2
$start_time = microtime_float();
test2();
$end_time = microtime_float();
echo "/nExecute Time: ". ($end_time - $start_time) ."/n";
测试结果:PHP执行时间和服务器端cpu占用率
Execute Time: 62.6189789772
mysql-proxy: 19.09%
mysqld-1: 6.25%
mysqld-2: 3.08%
首先搭建mysql主从数据库,参考:http://www.linuxidc.com/Linux/2011-03/33426.htm
下载mysql-proxy最新版,本文撰写时最新版本为 MySQL Proxy 0.8.1 alpha
安装mysql-proxy步骤如下:
解压mysql-proxy-0.8.1-linux-glibc2.3-x86-32bit.gz
tar zxvf mysql-proxy-0.8.1-linux-glibc2.3-x86-32bit.gz
cp mysql-proxy-0.8.1-linux-glibc2.3-x86-32bit /usr/loc/proxy-mysql
新建或编辑/etc/mysql-proxy.cnf文件,添加以下内容(具体参数根据实际情况修改):
vi /etc/mysql-proxy.cnf
[mysql-proxy]
admin-username = zhangdongyu
admin-password = 123123
daemon = true
keepalive = true
proxy-backend-addresses = 192.168.0.88:3306
proxy-read-only-backend-addresses = 192.168.0.88:3307
proxy-lua-script = /usr/local/proxy-mysql/share/doc/mysql-proxy/rw-splitting.lua
admin-lua-script = /usr/local/proxy-mysql/share/doc/mysql-proxy/admin-sql.lua
log-file = /usr/local/proxy-mysql/cn.log
log-level = debug
主要参数注解:
proxy-backend-addresses mysql主库(写)地址
proxy-read-only-backend-addresses mysql从库(读)地址
proxy-lua-script 读写分离脚本
admin-lua-script admin脚本
admin-username 数据库用户名(主从上都需建立相同用户)
admin-password 数据库密码
daemon daemon进程运行
keepalive 保持连接(启动进程会有2个,一号进程用来监视二号进行,如果二号进程死掉自动重建,此参数在旧版本中无法使用)
编辑profile/.bash_profile脚本
vi /etc/profile(或者.bash_profile)
LUA_PATH="/usr/local/proxy-mysql/share/doc/mysql-proxy/?.lua"
export LUA_PATH
export PATH=$PATH:/usr/local/proxy-mysql/bin
:wq
source /etc/profile
为方便建立建立mysql-proxy.sh脚本
#!/bin/bash mode=$1 if [ -z "$mode" ] ; then mode="start" fi case $mode in start) mysql-proxy --defaults-file=/etc/mysql-proxy.cnf>/usr/local/proxy-mysql/cn.log & ;; stop) killall -9 mysql-proxy ;; restart) if $0 stop ; then $0 start else echo "Restart failed!" exit 1 fi ;; esac exit 0 |
启动mysql-proxy
sh脚本
启动:./mysql-proxy.sh 或 ./mysql-proxy.sh start
启动日志
|
重启:./mysql-proxy.sh restart
停止:./mysql-proxy.sh stop
测试:
为达到测试效果,修改admin-sql.lua脚本以下两行
vi /usr/local/proxy-mysql/share/doc/mysql-proxy/rw-splitting.lua
if not proxy.global.config.rwsplit then proxy.global.config.rwsplit = { min_idle_connections = 1, #修改最小连接为1 max_idle_connections = 2, #修改最大连接为2 is_debug = true #debug为true } end |
重启mysql-proxy代理
开启两个终端分别连接代理:
ONE:./mysql -h192.168.0.88 -uzhangdongyu -p123123 -P4040
TWO:./mysql -h192.168.0.88 -uzhangdongyu -p123123 -P4040
可看到连接成功信息:
操作ONE客户端:
执行select语句观察数据库log文件
select * from z_member_info;
观察主从库日志文件,发现查询发生在主库?
主库:192.168.0.88:3306日志文件:tail -f /usr/local/mysql/localstate/mysqlexecute.log
这是因为mysql-proxy代理会检测客户端连接,当连接没有超过min_idle_connections预设值时,不会进行读写分离,即查询操作会发生到主库上。
操作TWO客户端:
执行select语句观察数据库log文件
select * from z_member_info;
观察主从库日志文件,发现主库没有任何记录,查询日志记录在从库。
从库:192.168.0.88:3306日志文件:tail -f /usr/local/mysql3307/localstate/mysqlexecute.log
操作两个终端进行insert操作,会发现写操作始终被主库(3306)日志文件记录。
至此mysql-proxy安装测试完成。
注:生产环境一定要根据实际情况配置相关文件,至于lua文件强烈推荐读者自行,目前正在研究lua文件的优化与定制,不久会发上来。