Linux下 MySQL Proxy 安装与配置(简单)

Linux下 MySQL Proxy 安装与配置

[c-sharp]  view plain copy
  1. fetch http://mirror.mysql-partners-jp.biz/Downloads/MySQL-Proxy/mysql-proxy-0.6.0-freebsd6-x86.tar.gz  
  2. tar zxvf mysql-proxy-0.6.0-freebsd6-x86.tar.gz  
  3. cd mysql-proxy-0.6.0-freebsd6-x86  
  4. cp sbin/mysql-proxy /usr/local/sbin/  

如果无法正常使用,请检查相应的其他组件是否安装了,mysql-proxy 需要依赖 lua、libtool、glib、libevent 等库。

 

管理功能选项

执行 mysql-proxy --help-all 查看所有的设置选项,比较重要的选项大致描述一下功能:

[c-sharp]  view plain copy
  1. --admin-address=host:port — 指定一个mysqo-proxy的管理端口,缺省是 4041  

代理功能选项

[c-sharp]  view plain copy
  1. --proxy-address=host:port — 这个是mysql-proxy 服务器端的监听端口,缺省是 4040  
  2. --proxy-read-only-backend-addresses=<host:port> — 远程只读Slave服务器的地址和端口,缺省为不设置(本选项在mysql-proxy0.5.0版本中没有)  
  3. --proxy-backend-addresses=host:port — 指定远程MySQL服务器地址和端口,可以设置多个,缺省是 127.0.0.1:3306  
  4. --proxy-skip-profiling — 关闭查询分析功能,缺省是打开的  
  5. --proxy-fix-bug-25371 — 修正 mysql的libmysql版本大于5.1.12的一个#25371号bug  
  6. --proxy-lua-script=file — 指定一个Lua脚本程序来控制mysql-proxy的运行和设置,这个脚本在每次新建连接和脚本发生修改的的时候将重新调用  
  7.   
  8. 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/heiyeshuwu/archive/2008/01/28/2069190.aspx  

 

其他选项

[c-sharp]  view plain copy
  1. --daemon — mysql-proxy以守护进程方式运行  
  2. --pid-file=file — 设置mysql-proxy的存储PID文件的路径  

 

我们执行试试,监听本地MySQL是3000端口:

[c-sharp]  view plain copy
  1. /usr/local/sbin/mysql-proxy --proxy-backend-addresses=127.0.0.1:3000  

 

然后从我的windows机器使用mysql客户端连接过去:

[c-sharp]  view plain copy
  1. mysql -uroot -h 192.168.0.2 -P 4040  

 

Welcome to the MySQL monitor.  Commands end with  ;  or g.
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试试:

[c-sharp]  view plain copy
  1. mysql> select version();  
 

 

 

 

 

+------------+
| version()  |
+------------+
4.1.22-log |
+------------+
1 row in set (0.01 sec)

 

【 对两台/多台MySQL的负载均衡 】

 

首先我们目前MySQL Proxy 是支持多台后端MySQL数据库的,它可以支持同时设置多个 --proxy-backend-addresses 选项来使用多个MySQL,比如:

[c-sharp]  view plain copy
  1. /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,就一个函数:

 

 

 


[c-sharp]  view plain copy
  1. function read_query( packet )  
  2.     print("read_query: connection.backend_ndx: ", proxy.connection.backend_ndx)  
  3. end  

 

 

执行:

[c-sharp]  view plain copy
  1. /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服务器端输出结果:

[c-sharp]  view plain copy
  1. read_query: connection.backend_ndx:     1  
  2. read_query: connection.backend_ndx:     2  
  3. read_query: connection.backend_ndx:     1  
  4. read_query: connection.backend_ndx:     2  
  5. read_query: connection.backend_ndx:     1  
  6. read_query: connection.backend_ndx:     2  

 

现在我们来简单改进一下连接服务器连接分配的算法,就在Lua脚本中增加一个 connect_server 函数就行。
比如按照当前时间进行分布连接到两台MySQL上:

 

[c-sharp]  view plain copy
  1. function connect_server()  
  2.     if (tonumber(os.date("%M")) % 2 == 0) then  
  3.         proxy.connection.backend_ndx = 2  
  4.     else  
  5.         proxy.connection.backend_ndx = 1  
  6.     end  
  7. end  

 

或者我们采取随机方式,在两台MySQL之间随机挑选一台:

 

[c-sharp]  view plain copy
  1. function connect_server()  
  2.     local server_index = math.random(1, 2)  
  3.     proxy.connection.backend_ndx  
  4. end  

 

我们客户端继续连接多次,监测连接的服务器,发现连接的机器是随机展开的:

 

[c-sharp]  view plain copy
  1. read_query: connection.backend_ndx:     1  
  2. read_query: connection.backend_ndx:     2  
  3. read_query: connection.backend_ndx:     2  
  4. read_query: connection.backend_ndx:     1  
  5. read_query: connection.backend_ndx:     1  
  6. read_query: connection.backend_ndx:     2  
  7. read_query: connection.backend_ndx:     2  
  8. read_query: connection.backend_ndx:     1  
  9. read_query: connection.backend_ndx:     1  
  10. read_query: connection.backend_ndx:     1  
  11. read_query: connection.backend_ndx:     2  

 

1. 连接数据库压力测试

测试代码使用PHP5.2,测试文件 php_mysql_proxy.php 代码:

 

[c-sharp]  view plain copy
  1.   
 

//测试1 (连续连接1w次,每次连接后不关闭连接)
test(10000);

Server: mysql-proxy 的CPU占用是从0.1%一直升到 12.4% 左右,然后结束后慢慢减下来,mysqld 的cpu占用率很低,%0.2左右
Client: 客户端在连接后马上关闭连接的状态下,一直持续到3948个连接的时候无法再连接到mysql-proxy
客户端输出:

[c-sharp]  view plain copy
  1. ...  
  2. Connect mysql-proxy 3945.. close connection ... Succeed  
  3. Connect mysql-proxy 3946.. close connection ... Succeed  
  4. Connect mysql-proxy 3947.. close connection ... Succeed  
  5. Connect mysql-proxy 3948..  
  6. Warning: mysql_connect(): Can't connect to MySQL server on '192.168.0.2' (10048)  
  7.  in C:php_mysql_proxy.php on line 4  
  8. 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,基本跟关闭连接的最终处理数量差不多
输出信息

 

[c-sharp]  view plain copy
  1. Connect mysql-proxy 3944.. Succeed  
  2. Connect mysql-proxy 3945.. Succeed  
  3. Connect mysql-proxy 3946..  
  4. Warning: mysql_connect(): Can't connect to MySQL server on '192.168.0.2' (10048)  
  5.  in C:php_mysql_proxy.php on line 4  
  6. Could not connect:  

 

2. 执行查询测试

测试脚本,php_mysql_proxy.php,代码如下:

[php]  view plain copy
  1.   

 

//执行测试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文件的优化与定制,不久会发上来。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值