mysql通过mysql-proxy实现读写分离
实验环境
此实验基于半同步复制
前面做了主从复制,
#注意: 如果server3之前做过mysql(要将server3上的mysql停掉)
systemctl stop mysqld #mysql-proxy使用的也是3306端口(会和mysql冲突)
mysql读写分离的应用场景
主库可以写,从库只能读,
主库不能同步从库的数据,
所以如果在从库上写的话数据就乱了,
我们需要让客户知道哪个是写(主库),哪个是读(从库)
我们肯定不能让用户知道我们的IP,
我们需要一个中间件,这个中间件知道去那里写去哪里读,
就想我们之前做反向代理额haproxy和nginx,
这个代理知道哪个是读哪个是写,
我们要给主从复制来一个读写分离,
所以要让server3一个proxy
实现mysql读写分离的软件很多,有Mycat,Amoeba,mysql-proxy
Mycat,Amoeba这两个软件了解一下,面试可能会问
自己也可以学习一下
关闭mysql-proxy:
killall -9 mysql-proxy (killall命令需要安装psmisc.x86_64 0:22.20-11.el7)
yum whatprovides */killall
安装mysql读写分离使用的包
tar zxf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz -C /usr/local/
cd /usr/local/mysql-proxy/bin
./mysql-proxy --help
配置mysql-proxy
在/user/local/mysql-proxy中手动加一个目录
[mysql-proxy]
proxy-address=0.0.0.0:3306 #proxy的地址就是本机,全0表示本机,全1是广播地址
proxy-backend-addresses=172.25.21.1:3306 #后端mysql写的主机
proxy-read-only-backend-addresses=172.25.21.2:3306 #mysql的从服务器
proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
#lua脚本
pid-file=/usr/local/mysql-proxy/log/mysql-proxy.pid #定义PID文件位置
plugins=proxy #插件是proxy
log-file=/usr/local/mysql-proxy/log/mysql-proxy.log #定义日志文件位置
log-level=debug #日志级别是调试
keepalive=true #一直可用
daemon=true
建立log日志
我们要自己去建立log日志的目录(本身是没有这个目录的)
mkdir /usr/local/mysql-proxy/log
查看一下lua脚本并且修改
find / -name rw-splitting.lua
然后我们进到这个目录下,改一下这个lua脚本中的一些配置
为了更方便我们测试,我们将最小连接数改为1,将最大连接数改为2
min_idle_connections = 1,
max_idle_connections = 2,
#连接数在1和2之间时启动读写分离(包含1,2)
给减小mysql-proxy.conf权限,启动 mysql-proxy
然后这时启动mysql-proxy
权限太大,所以mysql-proxy启动报错
/usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/mysql-proxy.conf
我们给mysql-proxy.conf文件减小权限
chmod 600 /usr/local/mysql-proxy/conf/mysql-proxy.conf
然后再次启动mysql-proxy
检查mysql-proxy日志看节点是否添加成功
然后我们查看mysql-proxy的日志
cat /usr/local/mysql-proxy/log/mysql-proxy.log
检查我们的节点有没有加进来
可以看到我们的主从mysql都加进到proxy中了
授权用户进行测试
这时在server1上授权一个新的用户来进行读写
grant insert,update,select on . to kuankuan@’%’ identified by ‘Westos.789’;
然后我们去真机上去访问,
真机没有安装mysql,如果没有,我们真机就安装mariadb
然后连接server3
使用真机查看server3,我们可以使用lsof服务,
yum whatprovides */lsof
yum install -y lsof-4.87-4.el7.x86_64
lsof命令可以监控端口
lsof -i:3306
可以看到proxy把请求转到server1上去了
我们在打开一个shell窗口,使用真机继续访问:
我们一共打开了三个真机窗口
使用相同的命令访问代理
只要看到server2出现,就说明我们的mysql已经开启读写分离了
说明kuankuan这个用户使用mysql时是读写分离的
我们使用第一个连接server1的窗口:
发现我们可以进行读和写操作
在server1:
在server2:
因为我们做了主从复制,所以这里会将数据复制过来
然后我们在server2上直接关掉slave
Server2:
再在真机的第一个窗口插入一个数据(命令会等待一会儿,因为我们之前做了半同步复制)
提示我们提交成功,但是该表里没有我们新加的数据:
然后我们在server1:
关闭从库的slave功能
Server2:
这就证明我们写是写在server1上的写,
我们在真机上可以写,但是我们读不到,
打开从库的slave功能
如果我们打开server的slave后,我们就又可以继续读了,
Server2:
真机:
我们访问的是代理,代理实现了读写分离,
mysql-proxy的端口也是3306,所以代理上不能开mysql
代理上不提供任何数据库服务