Centos5.6MySQL Proxy0.8.2的安装及测试

参考: http://www.hake.cc/a/shujuku/mysql/2012/0323/46760.html
Mysql-proxy就是一个中间层代理,简单的说, mysql proxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用lua脚本,可以实现复杂的连接控制和过滤,从而实现读写分离和负载均衡。对于应用来说,mysql-proxy是完全透明的,应用则只需要连接到mysql proxy的监听端口即可。当然,这样proxy机器可能成为单点失效,但完全可以使用多个proxy机器做为冗余,在应用服务器的连接池中配置到多个proxy的连接参数即可。Mysql proxy更强大的一项功能是实现“读写分离”,基本原理是让主数据库处理事务性查询,让从库处理select查询。数据库复制被用来把事务性查询导致的变更同步到集群中的从库。在生成mysql的M-S结构后,为了实现读写分离,需要使用mysql proxy。
Mysql proxy目前应用的生产环境
1. 现实中很多应用环境是这样:在程序开发初期没有规划好,程序读写数据都只提供一个 IP接口,后期由于压力顶不住,公司要求后来的系统架构师/DBA将公司的数据库架构更改,这样在程序上实现比较困难,所以加进此中间层来实现。
2. 建议大家还是将其应用中小型网站,特别是读比较频繁的网站。如果是大型网站或门户网站的网站,建议读写分离还是从开发层面实现。
3. 建议大家采用 mysql proxy0.8.0以上的版本,它修正了以前不少bug,而且稳定性也不错。
Mysql proxy 0.8.2的安装步骤如下:
目前官方网站上是 0.8.3的版本( http://dev.mysql.com/downloads/mysql-proxy/),我采用的是 0.8.2.
Mysql proxy0.8.2安装之前有先决条件如下:
libevent 1.x 或更高             (libevent-2.0.13-stable.tar.gz)
glib2 2.6.0 或更高              (glib-2.22.5.tar.gz)
lua 5.1.x 或更高                (lua-5.1.4.tar.gz)
pkg-config                  yum安装……)
libtool 1.5 或更高              (yum安装……)
下载地址: http://monkey.org/~provos/libevent-2.0.13-stable.tar.gz
http://ftp.gnome.org/pub/gnome/sources/glib/2.18/glib-2.18.4.tar.gz
ftp://ftp.cwru.edu/pub/bash/readline-6.1.tar.gz
http://www.lua.org/ftp/lua-5.1.4.tar.gz
服务器操作系统: CentOS 6.2 x86_64
Mysql proxy环境设置说明:
Mysql proxy服务器: 192.168.2.6
Mysql master服务器: 192.168.2.5
Mysql slave服务器: 192.168.2.4
i.       为了加速安装进度,我们可以先 yum安装必须的库,同时解决pkg-config、libtool和mysql开发库,由于mysql proxy实际并不需要在本机运行mysql实例,所以我们这里用yum安装,命令如下:
#yum –y install gcc gcc-c++ autoconf mysqldevel libtool pkgconfig ncurses ncurses-devel
ii.           安装 libevet
#tar zxvf libevent-2.0.13-stable.tar.gz
#cd libevent-2.0.13-stable
#./configure
#make && make install
iii.          安装 glib
#tar zxvf glib-2.22.5.tar.gz
#cd glib-2.22.5
#./configure
#make && make install
iv.          安装 readline
#tar zxvf readline-6.1.tar.gz
#cd readline-6.1
#./configure
#make && make install
为了让动态链接库为系统所共享,我们这里用 ldconfig
#ldconfig –v
用此选项, ldconfig将显示正在扫描的目录及搜索到的动态链接库,还有它所创建的连接的名字
v.           安装 lua
#tar zxvf lua-5.1.4.tar.gz
#cd lua-5.1.4
64位系统,需在 CFLAGS里加上-fPIC,我们用vim编辑下src/Makefile文件,修改代码如下:
CGLAGS= -O2 –Wall –Fpic $(MYCFLAGS)
#make linux && make install
vi.      配置 pkg-config环境变量,命令如下:
#cp etc/lua.pc /usr/local/lib/pkgconfig
#export PKG_CONFIG_PATH=$PKG_COFNIG_PATH:/usr/local/lib/pkgconfig
以上操作就完成了基本文件安装
mysql proxy0.8.2的安装
vii.    #tar zxvf mysql-proxy-0.8.2.tar.gz
#cd mysql-proxy-0.8.2
#./configure –prefix=/usr/local/mysql-proxy
#make && make install
#cp lib/rw-splitting.lua /usr/local/lib
#cp lib/admin.lua /usr/local/lib
到这里 mysql-proxy已基本安装完成,接下来就是mysql proxy的配置和测试了
a. mysql proxy选项说明,大家可以用 mysql-proxy –help-all 查看它的帮助选项,命令如下:
#/usr/local/mysql-proxy/bin/mysql-proxy –help-all
代理功能选项:
-P, --proxy-address=mysql-proxy服务器的监听端口,缺省是4040,建议改为3306,方便开发人员写代码。
-r, --proxy-read-only-backend- addresses =只读 slave的地址和端口;
-b, --proxy-backend- addresses =远程 master地址和端口;
-s, --proxy-lua-script=指定一个 lua脚本来控制mysql proxy的运行和设置,这个脚本在每次新建连接和脚本发生修改的时候讲重新调用;
其他选项:
--defaults-file=配置文件,可以把 mysql proxy的参数信息置入一个配置文件里,比较方便;
--daemon mysql proxy以守护进程方式运行;
--pid-file=设置 mysql proxy的存储PID文件的路径;
--keepalive保持连接启动进程会有 2个,一号进程用来监视 二号进程,如果二号进程死掉重启proxy,这是新版本mysql proxy增加的keepalived功能,它修正了以前mysql proxy容易死掉的bug,建议开启。
Mysql proxy配置文件如下:
[root@CentOS bin]# cat /etc/mysql-proxy.cnf
[mysql-proxy]
admin-username=root
admin-password=123456
admin-lua-script=/usr/local/lib/admin.lua
proxy-read-only-backend-addresses=192.168.2.4
proxy-backend-addresses=192.168.2.5
proxy-lua-script=/usr/local/lib/rw-splitting.lua
log-file=/usr/local/mysql-proxy/mysql-proxy.log
log-level=debug
daemon=true
keepalive=true
b. 给相关服务器授权
master/slave上各建立一个用户,之后客户端发送的SQL都是通过mysql-proxy服务器来转发,所以要保证可以从mysql-proxy服务器登录master和slave:
192.168.2.5和192.168.2.4上均执行此命令:
Mysql>grant all privileges on *.* to root@’192.168.2.6’ identified by ‘123456’;
Mysql>flush privileges;
添加完用户之后,开始启动 mysql-proxy,进行测试。
注:启动之前需将mysql-proxy.cnf配置文件的权限设为600(chomd 600 /etc/mysql-proxy.cnf),否则会报错提示。
    #/usr/local/mysql-proxy/bin/mysql-proxy –P 192.168.2.6:4040 --default-file=/etc/mysql-proxy.cnf
