一、先从官方地址http://dev.mysql.com/downloads/mysql-proxy/下载源码包到/usr/local/src/目录下,建议大家采用最新的mysqlproxy0.8.2版本。MYSQL-proxy0.8.2安装之前的先决条件如下:
1、libevent1.x或者更高
2、glib22.6.0或者更高
3、lua5.1.x或者更高
4、pkg-config
5、libtool1.5或者更高
6、MySQL5.0.x或者更高的开发库
7、服务器操作系统:CentOS5.6x86_64
二、为了加速安装进度,可以先用yum安装必需的库,同时解决pkg-config、libtool和MySQL开发库
,由于mysql-proxy并不需要在本机上运行mysql实例,所以这里用yum安装,命令如下:
yum-yinstallgccgcc-c++autoconfmysql-devellibtoolpkgconfigncursesncurses-devel
三、安装libevent-2.0.13版本,下载地址:http://monkey.org/~provos/libevent-2.0.13-stable.tar.gz
tar-zxflibevent-2.0.13-stable.tar.gz
cdlibevent-2.0.13-stable
./configure
make&&makeinstall
四、安装glib-2.18.4版本,下载地址:http://ftp.gnome.org/pub/gnome/sources/glib/2.18/glib-2.18.4.tar.gz
tar-zxfglib-2.18.4.tar.gz
cdglib-2.18.4
./configure
make&&makeinstall
五、安装lua-5.1.4版本,安装之前需要先安装readline-6.1,不然会报错缺少头文件。readline-6.1的下载地址:ftp://ftp.cwru.edu/pub/bash/readline-6.1.tar.gz
tar-zxfreadline-6.1.tar.gz
cdreadline-6.1
./configure
make&&makeinstall
为了让动态链接库为系统所共享,运行ldconfig命令:
ldconfig-v
用些选项时,ldconfig将显示正在扫描的目录及搜索到的动态链接库,还有它所创建的连接的名字
安装lua-5.1.4,其下载地址为http://www.lua.org/ftp/lua-5.1.4.tar.gz
tar-zxflua-5.1.4.tar.gz
cdlua-5.1.4
#64位系统需要CFLAGS里加上-fPIC,我们用vim编辑src/Makefile文件,修改代码如下所示:
CFLAGS=-O2-Wall-fPIC$(MYCFLAGS)
我们继续用如下命令进行安装:
makelinux
makeinstall
六、配置pkg-config环境变量,命令如下所示:
cpetc/lua.pc/usr/ocal/lib/pkgconfig/
exportPKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
七、以上操作完成了基础文件的安装,接下来是MySQLProxy0.8.2安装,下载后运行命令如下:
tar-zxfmysql-proxy-0.8.2.tar.gz
cdmysql-proxy-0.8.2
./configure-prefix=/usr/local/mysql-proxy
make&&makeinstall
cplib/rw-splitting.lua/usr/local/lib/
cplib/admin.lua/usr/local/lib/
八、MySQLProxy0.8.2的测试和配置
在这里MySQLProxy已经基本安装完成,接下来就是MySQLProxy0.8.2的测试与配置了
MySQLProxy环境设置说明如下:
MasterMySQL服务器:192.168.20.99
SlaveMySQL服务器:192.168.20.77
MySQLProxy服务器:192.168.20.100
大家可以用mysql-proxy--help-all查看mysql-proxy的帮助选项,命令如下所示:
mysql-proxy--help-all
管理功能选项:
--admin-address=host:port指定一个mysql-proxy的管理端口,默认是4041
--admin-username=usernametoallowtologin
--admin-password=passwordtoallowtologin
--admin-lua-script=scripttoexecutebytheadminplugin
代理功能选项:
-P--proxy-address=是mysq-proxy服务器端的监听,默认是4040,建议改成3306
方便开发人员写代码
-r--proxy-read-only-backend-address=只读Slave的地址和端口,默认为不设

