MYSQL-Proxy简介

Mysql Proxy是一个处于你的client端和Mysql server端之间的简单程序,它可以监测、分析或改变它们的通信。它使用灵活,没有限制,常见的用途包括:负载平衡,故障、查询分析,查询过滤和修改等等。

Mysql Proxy就是这么一个中间层代理,简单的说,Mysql Proxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用lua脚本,可以实现复杂的连接控制和过滤,从而实现读写分离和负载平衡。对于应用来说,Mysql Proxy是完全透明的,应用则只需要连接到Mysql Proxy的监听端口即可。当然,这样proxy机器可能成为单点失效,但完全可以使用多个proxy机器做为冗余,在应用服务器的连接池配置中配置到多个proxy的连接参数即可。

MYSQL-Proxy更强大的一项功能是实现"读写分离",基本原理是让主数据库处理事务性查询,让从库处理SELECT查询。数据库复制被用来把事务性查询导致的变更同步到集群中的从库。

工作拓扑图:

MYSQL-Proxy读写分离部署_lua

MYSQL-Proxy安装部署(需要基于mysql主从,这里就不部署了,可以参考我的另外一篇文章:MYSQL主从复制配置)

1)下载MYSQL-Proxy源码包、安装(这里采用0.8.5版本(已停止更新)

[root@localhost ~]# wget –c http://mirrors.yangxingzhen.com/mysql-proxy/mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz

[root@localhost ~]# tar zxf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz

[root@localhost ~]# mv mysql-proxy-0.8.5-linux-el6-x86-64bit /usr/local/mysql-proxy

2)创建软连接、mysql-proxy用户

[root@localhost ~]# ln -s /usr/local/mysql-proxy/bin/* /usr/bin

[root@localhost ~]# useradd -s /sbin/nologin mysql-proxy

3)修改读写分离配置文件

[root@localhost ~]# vim /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua

MYSQL-Proxy读写分离部署_lua_02

MYSQL-Proxy会检测客户端连接,当连接没有超过min_idle_connections预设值时, 不会进行读写分离, 即查询操作会发生到Master上

4)启动MYSQL-Proxy中间件

MYSQL-Proxy服务器:192.168.8.3

账号:admin

密码:admin

192.168.8.5(主库,负责写)

192.168.8.6(从库,负责读)

  1. [root@localhost ~]# /usr/local/mysql-proxy/bin/mysql-proxy --daemon --log-level=debug --user=mysql-proxy --keepalive --log-file=/var/log/mysql-proxy.log --plugins="proxy" --proxy-backend-addresses="192.168.8.5:3306" --proxy-read-only-backend-addresses="192.168.8.6:3306" --proxy-lua-script="/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua" --plugins="admin" --admin-username="admin" --admin-password="admin" --admin-lua-script="/usr/local/mysql-proxy/lib/mysql-proxy/lua/admin.lua"

5)MYSQL-Proxy的相关参数详解如下

--help-all                                                 //获取全部帮助信息;

--proxy-address=host:port                   //代理服务监听的地址和端口,默认为4040;

--admin-address=host:port                  //管理模块监听的地址和端口,默认为4041;

--proxy-backend-addresses=host:port           //后端mysql服务器的地址和端口;

--proxy-read-only-backend-addresses=host:port        //后端只读mysql服务器的地址和端口;

--proxy-lua-script=file_name                //完成mysql代理功能的Lua脚本;

--daemon                                                //以守护进程模式启动mysql-proxy;

--keepalive                                              //在mysql-proxy崩溃时尝试重启之;

--log-file=/path/to/log_file_name        //日志文件名称;

--log-level=level                                    //日志级别;

--log-use-syslog                                    //基于syslog记录日志;

--plugins=plugin                                   //在mysql-proxy启动时加载的插件;

--user=user_name                                //运行mysql-proxy进程的用户;

--defaults-file=/path/to/conf_file_name     //默认使用的配置文件路径,其配置段使用[mysql-proxy]标识;

--proxy-skip-profiling                                   //禁用profile;

--pid-file=/path/to/pid_file_name               //进程文件名;

其中4040为proxy代理端口用于WEB应用连接,4041为管理端口用于SA或者DBA管理

6)查看端口

[root@localhost ~]# netstat -lntup | grep mysql-proxy

[root@localhost ~]# ps -ef | grep mysql-proxy

MYSQL-Proxy读写分离部署_mysql_03

7)基于4041端口MYSQL-Proxy查看读写分离状态,登录4041管理端口

[root@localhost ~]# mysql -h192.168.8.3 -uadmin -padmin -P4041 -e "select * from backends;"

MYSQL-Proxy读写分离部署_lua_04

查看读写分离状态up则正常

8)如果状态不是up,则需要登陆到4040端口(这个端口的账户密码为数据库授权的账户密码discuz,discuz )

[root@localhost ~]# mysql -h192.168.8.3 -udiscuz -pdiscuz -P4040 -e "show databases;" #多执行这条命令,直至unknown变成up

MYSQL-Proxy读写分离部署_mysql_05

[root@localhost ~]# mysql -h192.168.8.3 -uadmin -padmin -P4041 -e "select * from backends;"

MYSQL-Proxy读写分离部署_lua_06

9)测试读写分离是否成功

读写分离数据测试,登录到从库,进行数据写入和测试,在从库上discuz库创建test表,并写入内容

mysql> use discuz;

mysql> create table test (id varchar(20),name varchar(20));

mysql> insert into test value (1,'yangxz');

mysql> select * from test;

MYSQL-Proxy读写分离部署_mysql_07

用4040端口登陆查看(测试读)

[root@localhost ~]# mysql -h192.168.8.3 -udiscuz -pdiscuz -P4040 -e 'select * from discuz.test;'

MYSQL-Proxy读写分离部署_mysql_08

能查到上面test这个表的信息,则说明读是走的是从库,因为主库上面是没有刚刚新建的这个表信息的

10)安装完discuz论坛后,需要改一下数据库端口的配置

[root@localhost ~]# vim /usr/local/apache/htdocs/config/config_global.php (源码安装apache路径)

[root@localhost ~]# vim /var/www/html/config/config_global.php (yum安装httpd路径)

把原来主库的IP改成192.168.8.3:4040,保存退出即可~~

MYSQL-Proxy读写分离部署_mysql_09