此时可以查看进行,有两个
[root@CentOS bin]# ps ax | grep mysql-proxy
31168 ?         S      0:00 /usr/local/mysql-proxy/bin/mysql-proxy -P 192.168.2.6:4040 --defaults-file=/etc/mysql-proxy.cnf
31169 ?         S      0:17 /usr/local/mysql-proxy/bin/mysql-proxy -P 192.168.2.6:4040 --defaults-file=/etc/mysql-proxy.cnf
此时可以查看 mysql-proxy的日志文件:
2012-12-27 13:04:17: (message) Initiating shutdown, requested from signal handler
2012-12-27 13:04:18: (message) shutting down normally, exit code is: 0
2012-12-27 13:04:18: (debug) chassis-unix-daemon.c:167: 31169 returned: 31169
2012-12-27 13:04:18: (message) chassis-unix-daemon.c:176: [angel] PID=31169 exited normally with exit-code = 0 (it used 1 kBytes max)
2012-12-27 13:04:18: (message) Initiating shutdown, requested from mysql-proxy-cli.c:604
2012-12-27 13:04:18: (message) shutting down normally, exit code is: 0
2012-12-27 13:04:28: (message) chassis-unix-daemon.c:136: [angel] we try to keep PID=31409 alive
2012-12-27 13:04:28: (debug) chassis-unix-daemon.c:157: waiting for 31409
2012-12-27 13:04:28: (debug) chassis-unix-daemon.c:121: we are the child: 31409
2012-12-27 13:04:28: (message) mysql-proxy 0.8.2 started
2012-12-27 13:04:28: (debug) max open file-descriptors = 1024
2012-12-27 13:04:28: (message) proxy listening on port 192.168.2.6:4040
2012-12-27 13:04:28: (message) added read/write backend: 192.168.2.5
2012-12-27 13:04:28: (message) added read-only backend: 192.168.2.4
接下来便是测试 mysql proxy的读写功能了,为了快速看到效果,先在修改下rw-splitting.lua。
-- connection pool
if not proxy.global.config.rwsplit then
        proxy.global.config.rwsplit = {
                min_idle_connections = 1,   //默认为 4
                max_idle_connections = 2,   //默认为 8
 
                is_debug = true      //默认为 false
        }
