2015年计算机四级指导:MySQL Proxy 学习笔记
发布时间:2010/3/10 18:17:45 来源:城市学习网 编辑:MOON
【 测试平台 】服务器端:OS:FreeBSD 6.2Lua: 5.1.1MySQL Server:4.1.22-logMySQL Proxy: 0.6.0客户端:OS:Windows XP Pro SP2PHP: PHP 5.2.4 MySQL Client: Ver 14.13 Distrib 5.1.19-beta for Wi ...【 测试平台 】
服务器端:
OS:FreeBSD 6.2
Lua: 5.1.1
MySQL Server:4.1.22-log
MySQL Proxy: 0.6.0
客户端:
OS:Windows XP Pro SP2
PHP: PHP 5.2.4
MySQL Client: Ver 14.13 Distrib 5.1.19-beta for Win32
注意:本文使用的是最新版本 MySQL Proxy alpha 0.6.0 ,如果是0.5.0版本可能部分选项和操作不一致,同样的,以后如果除了新版本,请参照新版本文档。
【 MySQL Proxy 安装 】
$ 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的运行和设置,这个脚本在每次新建连接和脚本发生修改的的时候将重新调用
其他选项
--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
Welcome to the MySQL monitor.Commands end with ;org.
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试试:
mysqlselectversion;
+------------+
version
+------------+
4.1.22-log
+------------+
1 row in set
【 对两台/多台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:4000
就分别连接了两台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
print
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脚本构建自己的轮询连接算法,mysql-proxy的强大之处就在于能够支持Lua脚本进行各种控制,包括连接服务器、连接握手、提交验证、验证结果、提交查询、查询结果 等控制都是通过简单的在--proxy-lua-script 选项中指定脚本来进行控制。
现在我们来简单改进一下连接服务器连接分配的算法,就在Lua脚本中增加一个 connect_server 函数就行。
比如按照当前时间进行分布连接到两台MySQL上:
function connect_server
if ) % 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
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