Fork me on GitHub

MySQL Proxy

简介

      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-config

显示日志:
proxy-log

在主服务器上创建连接用户proxy(因主从同步,从服务器也创建了此用户):

grant all privileges on test.* to 'proxy'@'192.168.1.%' identified by '123456';

登录管理地址查看当前状态:

mysql -uproxy -p -h192.168.1.63 -P4000   

显示结果如下:
proxy-client-conn
若没有用户通过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

proxy-stop-slave

1)证明写分离

mysql> use test;
mysql> insert into user (`id`, `name`, `age`) values(3, 'joey', 20);

此时登录主从mysql客户端:

主服务器显示:
proxy-master

从服务器显示:
proxy-slave

上述可以看出通过mysql-proxy插入的数据只写入到配置的主服务器mysql中

2)证明读分离

插入数据后再次查看,此时看到的仅仅是从库的信息:

proxy-read

上述可以看出实现了读分离

注意
如果日志中提示 (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的值,将其调大

轻轻的我走了,正如我轻轻的来