Mysql-proxy实现读写分离
目录环境说明
Mysql-proxy简介
mysql-proxy是官方提供的mysql中间件产品可以实现负载平衡,读写分离,failover等
MySQL Proxy就是这么一个中间层代理,简单的说,MySQL Proxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用lua脚本,可以实现复杂的连接控制和过滤,从而实现读写分离和负载平衡。对于应用来说,MySQL Proxy是完全透明的,应用则只需要连接到MySQL Proxy的监听端口即可。
当然,这样proxy机器可能成为单点失效,但完全可以使用多个proxy机器做为冗余,在应用服务器的连接池配置中配置到多 个proxy的连接参数即可。
从图中可以看到,SQL语句并不直接进入到master数据库或者slave数据库,而是进入到 proxy,然后proxy判断这条语句是有关写的语句(包括insert、update、delete)还 是读语句(select),当是写语句的时候,那么proxy将向master所在的服务器发出请 求,同理,如果是读语句的时候,proxy将向slave所在的服务器发出请求。
应用背景:在开发工作中,有时候会遇见某个sql 语句需要锁表,导致暂时不能使用读的服务,这样就会影响现有业务,使用主从复制,让主库负责写,从库负责读,这样即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作。
部署mysql-proxy服务
1.部署前先部署好117/118的主从架构
2.在116上部署mysql-proxy
tar -zxvf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz -C /usr/local
mv mysql-proxy-0.8.5-linux-el6-x86-64bit mysql-proxy
3.创建配置文件(注意:这里必须要将所有的注释删除掉,不然启动会报错)
vi /etc/mysql-proxy.conf
[mysql-proxy]
proxy-address=0.0.0.0:3306
proxy-backend-addresses=192.168.1.118:3306
proxy-read-only-backend-addresses=192.168.1.117:3306
proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
pid-file=/usr/local/mysql-proxy/log/mysql-proxy.pid
log-file=/usr/local/mysql-proxy/log/mysql-proxy.log
plugins=proxy
log-level=debug
keepalive=true
daemon=true
参数说明:
[mysql-proxy]
proxy-address=0.0.0.0:3306 #监听本机中所有IP的端口。
proxy-backend-addresses=172.25.60.1:3306 #进行写的数据库server1
proxy-read-only-backend-addresses=172.25.60.2:3306
proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
pid-file=/usr/local/mysql-proxy/log/mysql-proxy.pid #pid文件
log-file=/usr/local/mysql-proxy/log/mysql-proxy.log #生成日志文件
plugins=proxy #proxy插件
log-level=debug #日志等级为debug
keepalive=true #心跳检测
daemon=true #守护进程
创建目录
mkdir /usr/local/mysql-proxy/log
- 通过修改lua脚本实现读写分离
修改lua脚本,默认超过4个连接才会启用读写分离,改为超过2个连接启用读写分离
vim /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
min_idle_connections = 1,
max_idle_connections = 2,
5.启动mysql-proxy
在启动前我们需要为配置文件加上660权限,没有修改权限,则会报错
chmod 660 /etc/mysql-proxy.conf
/usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/etc/mysql-proxy.conf
6.测试远程登录mysql-proxy服务端能否同步
如下的IP为proxy主机的IP,测试是否可以直接通过该ip连接
mysql -h 192.168.1.119 -uroot -proot
读写分离测试
测试方式:
关闭主从复制,然后多建立几个连接,一个写,其他的读,可以看到读到的内容和写的内容是不一致的时候就说明读写分离测试成功了。
总结
读写分离存在的弊端
因为架构是主从架构,那么久无法保证主备数据库没有延迟,如果有大批量的数据操作的话,那么备库可能出现较大的延迟,那么这时候的读操作就可能出现数据和主库不一致的情况。