简介
mysql-proxy是处在mysql数据库client和mysql server之间的程序,可以用来分析、监控和变换(transform)通信数据。支持嵌入性脚本语言Lua,支持广泛的使用场景:负载平衡,故障、查询分析,查询过滤和修改等。
mysql-proxy更强大的一项功能是实现”读写分离(Read/Write Splitting)”。基本的原理是让主数据库处理事务性查询,而从数据库处理SELECT查询。数据库复制被用来把事务性查询导致的变更同步到集群中的从数据库。
基本环境
192.168.1.60 master
192.168.1.144 slave
192.168.1.63 proxy
主从同步
请参考文章Mysql 数据库主从同步(Master-Slave)
mysql-proxy配置
mysql-proxy命令介绍,使用mysql-proxy –help-all可以查看命令全部帮助,以下为一些常用参数介绍:
参数 | 作用 |
---|---|
–proxy-address | 指定代理服务监听的地址和端口(默认是4040),简写为-P |
–admin-address | 指定管理主机地址和端口(默认是4041) |
–proxy-backend-addresses | 指定后端mysql服务器的地址和端口(master),简写为-b |
–proxy-read-only-backend-addresses | 指定后端只读mysql服务器的地址和端口(slave),缩为-r |
–proxy-lua-script | 指定mysql代理功能的Lua脚本文件 |
–daemon | 以守护进程模式启动mysql-proxy |
–defaults-file | 指定配置文件路径 |
–log-file | 指定日志文件路径 |
–log-level | 指定日志级别有error,warning,info,message,debug |
–user | 指定运行mysql-proxy进程的用户 |
–admin-username | 指定登录到mysql-proxy管理界面的用户名 |
–admin-password | 指定登录到mysql-proxy管理界面的用户密码 |
–admin-lua-script=script-file | 管理模块的lua脚本文件路径(创建管理接口) |
–plugins | 加载插件(admin,proxy) |
–proxy-lua-script | 指定读写分离脚本位置 |
–admin-lua-script | 指定管理界面脚本位置 |
创建mysql-proxy的配置文件,如/etc/mysql-proxy.conf,配置内容如下:
[mysql-proxy]
#以守护进程方式运行
daemon=true
#mysql-proxy崩溃时,尝试重启
keepalive=true
#定义log日志级别,由高到低分别有(error|warning|info|message|debug)
log-level=debug
pid-file=/var/run/mysql-proxy.pid
log-file=/var/log/mysql-proxy.log
#指定mysql-proxy的监听地址,不加端口,默认4040
#proxy-address=0.0.0.0:4000
#设置后台主服务器
proxy-backend-addresses=192.168.1.60:3306
#设置后台从服务器
proxy-read-only-backend-addresses=192.168.1.144:3306
#设置读写分离脚本路径
proxy-lua-script=/usr/lib/mysql-proxy/lua/rw-splitting.lua
#设置mysql-proxy管理地址,需要admin插件
#admin-address=0.0.0.0:4001
#设置登录管理地址用户
admin-username=root
#设置管理用户密码
admin-password=admin
#设置管理后台lua脚本路径,改脚本默认没有要自动定义
admin-lua-script=/usr/lib/mysql-proxy/lua/admin.lua
rw-splitting.lua配置:
--- config
--
-- connection pool
if not proxy.global.config.rwsplit then
proxy.global.config.rwsplit = {
min_idle_connections = 1, -- 默认4
max_idle_connections = 1, -- 默认8
is_debug = false
}
end
启动mysql-proxy,执行:
mysql-proxy --default-file=/etc/mysql-proxy.cnf
查看监听的端口:
显示日志:
在主服务器上创建连接用户proxy(因主从同步,从服务器也创建了此用户):
grant all privileges on test.* to 'proxy'@'192.168.1.%' identified by '123456';
登录管理地址查看当前状态:
mysql -uproxy -p -h192.168.1.63 -P4000
显示结果如下:
若没有用户通过mysql-proxy连接到后端,则状态为unknown,尝试几次后,可以看到两个服务器状态都是up,
测试读写分离
测试登陆账号proxy@192.168.1.%进行添加数据,即在客户端执行:
mysql -h192.168.1.63 -uproxy -p123456 -P4000
1、正常情况下,插入数据
mysql> use test;
mysql> insert into user (`id`, `name`, `age`) values(2, 'jack', 20);
登录主从服务器mysql客户端查看对应的表中均可看到插入相同的数据信息
2、关闭从服务,即stop slave
1)证明写分离
mysql> use test;
mysql> insert into user (`id`, `name`, `age`) values(3, 'joey', 20);
此时登录主从mysql客户端:
主服务器显示:
从服务器显示:
上述可以看出通过mysql-proxy插入的数据只写入到配置的主服务器mysql中
2)证明读分离
插入数据后再次查看,此时看到的仅仅是从库的信息:
上述可以看出实现了读分离
注意
如果日志中提示 (debug) [network-mysqld.c:1134]: error on a connection (fd: -1 event: 0). closing client connection.
可以修改 rw-splitting.lua中的min_idle_connections和max_idle_connections的值,将其调大