end
修改完成后,重启 mysql-proxy。
测试读写分离效果
登录主数据库服务器: 192.168.2.5,为了清晰的看到读写分离的效果,需要暂时关闭mysql主从复制的功能。在主mysql数据库中的test数据库常见表,并插入数据
Mysql>use test;
Database changed
Mysql>create table first_tb(id int(3),name char(10));
Query Ok,1 row affected(0.00 sec)
Mysql>insert into first_tb values (1,’myself’);
Query Ok, 1 row affected (0.00 sec)
mysql>select * from first_tb;
+------+-------+
| id    | name |
+------+-------+
|     1 | myself |
+------+-------+
1 row in set (0.00 sec)
在从 192.168.2.4mysql数据库中的test中创建表并插入数据
mysql>use test;
Database changed
mysql>create table first_tb(id int(3),name char(10));
Query Ok, 1 row affected (0.00 sec)
mysql>insert into first_tb values (2,'yours');
Query Ok, 1 row affected (0.00 sec)
mysql>select * from first_tb;
+------+-------+
| id    | name |
+------+-------+
|     2 | yours |
+------+-------+
1 row in set (0.00 sec)
此时在 mysql-proxy192.168.2.6服务器上登录
#mysql –uroot –p123456 –h192.168.2.6 –P4040
mysql> select * from test.first_tb;
+------+--------+
| id    | name   |
+------+--------+
|     1 | myself |
+------+--------+
4 rows in set (0.00 sec)
显示读取的数据为 192.168.2.5主数据库中的数据,再重新打开一个mysql-proxy终端同样select一下
#mysql –uroot –p123456 –h192.168.2.6 –P4040
mysql> select * from test.first_tb;
+------+--------+
| id    | name   |
+------+--------+
|     2 | yours |
+------+--------+
4 rows in set (0.00 sec)
再打开终端请求过来, select全部到192.168.2.4从库上去查询。此时在mysql-proxy上插入一条数据;
#mysql -uroot -ppassword -h192.168.2.6 -P4040 test
mysql> use test;
mysql>insert into first_tb values (110,'second');
然后分别去主从服务器上查看信息
mysql> select * from first_tb; (主 192.168.2.5)
+------+--------+
| id    | name   |
+------+--------+
|     1 | myself |
| 110 | second |
+------+--------+
4 rows in set (0.00 sec)
mysql> select * from first_tb; (从 192.168.2.4)
+------+--------+
| id    | name   |
+------+--------+
|     2 | yours |
+------+--------+
4 rows in set (0.00 sec)
可见写到主数据库( 192.168.2.5)中了,读写分离完成!
由此,我们已经实现了 mysql读写分离,目前所有的写操作都全部在master主服务器上,用来避免数据的不同步;
另外,所有的读操作都分摊给了 slave从服务器,分担数据库的压力;