mysql proxy 介绍
MySQL Proxy是一个处于你的client端和MySQL server端之间的简单程序,它可以监测、分析或改变它们的通信。它使用灵活,没有限制,常见的用途包括:负载平衡,故障、查询分析,查询过滤和修改等等。
MySQL Proxy就是这么一个中间层代理,简单的说,MySQL Proxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用lua脚本,可以实现复杂的连接控制和过滤,从而实现读写分离和负载平衡。对于应用来说,MySQL Proxy是完全透明的,应用则只需要连接到MySQL Proxy的监听端口即可。当然,这样proxy机器可能成为单点失效,但完全可以使用多个proxy机器做为冗余,在应用服务器的连接池配置中配置到多个proxy的连接参数即可
服务器说明:
192.168.1.100 (主库)
192.168.1.101 (从库)
192.168.1.100 (mysql proxy)
mysql proxy安装
前往mysql官网下载软件包,我这里的平台是centos 6.5,64位操作系统,所以下载http://cdn.mysql.com/archives/mysql-proxy/mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz,这个下载的是已编译的文件,解压即可使用。
查看操作系统版本信息:
[root@iZ23rter8cjZ /]# uname -a
Linux iZ23rter8cjZ 2.6.32-573.22.1.el6.x86_64 #1 SMP Wed Mar 23 03:35:39 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
[root@iZ23rter8cjZ /]# getconf LONG_BIT
64
解压安装:
[root@iZ23rter8cjZ ~]# tar -zxvf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
[root@iZ23rter8cjZ ~]# cd mysql-proxy-0.8.5-linux-el6-x86-64bit
[root@iZ23rter8cjZ mysql-proxy-0.8.5-linux-el6-x86-64bit]# ls
bin include lib libexec licenses share
[root@iZ23rter8cjZ ~]# cp mysql-proxy-0.8.5-linux-el6-x86-64bit /usr/local/mysql/proxy/
[root@iZ23rter8cjZ ~]# cd /usr/local/mysql/proxy/
配置环境变量
[root@iZ23rter8cjZ proxy]# vim ~/.bash_profile
#添加:/usr/local/mysql/proxy/bin
PATH=$PATH:$HOME/bin:/usr/local/mysql/proxy/bin
#保存退出,读取环境变量
[root@iZ23rter8cjZ proxy]# source ~/.bash_profile
把lua,读写分离脚本拷贝lua目录
[root@iZ23rter8cjZ proxy]# cp /usr/local/mysql/proxy/share/doc/mysql-proxy/rw-splitting.lua /usr/local/mysql/proxy/lib/mysql-proxy/lua/
编辑rw-splitting.lua脚本
默认最小4个(最大8个)以上的客户端连接才会实现读写分离, 现改为最小1个最大1
个,便于读写分离的测试。
注:在读写分离测试时,需要开启多个窗口连接mysql-proxy
这是因为mysql-proxy会检测客户端连接, 当连接没有超过min_idle_connections
预设值时, 不会进行读写分离, 即查询操作会发生到Master上
就像这样子:
开启防火墙
在192.168.1.100和192.168.1.101上都设置
-A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 4040 -j ACCEPT
重启防火墙设置:
[root@iZ23rter8cjZ lua]# service iptables restart
iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Flushing firewall rules: [ OK ]
iptables: Unloading modules: [ OK ]
iptables: Applying firewall rules: [ OK ]
设置LUA_PATH变量
注:对于此变量也可不设置。可在mysql-proxy启动脚本中配置。
在/etc/profile中添加如下内容
LUA_PATH="/usr/local/mysql/proxy/lib/mysql-proxy/lua/?.lua"
export LUA_PATH
执行mysql-proxy -V显示如下结果,显示mysql proxy的lua脚本路径
[root@iZ23rter8cjZ lua]# mysql-proxy -V
mysql-proxy 0.8.5
chassis: 0.8.5
glib2: 2.16.6
libevent: 2.0.21-stable
LUA: Lua 5.1.4
package.path: /usr/local/mysql/proxy/lib/mysql-proxy/lua/?.lua
package.cpath: /usr/local/mysql/proxy/lib/mysql-proxy/lua/?.so;
-- modules
proxy: 0.8.5
登录主库192.168.1.100和从库192.168.1.101给mysq-proxy登录用户授权
授权
grant all privileges on *.* to 'mysql-proxy'@'%' identified by '123456';
刷新权限
flush privileges;
mysql proxy 命令简介
–help-all ———— 用于获取全部帮助信息
–proxy-address=host:port ———— 代理服务监听的地址和端口(缺省是4040)
–admin-address=host:port ———— 指定管理主机地址和端口(缺省是4041)
–proxy-backend-addresses=host:port ——后端mysql服务器的地址和端口(主服务器)
简写:-b
–proxy-read-only-backend-addresses=host:port ———— 后端只读mysql服务器的地址和端口(从服务器)简写:-r
–proxy-lua-script=file ———— 指定mysql代理功能的Lua脚本文件 –daemon ———— 以守护进程模式启动mysql-proxy
–defaults-file=/path/to/conf_file_name ———— 默认使用的配置文件路径
–log-file=/path/to/log_file_name ———— 日志文件名称
–log-level=level ———— 日志级别
–user=user_name ———— 运行mysql-proxy进程的用户
–admin-username=user ———— 指定登录到mysql-proxy管理界面的用户名 –admin-password=pass ———— 指定登录到mysql-proxy管理界面的用户密码
–admin-lua-script=script-file ————管理模块的lua脚本文件路径(创建管理接口)
–plugins=admin ———— 加载管理插件
可以是用mysql-proxy –help 查看帮助
开关选项启动 mysql-proxy
mysql-proxy --daemon --log-level=debug \
--log-file=/var/log/mysql-proxy.log \
--plugins=proxy -b 192.168.1.100:3306 -r 192.168.1.101:3306 \
--proxy-lua-script=/usr/local/mysql/proxy/lib/mysql-proxy/lua/rw-splitting.lua \
--plugins=admin --admin-username=admin \
--admin-password=admin \
--admin-lua-script=/usr/local/mysql/proxy/lib/mysql-proxy/lua/admin.lua
查看启动日志:
测试读写分离
mysql -umysql-proxy -p123456 -h192.168.1.100 -P4040
注意:这里需要多开几个终端,连接mysql-proxy
先登录mysql-proxy管理界面
mysql -uadmin -padmin -h192.168.1.100 -P4041
select * from backends;
mysql> select * from backends;
+-----------+-----------------+-------+------+------+-------------------+
| backend_ndx | address | state | type | uuid | connected_clients |
+-----------+-----------------+-------+------+------+-------------------+
| 1 | 192.168.1.100:3306 | up | rw | NULL | 0 |
| 2 | 192.168.1.101:3306 | up | ro | NULL | 0 |
+-----------+-----------------+-------+------+------+-------------------+
2 rows in set (0.00 sec)
state:up时才能经行读写分离,所以需要多开几个连接,查看这个状态。
之前创建了数据库repl_db和repl_table,注意两个数据库都需要创建同样的数据表
create database repl_db charset=utf8;
use repl_db;
CREATE TABLE `repl_table` (
`f1` int(11) DEFAULT NULL,
`f2` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
mysql> insert into repl_table(f1,f2) values('1','one');
Query OK, 1 row affected (0.01 sec)
mysql> select * from repl_db.repl_table;
Empty set (0.02 sec)
发现查询为空,先不着急,mysql连接主库查看一下,登录192.168.1.100连接主库。
mysql -uroot -p123456
mysql> select * from repl_db.repl_table;
+------+------+
| f1 | f2 |
+------+------+
| 1 | one |
+------+------+
1 row in set (0.00 sec)
结果有数据。恭喜你,配置成功。