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
远程的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%