-b--proxy-backend-address=远程Master地址和端口,可高远我个做failover
和loadbalance,默认是127.0.0.1:3306
--proxy-skip-profiling关闭查询分析功能,默认是打开的。
--proxy-fix-bug-25371修正Mysql的libmysql版本大于5.1.12的一个#25371号Bug
-s--proxy-lua-script=file指定一个Lua脚本来控制mysql-proxy的运行和设置,这个脚本
在每次新建连接和脚本发生修改时将重新调用。
其他选项:
--defaults-file=配置文件可以把mysql-proxy的参数信息置入一个配置文件里,建议
大家用这种方法配置mysqlproxy0.8.2,比较方便
--daemonmysql-proxy以守护进程方式运行。
--pid-file=file设置mysql-proxy的存储PID文件的路径
--keepalivetrytorestarttheproxyifitcrashed,保持连接启动进程会有2个,一号进
程用来监视二号进程,如果二号进程死掉自动重启proxy,这是新版本mysql-proxy新增加的keepalived功能,它修正了以前mysqlproxy容易死掉的Bug,建议大家开启此功能
完整的mysql-proxy配置文件如下:
【mysql-proxy】
admin-username=root
admin-password=123456
admin-lua-script=/usr/local/lib/admin.lua
proxy-read-only-backedn-addresses=192.168.2.77只读,一般为Slave
proxy-backend-addresses=192.168.2.117写,一般为Master
proxy-lua-script=/usr/local/lib/rw-splitting.ua
log-file=/var/log/mysql-proxy.log
daemon=true
keepalive=true
九、MySQLProxy0.8.2需要修改读写分离lua脚本,让测试更容易
lua脚本默认最小4个最大8个以上的客户端连接才会实现读写分离(这是因为mysql-proxy会检测客户端连接,当连接没有超过min_idle_connections预设值时,不会进行读写分享,即查询
操作会发生在Master上),现修改为最小1个,最大2个,我们用vim修改/usr/local/lib/rw-sp
litting.lua脚本,改动内容如下所示:
ifnotproxy.global.config.rwsplitthen
proxy.global.config.rwsplit={
min_idle_connections=1,
max_idle_connections=2,
is_debug=false
}
end
十、在Master和Slave上分别给用户授权
在Master/Slave建立一个测试用户,因为以后客户端发送的SQL都是通过mysql-proxy服务器来
转发,所以要确保可以从mysql-proxy服务器登录MYSQL主从库,分别在主和从MYSQL机器上运行
如下代码:
grantallprivilegeson*.*to"test"@"MasterIP"identifiedby"test"withgrantoption
grantallprivilegeson*.*to"test"@"SlaveIP"identifiedby"test"withgrantoption
十一、启动mysql-proxy进行测试
/usr/local/mysql-proxy/bin/mysql-proxy-P192.168.20.100:3306--defaults-file=/etc/mysql-proxy.cnf
/usr/local/mysql-proxy/bin/mysql-proxy--proxy-read-only-backend-addresses=192.168.20.77:3306--proxy-backend-addresses=192.168.20.99:3306--proxy-lua-script=/usr/local/lib/rw-splitting.lua-P192.168.20.100:3306&
十二、测试读写分离
创建用于读写分离的数据库连接用户
登陆主数据库服务器192.168.20.99,通过命令行登录管理MySQL服务器
/opt/mysql/bin/mysql-uroot-p'new-password'
mysql>GRANTALLON*.*TO'proxy1'@'192.168.20.99'IDENTIFIEDBY'password';
由于我们配置了主从复制功能,因此从数据库服务器192.168.20.77上已经同步了此操作。

为了清晰的看到读写分离的效果,需要暂时关闭MySQL主从复制功能
登陆从数据库服务器192.168.20.77,通过命令行登录管理MySQL服务器
/opt/mysql/bin/mysql-uroot-p'new-password'

关闭Slave同步进程
mysql>stopslave;
QueryOK,0rowsaffected(0.00sec)

连接MySQL-Proxy
/opt/mysql/bin/mysql-uproxy1-p'password'-P4040-h192.168.10.132

登陆成功后,在first_db数据的first_tb表中插入两条记录
mysql>usefirst_db;
Databasechanged
mysql>insertintofirst_tbvalues(007,’first’);
QueryOk,1rowaffected(0.00sec)
mysql>insertintofirst_tbvalues(110,’second’);
QueryOk,1rowaffected(0.00sec)

查询记录
mysql>select*fromfirst_tb;
=============================
+------+------+
|id|name|
+------+------+
|1|myself|
+------+------+
1rowsinset(0.00sec)
=============================
通过读操作并没有看到新记录

mysql>quit
退出MySQL-Proxy

下面,分别登陆到主从数据库服务器,对比记录信息
首先,检查主数据库服务器
mysql>select*fromfirst_tb;
=============================
+------+------+
|id|name|
+------+------+
|1|myself|
+------+------+
|007|first|
+------+------+
|110|second|
+------+------+
3rowsinset(0.00sec)
=============================
两条新记录都已经存在

然后,检查从数据库服务器
mysql>select*fromfirst_tb;
=============================
+------+------+
|id|name|
+------+------+
|1|myself|
+------+------+
1rowsinset(0.00sec)
=============================
没有新记录存在

由此验证,我们已经实现了MySQL读写分离,目前所有的写操作都全部在Master主服务器上,用来避免数据的不同步;
另外,所有的读操作都分摊给了其它各个Slave从服务器上,用来分担数据库压力。