一年前听Hiro说过MySQL Proxy这个应用,直到现在才来了兴致鼓弄鼓弄,也是因为来到这边后,有生产环境一直在用mysql-proxy实现应用的读写分离,前辈搭好的架构现在好好学习下。也就是从昨天开始,亲自搭建了这个环境,学习学习。下面就说说我的测试环境以及遇到的很多晕来晕去的问题。
先简单说下什么是MySQL Proxy。从名字上就清晰可见代理嘛,就是在你能直接进行操作前,都要经过这个代理或是agent(国外片里的特工),client-agent-server就是这么一个过程,既然mysql-proxy加在客户端和服务端之间,那么它就必须要能听懂双方说的是什么,它的角色就像一名接线员(operator)。我们都知道mysql client和mysqld通信时,采用的是MySQL自己的网络协议,而MySQL Proxy也同样使用的是这个网络协议,那么三者之间也就没有什么障碍了。除了可以按照策略分发请求,既然放在两者中间,那么所有过来的请求它自然都可以截获,如果你愿意当然还可以做操作前的审核,也可注入些新的东西。Agent嘛,无所不能,不过你需要先对Lua无所不能LoL。
实验环境:
CentOS 5.4 + mysql-proxy-0.8.1-linux-glibc2.3-x86-64bit.tar.gz + mysql-5.0.77
192.168.109.5 (mysql-proxy) — 在前端,做读写分离(proxy和主库在一台机器上);
192.168.109.5 (master) + 192.168.109.6 (slave) — 主从同步(测试读写是否分离是,关闭同步,便于我们观察分离情况)
具体实施:
mysql-proxy –admin-lua-script=/usr/local/mysql-proxy/admin.lua –admin-username=root –admin-password=pass –proxy-address=192.168.109.5:4040 –proxy-backend-addresses=192.168.109.5:3306 –proxy-read-only-backend-addresses=192.168.109.6:3306 –proxy-lua-script=/usr/local/mysql-proxy/rw-splitting.lua –proxy-lua-script=/usr/local/mysql-proxy/reporter.lua –daemon > /tmp/mysql-proxy-err.log
NOTE: mysql-proxy二进制包解压好就能用了,但是需要注意的是一些lib和libexec的路径,即便你–plugin-dir,–lua-path,–basedir都用了执行上面的语句还是会告诉你不是libmysql-chassis.so.0、libadmin.so发现不了,就是commands.so,commands.lua,proxy.so这些找不到。你看下源码包下的./configure –help,就会知道mysql-proxy的相关默认路径(/usr/local/bin, /usr/local/lib),所以,解压后把目录下对应的文件/文件夹copy到这些目录下就不会在有那些犯人的error了。
Lua Scripts: admin.lua和reporter.lua这两个Lua脚本就可以使用mysql-proxy提供的Admin Plugin的功能,对请求进行统计同时还可以显示各种状态;rw-splitting.lua这个脚本就是我们用来做读写分离的,它里面还有两个可以调整的参数分别是:min_idle_connections,max_idle_connections,测试中发现,mysql-proxy与mysqld建立的是长连接,如果你不去主动断开连接,该线程会一直空置在那里,那么这两个命令就可以很好的控制空闲线程的数量,减少资源的浪费。
Admin Plugin 测试:
打开一个客户端,通过mysql-proxy的管理端口(4041),登录到mysql-proxy上,便可以执行Proxy的一些管理语句。
1. shell> mysql -uroot -ppass -P4041 -h192.168.109.5
2. mysql> show querycounter;
+——————-+
| query_counter |
+——————-+
| 2 |
+——————-+
Note: 这个语句显示的数字是一个累加值,默认一开始是NULL,由这么几部分组成:当你通过mysql连接proxy时会被+1,当你每执行一次sql语句时会被+1,当你quit断开连接时会被+1。
3. mysql> show proxy processlist;
+——+——————————+————————————+
| Id | […]