1. mysql proxy 简介
- mysql-proxy是mysql官方提供的mysql中间件服务,上游可接入若干个mysql-client,后端可连接若干个mysql-server。
它使用mysql协议,任何使用mysql-client的上游无需修改任何代码,即可迁移至mysql-proxy上。
mysql-proxy最基本的用法,就是作为一个请求拦截,请求中转的中间层:
进一步的,mysql-proxy可以分析与修改请求。拦截查询和修改结果,需要通过编写Lua脚本来完成。
mysql-proxy允许用户指定Lua脚本对请求进行拦截,对请求进行分析与修改,它还允许用户指定Lua脚本对服务器的返回结果进行修改,加入一些结果集或者去除一些结果集均可。
所以说,根本上,mysql-proxy是一个官方提供的框架,具备良好的扩展性,可以用来完成:
sql拦截与修改
性能分析与监控
读写分离
请求路由等
读写分离实例
1)我们在进行web开发的时候,往往一台MySQL服务器是不够用的,可能需要多台,web到底连接哪个数据库?
这要程序员自己写的代码来决定的,现在是二台mysql服务器,如果有多台或者是N台呢,靠用php代码来管理连接数据库,就太过繁琐
2)mysql proxy就很好解决了这个问题,对于程序端而言,web端的请求,只要到mysql proxy的连接池就OK了,剩下的工作就交给mysql proxy了。对于程序代码管理来说就简单多了。
基于主从复制进行 mysql 的读写分离
主重复制的相关信息可参看的我博客mysql主从复制(基于GTID的主从复制、并行复制、半同步复制)
注:
以下实验是基于mysql 基于GTID 的半同步复制模式进行的在此条件下进行的
实验拓扑
master:server11:IP 172.25.21.11
slave:server12:IP 172.25.21.12
mysql proxy :server13:IP 172.25.21.13
mysql 版本:5.7.17-1.el6.x86_64
musql-proxy 版本:mysql-proxy-0.8.5-linux-el6-x86-64
2. 进行mysql proxy的安装配置
将mysql-proxy安装包进行解压,并移动到指定目录下
[root@serve13 mnt]# tar zxf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
[root@serve13 mnt]# mv mysql-proxy-0.8.5-linux-el6-x86-64bit /usr/local/mysql-proxy
进行mysql-proxy配置文件的编写
编辑配置文件
[root@serve13 ~]# vim /etc/mysql-proxy.conf
[mysql-proxy]
user=root
proxy-address=0.0.0.0:3306 # 本机监听的地址及端口
proxy-backend-addresses=172.25.21.11:3306
# 配置读写服务器,IP及端口
proxy-read-only-backend-addresses=172.25.21.12:3306
# 配置只读服务器,IP及端口
proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
# 用这个lua脚本来实现读写分离
admin-lua-script=/usr/local/mysql-proxy/lib/mysql-proxy/lua/admin.lua
# admin模块的lua脚本
log-file=/usr/local/mysql-proxy/logs/mysql-proxy.log
# 服务日志
log-level=debug # 日志模式设置为debug模式,方便调试
keepalive=true # 持续连接
daemon=true # 打入后台
在/usr/local/mysql-proxy/路径中建立对应的logs目录,否则在开启服务时会出现报错
还要将mysql-proxy的配置文件的权限修改为660,否则在开启服务器时会有权限问题。
[root@serve13 ~]# mkdir /usr/local/mysql-proxy/logs/
[root@serve13 ~]# chmod 660 /etc/mysql-proxy.conf
编辑读写分离的lua脚本,方便实验观测(生产环境中不需要此操作)
[root@serve13 mysql-proxy]# vim share/doc/mysql-proxy/rw-splitting.lua
第38行
-- connection pool
if not proxy.global.config.rwsplit then
proxy.global.config.rwsplit = {
min_idle_connections = 1, --4
# 最小连接数,默认值为4
max_idle_connections = 1, --8
# 最大连接数后实现读写分离,默认值为
is_debug = false
}
end
3. 启动服务,并进行测试
直接执行安装包中的命令进行启动服务
[root@serve13 bin]# /usr/local/mysql-proxy/bin/mysql-proxy --help
# 查看启动时调用的参数
[root@serve13 bin]# /usr/local/mysql-proxy/bin/mysql-proxy \
> --plugins=admin \ # 模块选择
> --plugins=proxy \
> --defaults-file=/etc/mysql-proxy.conf \ # 指定配置文件
> --admin-username=root \ # admin 模块指定的启动用户
> --admin-password=redhat # admin 模块启用的密码
查看进程及启动日志
[root@serve13 bin]# ps ax # 查看进程是否启用
[root@serve13 bin]# cat /usr/local/mysql-proxy/logs/mysql-proxy.log
# 通过日志查看运行状态
ps ax
日志内容
可通过admin 模块来查看proxy 的后端情况
通过 tcpdump,lsof 命令来查看数据包走向